原理
在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);
}