想必大家都有在使用MFC
写完程序之后,想让写的程序在点击最大化或者使用鼠标拖住边框之后,也能让窗口内各个控件大小及其位置的也随之改变。
这里使用的原理就是利用 MoveWindow、SetWindowPos
等函数进行窗口内各个控件大小及位置的改变!
实现过程:
-
新建一个对话框,在界面上布置好自己的控件。
-
为对话框添加"最大化"按钮,对话框的
Maximize Box
属性设置为True
在这里自己可以进行尝试看看效果
-
添加响应
WM_SIZE
消息,进行各个控件位置的调整:
void CMd5encryptionDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
CStatic* pStatic1 = (CStatic*)GetDlgItem(IDC_STATIC1);
CStatic* pStatic2 = (CStatic*)GetDlgItem(IDC_STATIC2);
CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
CEdit *pEdit2 = (CEdit*)GetDlgItem(IDC_EDIT2);
CButton* pButton1 = (CButton*)GetDlgItem(IDC_BUTTON_ENCRYPTION);
CButton* pButton2 = (CButton*)GetDlgItem(IDC_BUTTON_OPEN_HTTP);
if (bStated)
{
//编辑框控件的变化
CRect editRect1, editRect2;
pEdit->GetWindowRect(&editRect1);//获取编辑框的大小 基于的坐标系是 屏幕
// cx是新的宽度,cy是新的高度
pEdit->SetWindowPos(NULL, 0, 0, cx - 200, editRect1.Height(), SWP_NOMOVE | SWP_NOZORDER);
pEdit->GetWindowRect(&editRect2);
int off = editRect2.Width() - editRect1.Width();//编辑框变长了多少
CRect editRect3, editRect4;
pEdit2->GetWindowRect(&editRect3);//获取编辑框的大小 注意:基于的坐标系是屏幕
pEdit2->SetWindowPos(NULL, 0, 0, cx - 200, editRect3.Height(), SWP_NOMOVE | SWP_NOZORDER);
pEdit2->GetWindowRect(&editRect4);
int off2 = editRect4.Width() - editRect3.Width();
//按钮控件的变化
CRect browseRect; //注意:基于的坐标系是客户
pButton1->GetWindowRect(&browseRect);
ScreenToClient(&browseRect);
CRect startRect;
pButton2->GetWindowRect(&startRect);
ScreenToClient(&startRect);
pButton1->SetWindowPos(NULL, browseRect.left + off / 4, browseRect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
pButton2->SetWindowPos(NULL, startRect.left + off * 3 / 4, startRect.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
Invalidate(TRUE);//进行刷新
}
}
- 为了让对话框支持动态拉伸:对话框的
Border
属性设置为:Resizing
- 添加响应
WM_GETMINMAXINFO
消息,控制窗口最大化时的大小
//①在类中声明
bool bStated;
CRect m_WndRect;
//②初始化时获取界面的大小
BOOL CMd5encryptionDlg::OnInitDialog()
{
CDialog::OnInitDialog();
....
GetWindowRect(&m_WndRect);//获取初始化时界面的大小
bStated = TRUE;
....
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
//③手动拖动比初始化界面要小时没有变化,调整最大化时的宽和高
void CMd5encryptionDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
//设置初始化是界面的大小
lpMMI->ptMinTrackSize.x = m_WndRect.Width();
lpMMI->ptMinTrackSize.y = m_WndRect.Height();
int screenWidth = GetSystemMetrics(SM_CXSCREEN);//当前屏幕的宽
int screenHeight = GetSystemMetrics(SM_CYSCREEN);//当前屏幕的高
lpMMI->ptMaxSize.x = screenWidth/2;
lpMMI->ptMaxSize.y = screenHeight/2;
CRect mRect;
GetWindowRect(&mRect);
lpMMI->ptMaxPosition.x = (screenWidth - lpMMI->ptMaxSize.x) / 2;
lpMMI->ptMaxPosition.y = mRect.top;
CDialog::OnGetMinMaxInfo(lpMMI);
}