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);
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值