少莫千华

入网以博客,存世之芳泽

【框架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);
}



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenlu5201314/article/details/52352115
个人分类: 框架-MFC
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭