【框架MFC】限制单文档和多文档窗口范围最小值(设置窗口宽度和高度的下限)

原理

在CWnd类的“CreateEx”函数中使用了“::AfxCtxCreateWindowEx”来设置窗口的属性,在调用“::AfxCtxCreateWindowEx”函数之前,调用了PreCreateWindow函数获取窗口信息,所以重载PreCreateWindow函数,并在中给定“cs.cx、cs.cy”就可以设置窗口宽度和高度的初始化大小。重载OnGetMiniMaxInfo函数,设置窗口可修改大小的最小值。


BOOL CWnd::CreateEx(DWORD dwExStyle,LPCTSTR lpszClassName,
     LPCTSTR lpszWindowName,DWORD dwStyle,
     int x, int y, int nWidth, int nHeight,
     HWND hWndParent,HMENU nIDorHMenu,LPVOID lpParam)
{
     ASSERT(lpszClassName== NULL || AfxIsValidString(lpszClassName) ||
         AfxIsValidAtom(lpszClassName));
     ENSURE_ARG(lpszWindowName== NULL || AfxIsValidString(lpszWindowName));
    
     // allow modification of several common create parameters
     CREATESTRUCT cs;
     cs.dwExStyle = dwExStyle;
     cs.lpszClass = lpszClassName;
     cs.lpszName = lpszWindowName;
     cs.style = dwStyle;
     cs.x = x;
     cs.y = y;
     cs.cx = nWidth;
     cs.cy = nHeight;
     cs.hwndParent =hWndParent;
     cs.hMenu = nIDorHMenu;
     cs.hInstance = AfxGetInstanceHandle();
     cs.lpCreateParams= lpParam;
 
     if (!PreCreateWindow(cs))
     {
         PostNcDestroy();
         return FALSE;
     }
 
     AfxHookWindowCreate(this);
     HWND hWnd = ::AfxCtxCreateWindowEx(cs.dwExStyle, cs.lpszClass,
              cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy,
              cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams);
 
#ifdef _DEBUG
     if (hWnd == NULL)
     {
         TRACE(traceAppMsg,0, "Warning: Window creation failed:GetLastError returns 0x%8.8X\n",
              GetLastError());
     }
#endif
 
     if (!AfxUnhookWindowCreate())
         PostNcDestroy();        // cleanup ifCreateWindowEx fails too soon
 
     if (hWnd == NULL)
         return FALSE;
     ASSERT(hWnd == m_hWnd); // should havebeen set in send msg hook
     return TRUE;
}


代码

class CMainFrame : publicCMDIFrameWnd
{
// 重写
public:
     virtual BOOL PreCreateWindow(CREATESTRUCT&cs);
};
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
     if( !CMDIFrameWnd::PreCreateWindow(cs))
         return FALSE;
     cs.cx = 800;
     cs.cy = 600;
 
     return TRUE;
}
 
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (theApp.m_infoMachine.nMajorType == MajorType_SmartGel)
	{
		lpMMI->ptMinTrackSize.x=WIN_POS_MainFrameMinX_PAD;
		lpMMI->ptMinTrackSize.y=WIN_POS_MainFrameMinY_PAD;
	}
	else
	{
		lpMMI->ptMinTrackSize.x=WIN_POS_MainFrameMinX_PC;
		lpMMI->ptMinTrackSize.y=WIN_POS_MainFrameMinY_PC;
	}

	CMDIFrameWnd::OnGetMinMaxInfo(lpMMI);
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值