您现在的位置:计算机技术学习网 > 技术中心 > WEB编程 > ASP >

MFC中自定义窗口类名

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 05:54 点击:

MFC中封装很多常用的控件,把类名也给封装了,没有提供明显的接口出来,用win api写窗口程序,第一步就是注册窗口类

此时类名和标题名是一起注册的,所以能把标题很好地让用户来设定,类名也应该是很简单的,可惜的是MFC没有这样做,原因也许是window name可以不停的改,而类名不能。窗口的类名是有Create来确定的,要在Create前,给窗口选择一个已经注册的窗口类名,作为参数窗口Create就ok了,CWnd的Create最终还是到了CreateEx中来,看看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)(UINT_PTR)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){    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 ",            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;}
可以看到最后到了::AfxCtxCreateWindowEx,可以很容易地知道这里调用了CreateWindowEx来创建一个窗口

 

在前面有一个PreCreateWindow(cs),而cs经过PreCreateWindow处理后,交给::AfxCtxCreateWindowEx处理

::AfxCtxCreateWindowEx在中转给CreateWindowEx,cs.lpszClass就是类名,可以清楚了AfxCtxCreateWindowEx的用心良苦

 


我们可以重载的PreCreateWindow,来修改类名,如下的代码:

 

// TODO: 在此添加专用代码和/或调用基类    //VERIFY(AfxDeferRegisterClass(AFX_WND_REG));    //AfxEndDeferRegisterClass(AFX_WND_REG);    //cs.lpszClass =

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • WAP常见问题问答大全(四)
      • ASP开发必备:WEB打印代码大全
      • ASP调用系统ping命令
      • asp缓存技术
      • ASP教程:第三篇 ASP基础
      • 用ASP+XML打造留言本(4)
      • 关于ASP Recordset 分页出现负数解决方法及建议
      • 用asp怎样编写文档搜索页面(5)
      • ASP处理多关键词查询实例代码
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1