MFC实现对话框的最大化功能

想必大家都有在使用MFC写完程序之后,想让写的程序在点击最大化或者使用鼠标拖住边框之后,也能让窗口内各个控件大小及其位置的也随之改变。

这里使用的原理就是利用 MoveWindow、SetWindowPos 等函数进行窗口内各个控件大小及位置的改变!
实现过程:

  1. 新建一个对话框,在界面上布置好自己的控件。

  2. 为对话框添加"最大化"按钮,对话框的Maximize Box属性设置为True

    在这里自己可以进行尝试看看效果

  3. 添加响应 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);//进行刷新}
}
  1. 为了让对话框支持动态拉伸:对话框的 Border 属性设置为:Resizing
  2. 添加响应 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);
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部