您的位置:首页 > 其它

[搬家帖]动态改变对话框中控件的大小

2008-09-20 19:12 399 查看
当对话框大小发生变化时,控件大小也应该随之发生变化,下面介绍如何实现这一功能。

首先创建一个基于对话框的MFC工程,为了让对话框可以通过拖拽边框自由改变大小,需要设置对话框的属性。打开资源视图,在对话框上点右键,选择Properties->Styles->Border,在下拉框中选择Resizing,这样就可以动态改变对话框的大小了。

接下来在对话框上放置一个按钮,我们要实现的功能就是在改变对话框大小时动态改变按钮的大小,使得按钮始终位于对话框的(x轴1/5,y轴1/5)处,并且按钮的宽和高分别为x、y轴的2/5。
有两个函数可以实现这个功能:

(1) MoveWindow():

void MoveWindow(int x,int y,int nWidth,int nHeight);

x, y为控件位置;nWidth、nHeight为控件宽度和高度

(2) SetWindowPos():

BOOL SetWindowPos(const CWnd* pWndInsertAfter,int x,int y,int cx,int cy,UINT nFlags);

第一个参数一般设为NULL;

x、y为控件位置;cx、cy为控件宽度和高度;

nFlags常用取值:

SWP_NOZORDER:忽略第一个参数;

SWP_NOMOVE:忽略x、y,维持位置不变;

SWP_NOSIZE:忽略cx、cy,维持大小不变;

SWP_SHOWWINDOW:显示窗口

下面分别介绍如何使用这两个函数:

首先同时按下Ctrl+W,弹出类向导对话框,选择响应WM_SIZE消息。在消息响应函数OnSize()中添加如下代码:

void COnSizeTestDlg::OnSize(UINT nType, int cx, int cy)

{

CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here

//创建对话框时,控件还没有创建,因此不能改变其大小(必须加上这两行代码)

if(!IsWindowVisible())

return;

//获取客户区矩形

CRect rect;

GetClientRect(&rect);

//动态改变控件大小

CWnd *pButton = GetDlgItem(IDC_BUTTON1);

pButton->MoveWindow(

rect.right/5, //x轴1/5处

rect.bottom/5, //y轴1/5处

rect.right/5*2, //x轴的2/5宽度

rect.bottom/5*2 //y轴的2/5高度

);

}

把MoveWindow()函数换成SetWindowPos():

pButton->SetWindowPos(

NULL,

rect.right/5,

rect.bottom/5,

rect.right/5*2,

rect.bottom/5*2,

SWP_NOZORDER|SWP_SHOWWINDOW

);

效果一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: