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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。