create是什么意思,使用create
先来看CreateEx函数:
BOOL CWnd:CreateEx(DWORD dwex style,LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,DWORD dwStyle,
矩形区,CWnd* pParentWnd,UINT nID,
LPVOID lpParam /*=NULL */)
{
返回CreateEx(dwExStyle,lpszClassName,lpszWindowName,dwStyle,
rect.left,rect.top,rect.right - rect.left,rect.bottom - rect.top,
pParentWnd- GetSafeHwnd(),(HMENU)nID,lpParam);
}
BOOL CWnd:CreateEx(DWORD dwex style,LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,DWORD dwStyle,
int x,int y,int nWidth,int nHeight,
HWND hWndParent,HMENU nIDorHMenu,LPVOID lpParam)
{
//允许修改几个常见的创建参数
创建结构化cs;
cs。dwex style=dwex style
cs。lpsz class=lpsz类名;
cs.lpszName=lpszWindowName
cs.style=dwStyle
cs.x=x
cs.y=y
cs.cx=nWidth
cs.cy=nHeight
cs。hwnd parent=hwnd parent
cs。hm enu=nIDorHMenu
cs。h instance=AfxGetInstanceHandle();
cs.lpCreateParams=lpParam
如果(!预创建窗口(计算机科学)
{
post NC destroy();
返回错误的
}
AfxHookWindowCreate(this);
HWND HWND=:CreateWindowEx(cs。dwex样式,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)
{
TRACE1(警告:窗口创建失败:GetLastError返回0x%8.8X/n ,
GetLastError());
}
#endif
如果(!AfxUnhookWindowCreate())
post NC destroy();//如果CreateWindowEx过早失败,则清除
if (hWnd==NULL)
返回错误的
ASSERT(hWnd==m _ hWnd);//应该已经在发送消息挂钩中设置
返回真实的
}
可以看到,这两个重载函数的实现原理是让第一个函数调用了第二个函数。在第二个CreateEx中实际是通过调用Win32 SDK平台的ateWindowEx(CWnd没有此函数)来创建窗口的。
再来看创造函数:
BOOL CWnd:Create(LPCTSTR lpsz类名,
LPCTSTR lpszWindowName,DWORD dwStyle,
康斯特矩形区,
CWnd* pParentWnd,UINT nID,
CCreateContext* pContext)
{
//不能用于桌面或弹出窗口(改用CreateEx)
ASSERT(pParentWnd!=NULL);
ASSERT((dw style WS _ POPUP)==0);
返回CreateEx(0,lpszClassName,lpszWindowName,
dwStyle WS_CHILD,
右侧左侧,右侧顶部,
rect.right - rect.left,rect.bottom - rect.top,
pParentWnd- GetSafeHwnd(),(HMENU)nID,(LP void)p context);
}
注意这两行:
ASSERT(pParentWnd!=NULL);
ASSERT((dw style WS _ POPUP)==0);//该行说明创造函数不允许窗口风格为WS_POPUP
可以看到,在创造函数之中又调用了CreateEx的第二个重载版本。
总结:
归根到底,MFC是通过CreateEx函数调用CreateWindowEx函数来创建窗口的。
注意一点:这个新创建的窗口是如何与我们的窗口对象进行绑定的呢?看第二个CreateEx的返回上面的那一行:
ASSERT(hWnd==m _ hWnd);//应该已经在发送消息挂钩中设置
在这里这只是进行判断。看它的注释://应该已经在发送消息挂钩中设置
奥,它说在
如果(!AfxUnhookWindowCreate())
post NC destroy();//如果CreateWindowEx过早失败,则清除
处设置了m_hWnd的值。