27上位机VC MFC限制对话框窗口大小
27上位机VC MFC限制对话框窗口大小
功能展示 在我们上位程序开发时,时常需要限制某一对话框的大小,满足程序功能的要求,让其只能在指定范围内调整大小。 我们当前程序就实现了这一功能,让程序只能在指定大小内调整,效果如图
要点提示 当对话框大小及位置发生变化时,会发送消息WM_SIZE、WM_SIZING、WM_GETMINMAXINFO;分别对应相应的处理函数:OnSize、OnSizing、OnGetMinMaxInfo。当窗口大小发生变化时,依次响应WM_GETMINMAXINFO-->WM_SIZING-->WM_SIZE。 OnGetMinMaxInfo 这个函数在窗口初始化的时候会被调用一次,当窗口大小发生改变的时候也会被调用。利用这个函数,可以比较方便的实现窗口最大最小尺寸的控制。 参数lpMMI是一个结构体指针,其中包含了有关窗口的最大化最小化的信息。 void CXXXDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) { lpMMI->ptMinTrackSize.x = 500; //x宽度 lpMMI->ptMinTrackSize.y = 100; //y高度 CDialog::OnGetMinMaxInfo(lpMMI); OnSizing 这个函数在窗口大小发生变化时被调用,如鼠标在拖拽窗口大小时,实时调用此函数。在这个函数里,也可以控制窗口的最大最小尺寸,但是没有OnGetMinMaxInfo方便。 OnSize 这个函数会在窗口大小改变结束后被调用,通常会在这个函数里重新摆放各个控件的位置及大小。用这个函数暂时没有找到什么办法可以控制窗口的最大最小大小。
实现功能 1.新建一个对话框应用程序 2.根据自己需要插入位图当作程序背景图 3.添加地变量CSize m_size;用作设置窗口的大小; 4.在对话框初始化时,对窗口大小作一个初始化 m_size.cx=650; m_size.cy=440; ModifyStyle(WS_MAXIMIZEBOX,0,0);//去除最大化按钮 //窗口居中; SetWindowPos(&wndTop,(GetSystemMetrics(SM_CXSCREEN)-m_size.cx)/2, (GetSystemMetrics(SM_CYSCREEN)-m_size.cy)/2,m_size.cx,m_size.cy,SWP_NOREDRAW); 5.最后添加OnSizing处理函数,限制窗口的最大值 void CGkbc8Dlg::OnSizing(UINT fwSide, LPRECT pRect) { CDialog::OnSizing(fwSide, pRect); switch(fwSide) { case 1://左边 if((pRect->right-pRect->left)>m_size.cx) pRect->left=pRect->right-m_size.cx; break; case 2://右边 if((pRect->right-pRect->left)>m_size.cx) pRect->right=pRect->left+m_size.cx; break; case 3://上边 if((pRect->bottom-pRect->top)>m_size.cy) pRect->top=pRect->bottom-m_size.cy; break; case 4: //左上角 if((pRect->bottom-pRect->top)>m_size.cy) pRect->top=pRect->bottom-m_size.cy; if((pRect->right-pRect->left)>m_size.cx) pRect->left=pRect->right-m_size.cx; break; case 5://右上角拖动 if((pRect->bottom-pRect->top)>m_size.cy) pRect->top=pRect->bottom-m_size.cy; if((pRect->right-pRect->left)>m_size.cx) pRect->right=pRect->left+m_size.cx; break; case 6://下边 if((pRect->bottom-pRect->top)>m_size.cy) pRect->bottom=pRect->top+m_size.cy; break; case 7://左下角 if((pRect->right-pRect->left)>m_size.cx) pRect->left=pRect->right-m_size.cx; if((pRect->bottom-pRect->top)>m_size.cy) pRect->bottom=pRect->top+m_size.cy; break; case 8://右下角 if((pRect->right-pRect->left)>m_size.cx) pRect->right=pRect->left+m_size.cx; if((pRect->bottom-pRect->top)>m_size.cy) pRect->bottom=pRect->top+m_size.cy; break; } }
下面演示整个功能实现过程
|