通常设置对话框以及对话框上的各种控件的位置,可以直接在资源对话框那里进行手动来调整。 但这样做往往导致调整不精确,不能够很好的进行界面布局,对齐方式也不是很好。 同时对话框上的各控件资源可能会在放大、缩小、隐藏对话框的时候,控件资源隐藏了部分,或者全部都隐藏了。 对这种问题的解决方式就是在WM_SIZE消息处理函数中,通过编写代码的方式对各个控件进行调整。
用来调整对话框以及各个控件位置的函数就是:MoveWindow, 该函数原型如下:
void MoveWindow(int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE);
通过设置控件和对话框的的起始坐标x,y, 以及它的宽和高就指定了控件在对话框上的显示位置了。最后一个参数为默认参数,可以不管他。
下面是一个例子: 通过在WM_SIZE消息处理函数Onsize中设置 “打开”, “关闭” 按钮, 以及“文本框” 在对话框上的位置。
void CWindowSizeDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: Add your message handler code here CRect rtClient; GetClientRect(&rtClient); //表示一个间隔,可以任意设置 int nVal = 50; //按钮宽高 int nBtnWidth = 40; int nBtnHigh = 30; //文本框宽高 int nEditWidth = 200; int nEditHigh = 30; //打开按钮位置 if( m_BtnOpen.GetSafeHwnd() ) { m_BtnOpen.MoveWindow(rtClient.left + nVal, rtClient.top + nVal, nBtnWidth, nBtnHigh); } //关闭按钮位置 if( m_BtnClose.GetSafeHwnd() ) { m_BtnClose.MoveWindow(rtClient.left + nVal + nBtnWidth + 100, rtClient.top + nVal, nBtnWidth, nBtnHigh); } //文本框按钮位置 if( m_Edit.GetSafeHwnd() ) { m_Edit.MoveWindow( rtClient.left + nVal, rtClient.top + nVal + 100, nEditWidth, nEditHigh); } }
程序运行结果如下: