工控编程吧
标题:
27上位机VC MFC限制对话框窗口大小
[打印本页]
作者:
qq263946146
时间:
2015-11-17 20:38
标题:
27上位机VC MFC限制对话框窗口大小
(, 下载次数: 2)
上传
点击文件名下载附件
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;
}
}
下面演示整个功能实现过程
[iqiyi]http://player.video.qiyi.com/fb283bfa46f2d7922434b9f803ee22bd/0/0/w_19rt9njug5.swf-albumId=4902915209-tvId=4902915209-isPurchase=0-cnId=12[/iqiyi]
源码及视频下载
(仅在电脑可见)
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4