窗口类的诞生(注册自己的窗口类)2

2016-02-19 14:25 25 1 收藏

下面图老师小编跟大家分享一个简单易学的窗口类的诞生(注册自己的窗口类)2教程,get新技能是需要行动的,喜欢的朋友赶紧收藏起来学习下吧!

【 tulaoshi.com - 编程语言 】

    我们现在再来看看AfxDeferRegisterClass是什么样子的:

  #define AfxDeferRegisterClass(fClass)

  ((afxRegisteredClasses & fClass) ? TRUE:AfxEndDeferRegisterClass(fClass)
 
  #define afxRegisteredClasses AfxGetModuleState()-m_fRegisteredClasses

  BOOL AFXAPI AfxEndDeferRegisterClass(short fClass)

  {

  WNDCLASS wndCls;

  wndCls.lpfnWndProc = DefWindowProc;

  if(fClass & AFX_WND_REG)

  {

  wndCls.lpszClassName=_afxWnd;

  AfxRegisterClass(&wndCls);

  }else if(fClass & AFX_WNDOLECONTROL_REG)
 
  {

  wndCls.lpszClassName=_afxWndOleControl;

  AfxRegisterClass(&wndCls);

  }else if(fClass & AFX_WNDCONTROLBAR_REG)

{

  wndCls.lpszClassName=_afxWndControlBar;

  AfxRegisterClass(&wndCls);

  }else if(fClass & AFX_WNDMDIFRAME_REG)

  {

  RegisterWithIcon(&wndCls,_afxWndMDIFrame,AFX_IDI_MDIFRAME);

  }else if(fClass & AFX_WNDFRAMEORVIEW_REG)

  {

  RegisterWithIcon(&wndCls,_afxWndFrameOrView,AFX_IDI_STD_FRAME);

  }else if(fClass & AFX_WNDCOMMCTLS_REG)

  {

  InitCommonControls();

  }

  }

  从上面的代码可以看出,AfxDeferRegisterClass函数首先判断该窗口类是否注册,如已注册则直接返回,否则调用AfxEndDeferRegisterClass进行注册,即注册要求的默认窗口类。其中RegisterWithIcon和InitCommonControls最终也是转化为调用AfxRegisterClass,而AfxRegisterClass函数调用RegisterClass进行注册,啊,终于看到SDK中的RegisterClass了,看到它总有一种亲切感!

  有了上面的知识,我们就可以很容易摸清MFC是怎样注册窗口类的了!我们知道Windows上所有看得见的东西,在MFC中都是继承于CWnd类的,而CWnd类创建窗口的成员函数是Create和CreateEx,由于Create最终是调用CreateEx,所以我们只需要看CreateEx函数就行了:

BOOL CWnd::CreateEx(DWORD dwExStyle, LPCSTSTR lpszClassName,

  …… LPVOID lpParam)

  {
 
  CREATESTRUCT cs;

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  cs.dwExStyle = dwExStyle;

  … …

  cs.lpCreateParams = lpParam;

  PreCreateWindow(cs);

  AfxHookWindowCreate(this);

  HWND hWnd=::CreateWindowEx(cs.dwStyle,cs.lpszClass,…,cs.lpCreateParams);

  ……

  }

  啊,一看到CreateWindowEx,亲切感又来了,这不是和SDK中的CreateWindow一样嘛,是创建窗口!既然这样,那么注册窗口肯定在该函数之前,会是谁呢?如果你做过一点MFC程序,你就会对将眼光停留PreCreateWindow上。对!就是它了。

  PreCreateWindow函数是CWnd类的一个虚拟函数,提供程序设置待创建窗口的属性(包括窗口类),这样继承于CWnd的类都可以按照自己的要求在PreCreateWindow中设置自己的属性了,而且我们看到MFC也是这样做的:

  BOOL CWnd::PreCreateWindow(CREATESTRUCT &cs)

  {

  if(cs.lpszClass = = NULL)
  {

  AfxDeferRegisterClass(AFX_WND_REG);

  cs.lpszClass = _afxWnd;

  }

  return TRUE;

  }

  BOOL CFrameWnd::PreCreateWindow(CREATESTRUCT &cs)

  {

  if(cs.lpszClass = = NULL)

  {

  AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG);

  cs.lpszClass = _afxWndFrameOrView;

  }

  return TRUE;

  }

  BOOL CMDIFrameWnd::PreCreateWindow(CREATESTRUCT &cs)

  {

  if(cs.lpszClass = = NULL)
{

  AfxDeferRegisterClass(AFX_WNDMDIFRAME_REG);

  cs.lpszClass = _afxWndMDIFrame;

  }

  }

  BOOL CMDIChildWnd::PreCreateWindow(CREATESTRUCT &cs)

  {

  return CFrameWnd::PreCreateWindow(cs);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  }

  BOOL CView::PreCreateWindow(CREATESTRUCT &cs)

  {

  if(cs.lpszClass = = NULL)

  {

  AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG);

  cs.lpszClass = _afxWndFrameOrView;

  }
 
  }

  就是通过继承的方法,MFC实现常用类的窗口注册(代码并不完全,是从MFC中抽取对我们有意义的一部分代码)。

  四.在MFC中注册自己的窗口类

  在MFC中创建一个窗口,就必须是继承于CWnd类的,这样你的CMyWnd类自然就有了PreCreateWindow方法。你想注册有自己个性的窗口类,那么就在该函数中进行吧。也就是在PreCreateWindow函数中注册自己的窗口类,然后将窗口类的类名以及待创建窗口的其它属性(见CREATESTRUCT结构)填写cs,然后返回系统,供系统创建你的窗口。

来源:http://www.tulaoshi.com/n/20160219/1606939.html

延伸阅读
扩展COleDropTarget类来支持任意窗口拖放 作者:沈阳市热电厂汽机分场 - 王加宝   本文详细论述了拖放的基本原理并提供一个支持窗口拖放的普遍类COleDropTargetEx,任何需要提供拖放的窗口包含此类后,将响应拖放消息函数加入,便可接收拖放。此类利用Windows消息来支持拖放,机制不同于COleDropTarget类与CView类那...
标签: Web开发
$("#父窗口元素ID",window.parent.document)...就行了 js 版本 view sourceprint?1.window.parent.document.getElementById()
在VCL中包含有一个TList类,几乎可以实现链表所有功能,Delphi的工程师真是伟大。但是在实际应用中需要TTree类,来实现树的功能,我写了两个类TyuTree,TYuNode。可以方便实现,树创建,结点增删、移动功能。请大家指教。代码实例:Procedure Test();Var YuTree: TyuTree;Node: TYuNode;Begin    //第1步:创建树、增加第一个结点0Yu...
《巫师2刺客之王》窗口化的方法  很简单 -windowed 在游戏快捷方式(不是launcher)的目标一栏末尾加上即可 《巫师2:刺客之王》第三章易遗漏之处 松鼠党路线剧情简介: 神秘的LODGE会终于浮出水面,其假借法师公会之名在鲁克.穆宁召开北国峰会,名义上是重新规范公会组织,并由各国挑选各自的参政法师,实际上就是利用北方各国局势不...
标签: Web开发
XMD类,非常好用。 先准备下一个qq.xml(我教学用到的1个例子) QQ  我的好友  sonygod  主要资料 帐号="54022626" 昵称="rockVsTone" 备注="sonygod" 年龄="25" 性别="男" 国家地区="中华人民共和国" 州省="广东省" 城市="广州" 个性签名="五一,远方的人你是否归来?"/  详细资料 生肖="狗" 职业="计算机业" 星座=...

经验教程

626

收藏

20
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部