c控件随窗口大小变化,

  c控件随窗口大小变化,

  用VC开发应用程序时,经常需要制作一些可以改变大小的对话框。此时,要求对话框上的控件随着对话框大小的变化而改变位置和大小。如果控件较少,可以在对话框的OnSize()事件中添加代码,通过计算调整每个控件的位置和大小;但是,如果对话框上有很多控件,那将是一件非常痛苦的事情!如果程序中有很多可以改变大小的对话框,那就一个一个写在OnSize()上,会让程序员崩溃的!

  为了解决这个问题,我写了一个对话框类ClxDialog,它可以自动改变控件的位置和大小。这个类继承的对话框类,只要对OnInitDialog()中的控件做一些简单的设置,对话框上的控件就会随着对话框大小的变化而改变位置和大小。

  为了保存控制信息,我定义了一个结构:

  typedef struct _dlgControlTag

  {

  int iId//控件ID

  int iFlag//标志,指示如何更改控件的位置或大小。

  int iPercent//对话框中已更改值的百分比。

  } DLGCTLINFO,* PDLGCTLINFO

  下面是结构中iFlag和iPercent的一些解释。其中iFlag是以下枚举值:

  列举型别

  {

  MOVEX=0,//控件在X方向(左右)移动

  MOVEY,//控件在Y方向移动(上下)

  MOVEXY,//控件同时在X和Y两个方向移动。

  ELASTICX,//控件在x方向改变大小(宽度)

  弹性,//控件在Y方向改变(高度)来改变大小。

  ELASTICXY //该控件在X和Y方向上改变大小。

  };

  IPercent表示对话框中已更改值的百分比。例如,如果一个控件的iPercent值为100,iFlag值为MOVEX,那么当对话框的宽度变化100个单位时,控件将在X方向移动100个单位;再比如,如果一个控件的iPercent值为100,iFlag值为ELASTICXY,那么当对话框的宽度和高度分别变化100个单位时,控件的高度和宽度也会相应变化100个单位。

  以下是设置控制信息的功能:

  BOOL SetControlProperty(PDLGCTLINFO LP,int nElements);

  用起来很简单。只需在对话框的OnInitDialog()函数中添加类似如下的代码:

  //控制信息数组

  静态DLGCTLINFO dcMenuGroup[]=

  {

  {IDOK,MOVEX,100},

  {IDCANCEL,MOVEX,100},

  {IDC_BUTTON1,MOVEX,50},

  {IDC_BUTTON1,MOVEY,100},

  {IDC_EDIT1,ELASTICX,100},

  {IDC_EDIT2,ELASTICX,50},

  {IDC_EDIT3,ELASTICX,50},

  {IDC_EDIT3,MOVEX,50},

  {IDC_EDIT4,ELASTICY,100},

  {IDC_EDIT5,ELASTICX,100},

  {IDC_EDIT5,ELASTICY,50},

  {IDC_EDIT6,ELASTICX,100},

  {IDC_EDIT6,ELASTICY,50},

  {IDC_EDIT6,MOVEY,50},

  };

  //设置控制信息

  SetControlProperty(dcMenuGroup,sizeof(dcMenuGroup)/sizeof(DLGCTLINFO));

  下面是使用上述代码的对话框更改大小前后的效果:

  对比两张截图,我们很容易理解上面的代码。

  我还提供了一个函数:

  void ShowSizeIcon(BOOL bShow=TRUE);

  设置是否在对话框的右下角显示表示您可以更改尺寸的图标。该图标是从系统中读取的。我上面的截图是Windows2000下的,在WindowsXP下会自动变成XP风格。

  好了,我们不要说闲话了。以下是对话框类ClxDialog的源代码,并附有详细注释:

  LxDialog.h文件:

  /////////////////////////////////////////////////////////////////////////////////////

  //自动更改控件位置和大小的对话框类

  //文件名:lxDialog.h

  //作者:StarLee(coolstarlee@sohu.com)

  /////////////////////////////////////////////////////////////////////////////////////

  类ClxDialog:公共CDialog

  {

  公共:

  ClxDialog(UINT nID,CWnd * p parent=NULL);

  typedef struct _dlgControlTag

  {

  int iId

  int iFlag

  int iPercent

  } DLGCTLINFO,* PDLGCTLINFO

  列举型别

  {

  MOVEX=0,

  莫威,

  MOVEXY,

  ELASTICX,

  弹性,

  弹性XY

  };

  //设置控制信息

  BOOL SetControlProperty(PDLGCTLINFO LP,int nElements);

  //是否在对话框的右下角显示表示大小可以更改的图标

  参见showsizesi con(bool b show=true);

  受保护:

  虚拟对话框()中的布尔值;

  afx _消息查看OnSize(UINT类型、int cx、int cy):

  S7-1200可编程控制器:

  声明消息映射()

  私人的:

  内部m _ iclientwidth//对话框客户端(客户)区域的宽度

  int m _循环有神论;//对话框客户端(客户)区域的高度

  int m _艾明宽度;//对话框的最小宽度

  int m _艾明高度://对话框的最小高度

  pdlgctlinfo m _ pcocontrol laray//控件信息数组指针

  int m _ icontrolnumber://设置控件信息的控件个数

  bool m _ bshowsizeicon(超光速引擎)://是否显示表示可改变大小的图标

  -=伊甸园美剧http://sfile。ydy。com=-荣誉出品本字幕仅供学习交流,严禁用于商业途径://放图标的静态控件

  //保存图标的点阵图(位图)

  -=ytet-伊甸园字幕组=-翻译:粒粒粒尘紫月猫姐风景校对:

  位图m位图:

  }:

  尺寸对话框cpp。文件:

  我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊

  //自动改变控件位置和大小的对话框类

  //文件名:lxdialog。卡片打印处理机(Card Print Processor的缩写)

  //作者:starlee(酷星lee @ sop Hu。com)

  我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊!我的天啊

  #包括stdafx.h

  #包括lxdialog。h

  //表示可改变大小的图标身份号

  #ifndef OBM_SIZE

  #定义obm _ size 32766

  #endif

  clxddialog:clxddialog(uint NID、cwnd * PPAR/*=null */)

  :cddialog(NID、帕兰特)

  ,m _ iclietwidth(0)

  ,汽车盗窃(0)

  ,m _艾明宽度(0)

  ,m _艾明高度(0)

  ,m _ pcontrolarray(零)

  ,m _图标号(0)

  ,m _ bshowsizecon(true)

  {}

  开始_消息_映射对话方块最大切深对话方块

  ON_WM_SIZE()

  on _ wm _ sizing()

  END_MESSAGE_MAP()

  bool clxddialog:在初始化对话框上()

  {

  CD dialog:ininitdialog();

  //设置对话框为可变大小的

  ModifyStyle(0,ws _ sizebox):

  //以对话框的初始大小作为对话框的宽度和高度的最小值

  直线裂纹;

  getwindowrect(直接DLG);

  m _艾明宽度=直线宽度。宽度();

  m _艾明高度=直线引线身高();

  //得到对话框客户端(客户)区域的大小

  直线客户增长;

  获取链接trect(直接客户端):

  m _ iclientwidth=直线用户端。宽度();

  S7-1200可编程控制器身高();

  //加载图标

  m _ bmpsizeicon(电影名)。加载oembitmap(obm _ size);

  m _ bmpsizeicon(电影名)。GetBitmap( m_bitmap):

  //创建显示图标的静态控件并放在对话框右下角

  m _ wndsizeicon(电影名)。Create(NULL,WS_CHILD WS_VISIBLE SS_BITMAP,CRect(0,0,m_bitmap.bmWidth,m_bitmap.bmHeight),此,0);

  m _ wndsizeicon(电影名)。setbitmap(m _ bmpsize con):

  m _ wndsizeicon(电影名)。移动窗口(m _ iclietwidth-m_bitmap.bmWidth、m _ iclietherright-m _ bitmap。bmheight、m _ bitmap。bmwidth、m _ bitmap。BM height);

  //显示图标

  m _ wndsizeicon(电影名)。显示窗口(m _ bshowsizecon):

  返回真实的

  }

  请参阅clxddialog:onsize(uint类型、int cx、int cy)

  {

  cddialog:onsize(类型、cx、cy);

  //对话框宽度和高度的增量

  内部I新月=CX-m _ iclietwidth;

  内部奶油=cy-m _ icliethesis;

  //最小化时增量为0

  如果(类型==尺寸_最小化)

  {

  乳白色=乳白色=0;

  }

  for(int I=0);I _ icon号;参数编号:(一)

  {

  cwnd * pwndctrl=null

  内部iid=m _ pcommorlaray[I].国际空间法研究所;

  int ifag=m _ pcocontrol laray[I].伊法格;

  int ipercent=m _ pcondirlay[I].超光速粒子;

  //无效值

  如果(超高0) (超高100))

  继续进行;

  //得到控件指针

  pwnd ctrl=get LG item(iid);

  如果(零!=pwndctrl)是window(pwndctrl-getsafehwnd()))

  {

  直肠乳沟;

  pwndctrl-getwindowrect(rectang ctrl);

  触摸屏客户端(直接ctrl):

  int ileft=直线ctrl。左;

  int itop=直线ctrl。顶;

  int iWidth=矩形。宽度();

  int iheight=矩形身高();

  交换机(iflag)

  {

  瑞典英泰峡案例方向移动

  I ft=(I新月x * ipercent/100);

  打断;打断;

  案例莫威方向移动

  itop=(I新月* ipercent/100);

  打断;打断;

  移动xy _ x案例方向和然后呢方向同时移动

  I ft=(I新月x * ipercent/100);

  itop=(I新月* ipercent/100);

  打断;打断;

  弹性域:方向改变大小

  iwidth=(I新月x * ipercent/100);

  打断;打断;

  大小写灵活性://y-案例弹性方向改变大小

  I right=(I crescent * ipercent/100);

  打断;打断;

  弹性域XY: //X方向和然后呢方向同时改变大小

  iwidth=(I新月x * ipercent/100);

  I right=(I crescent * ipercent/100);

  打断;打断;

  默认设置:

  ;

  }

  //把控件移动到新位置

  pWndCtrl- MoveWindow(iLeft、iTop、iWidth、I height);

  }

  }

  //把图标移动到对话框右下角

  S7-1200可编程控制器GetSafeHwnd())

  m _ wndsizeicon(电影名)。MoveWindow(cx - m_bitmap.bmWidth、cy - m_bitmap.bmHeight、m_bitmap.bmWidth、m_bitmap。BM height);

  //记录对话框客户端(客户)区域的大小

  如果(类型!=size _最小化)

  {

  m _ iclientwidth=cx

  m _ iclientheight=cy

  }

  }

  参见clxddialog:onsizing(uint nside,LPRECT lpRect)

  {

  cddialog:onsizing(nside,lprect);

  //对话框不能小于初始大小

  int I width=lprect-right-lprect-left;

  int I right=lpRect-自下而上直接-

  if(iwidth=m _艾明宽度)

  直接-右=lpRect-左m _艾明宽度;

  if(I right=m _艾明高度)

  直接-底部=lpRect-顶部m _艾明高度:

  }

  bool clxddialog:设置控件属性(pdlgctlinfo LP,int元素)

  {

  //设置控件数组信息

  if (NULL==lp)

  返回错误的

  如果(成员=0)

  返回错误的

  m _ pcontrolarray=lp

  m _ icontrolnumber=项目:

  返回真实的

  }

  请参阅clxddialog:show sizeof(bool bshow/*=null */

  {

  m _ bshowsizeicon=bshow

  }

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: