1. CWnd::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 parametersCREATESTRUCT 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 _DEBUGif (hWnd == NULL){TRACE1("Warning: Window creation failed: GetLastError returns 0x%8.8X/n",GetLastError());}
#endifif (!AfxUnhookWindowCreate())PostNcDestroy();        // cleanup if CreateWindowEx fails too soonif (hWnd == NULL)return FALSE;ASSERT(hWnd == m_hWnd); // should have been set in send msg hookreturn TRUE;
}

说明:可以看到,这两个重载函数的实现原理是让第一个函数调用了第二个函数。

在第二个CreateEx中实际是通过调用Win32 SDK平台的ateWindowEx(CWnd没有此函数)来创建窗口的。

2. 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的值。

参考来源:http://www.cnblogs.com/lidabo/archive/2012/07/04/2576832.html                  博主:SurpassLi

CWnd::Create和CWnd::CreateEx 区别相关推荐

  1. create与oncreate的区别

    OnCreate 在view类中,create 是虚函数由框架调用,是用来"生成一个窗口的子窗口". oncreate 消息响应函数,是用来"表示一个窗口正在生成&quo ...

  2. 【数据分析师自学系列-MySQL】创建新表create table、create table as、create table like的区别

    [数据分析师自学系列-MySQL]创建新表create table.create table as.create table like的区别 1.create table:基本创建新表方式 格式如下: ...

  3. Object.create()和new object()区别

    Object.create和new object区别 Object.create() proto propertiesObject Object.create(null) Object.create( ...

  4. CWnd::FromHandle与CWnd::FromHandlePermanent有什么区别

    你可以参考 MFC 代码中 FromHandle 和 FromHandlePermanent 的实现,这两个函数都是在公共的 CMapHandle 中查找句柄对应的 CWnd 对象(通过一个CBT钩子 ...

  5. js中的Object.create(null) 和 {} 的区别

    console.log(Object.create(null))console.log({}) 结果图 根据结果我们不难发现,两者最大区别在于Object.create(null)创建的对象没有继承O ...

  6. Create groups 与 Create folder references的区别

             选择了Create groups方式添加了一个文件,我们会发现被添加进来的文件,文件夹是黄色的.    选择了 Create folder references方式添加进来的文件的文 ...

  7. kubernetes kubectl apply -f和kubectl create -f有什么区别

    kubectl create属于Imperative command(祈使式命令),它明确告诉kubectl要创建某个资源或对象: kubectl apply是Declarative command( ...

  8. VC++ 自定义消息学习总结

    VC添加自定义消息 http://blog.csdn.net/jinnee_cumtb/article/details/4524375     VC的ClassWizard不允许增加用户自定义消息,所 ...

  9. 【MFC】Windows窗口样式

    00. 目录 文章目录 00. 目录 01. 框架窗口样式 02. 静态样式 03. 窗口样式 04. 扩展的窗口样式 05. 附录 01. 框架窗口样式 框架窗口样式适用于 CFrameWnd 类 ...

最新文章

  1. (C++)用upper_bound函数取代自己写的二分查找
  2. C# ToString()方法
  3. 超图桌面版区分不同类型数据源的图标
  4. java IO(输入输出) 字符流
  5. 项目使用encode_Spring Cloud Security:Oauth2使用入门
  6. Node.js CLI 工具最佳实践
  7. python用二分法求平方根_Python使用二分法求平方根的简单示例
  8. C#EXCEL 操作类--C#DataToExcel帮助类
  9. 等保数据备份和恢复关键点,这些你该知道!
  10. [JZOJ3293] 【SHTSC2013】阶乘字符串
  11. javaagent的优势
  12. 数学之美系列好文,强烈推荐
  13. git 小乌龟 推送代码到gitee
  14. 海康威视摄像头-chrome谷歌浏览器高版本局域网下海康摄像头web网页实时播放
  15. 如何成为一个优秀的互联网营销人员?(互联网销售/网络营销职位从菜鸟到大神应该学习的内容)
  16. 读完这篇文章,你就是下一个时间管理大师。
  17. oracle 11g sga_target=0,Oracle 11g sga_target 参数设置
  18. 网页设计语言html做思维导图,纯css3实现思维导图样式示例
  19. 什么是CDN?CDN的技术原理是什么?
  20. 大数卢卡斯求组合数板子

热门文章

  1. 我深爱的Java,对不起,我出轨了!!!呸!渣男!
  2. 用心去爱那些爱过我们的人
  3. 分布式、微服务、集群
  4. 2023新年快乐,友盟+伴你岁岁年年
  5. 从零开始写高性能的人脸识别服务器(三)
  6. Java-底层建筑-JVM-第3篇-StringTable
  7. 护理和母乳喂养文胸的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. 接口测试简介及用例设计思路
  9. 阿里云centOS 将不带www的域名301重定向到带www域名
  10. 美丽的诗句 撩妹首选哦!