Create和CreateEx
来源:互联网 发布:linux 查看ssh密码 编辑:程序博客网 时间:2024/06/06 01:42
先来看CreateEx函数:
BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID,
LPVOID lpParam /* = NULL */)
{
return 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 dwExStyle, LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
int x, int y, int nWidth, int nHeight,
HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
{
// 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 = ::CreateWindowEx(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)
{
TRACE1("Warning: Window creation failed: GetLastError returns 0x%8.8X/n",
GetLastError());
}
#endif
if (!AfxUnhookWindowCreate())
PostNcDestroy(); // cleanup if CreateWindowEx fails too soon
if (hWnd == NULL)
return FALSE;
ASSERT(hWnd == m_hWnd); // should have been set in send msg hook
return TRUE;
}
可以看到,这两个重载函数的实现原理是让第一个函数调用了第二个函数。在第二个CreateEx中实际是通过调用Win32 SDK平台的ateWindowEx(CWnd没有此函数)来创建窗口的。
再来看Create函数:
BOOL CWnd::Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd, UINT nID,
CCreateContext* pContext)
{
// can't use for desktop or pop-up windows (use CreateEx instead)
ASSERT(pParentWnd != NULL);
ASSERT((dwStyle & WS_POPUP) == 0);
return CreateEx(0, lpszClassName, lpszWindowName,
dwStyle | WS_CHILD,
rect.left, rect.top,
rect.right - rect.left, rect.bottom - rect.top,
pParentWnd->GetSafeHwnd(), (HMENU)nID, (LPVOID)pContext);
}
注意这两行:
ASSERT(pParentWnd != NULL);
ASSERT((dwStyle & WS_POPUP) == 0); // 该行说明Create函数不允许窗口风格为WS_POPUP
可以看到,在Create函数之中又调用了CreateEx的第二个重载版本。
总结:
归根到底,MFC是通过CreateEx函数调用CreateWindowEx函数来创建窗口的。
注意一点:这个新创建的窗口是如何与我们的窗口对象进行绑定的呢?看第二个CreateEx的return上面的那一行:
ASSERT(hWnd == m_hWnd); // should have been set in send msg hook
在这里这只是进行判断。看它的注释:// should have been set in send msg hook
奥,它说在
if (!AfxUnhookWindowCreate())
PostNcDestroy(); // cleanup if CreateWindowEx fails too soon
处设置了m_hWnd的值。
- Create和CreateEx
- CreateEx 和Create的区别
- Create CreateEx
- CWnd::Create和CWnd::CreateEx 区别
- MFC API——》Create 、CreateEx
- CWnd::CreateEx
- kindEditor create和create
- 慎用CMFCToolBar::CreateEx
- CreateEx的用法
- Create()和onCreate()
- 慎用CMFCToolBar::CreateEx(转的)
- CWnd::CreateEX中HOOK函数作用
- Create和OnCreate的关系
- Create 和refresh的差别
- OnCreate函数和Create函数
- MediaPlayer的create()和setdatasource()
- AlertDialog的create和show
- create()方法和add()方法
- linux IDE驱动分析之IDE总线、驱动注册(一)
- 宏定义的妙处
- Windows 2003 IIS下FTP设置方法
- 运行时异常与非运行时异常
- VSFlexGrid控件属性和常用方法(3)
- Create和CreateEx
- 订单单头单身单号增加操作(主从表编号)
- 35岁之前成功的12条黄金法则
- Android自制发送短信程序
- 处理并发性问题的若干种方法
- JavaScript 和 Flash 的通信(经典!)
- linux IDE驱动分析之IDE总线、驱动注册(二)
- 转:基于ubuntu 9.04(32位机)的Android2.2 开发环境的搭建
- AjaxPro实现机制探讨——Ajax是如何调用服务器端C#方法的?