create是什么意思,使用create

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

create是什么意思,使用create