MFC通用控件的初始化

豆豆网   技术应用频道   2008年01月17日    社区交流

内容摘要:介绍了MFC中通用控件初始化过程.

  注意:

  对Windows 95/98/Me来说,dll卸载的时候,在其中注册的所有窗口类会自动取消注册.这是自动进行的,并不需要你写下UnregisterClass的调用代码.

  对Windows NT/2000/XP来说,当dll卸载的时候,在该dll中注册的窗口类并不会自动取消注册,因此必须在DllMain中人为的用代码调用unregisterClass. 否则一旦dll卸载后再次创建控件(因为没有反注册,系统认为窗口类仍有效),则该控件的窗口过程将指向无效的地址.

  MFC中通用控件的初始化

  MFC中采用了延迟加载的办法来初始化通用控件.这样,如果程序不使用任何通用控件,则不会加载comctl32.dll.如果使用了任何通用控件,则会在该控件的PreCreateWindow函数中初始化对应的通用控件.这就是使用depends工具查看一个使用了通用控件的MFC程序,一般都看不到有comctl32.dll存在的原因.这里是说一般,如果在你的代码中直接调用了两个初始化函数之一,就会正常链接到comctl32.dll。

  要在MFC源代码中找到通用控件初始化的地方很简单,只要看看一个使用了通用控件的程序何时加载comctl32.dll就可以了.你可以调试这样一个程序,单步执行或每隔一段代码设置一个断点,然后每次执行后用工具看看exe是否加载了comctl32.dll模块,如此逐步缩小范围,很快就可以找到.查看exe在运行时包含模块的工具很多,比如IceSword或者windows优化大师带的一个进程管理工具都可以.

  以控件syslistview32为例.MFC的包装类是CListView.

BOOL CListView::PreCreateWindow(CREATESTRUCT& cs)
{
  return CCtrlView::PreCreateWindow(cs);
}
BOOL CCtrlView::PreCreateWindow(CREATESTRUCT& cs)
{
  ...
  // initialize common controls
  VERIFY(AfxDeferRegisterClass(AFX_WNDCOMMCTLS_REG));
  AfxDeferRegisterClass(AFX_WNDCOMMCTLSNEW_REG);
  ...
  return CView::PreCreateWindow(cs);
}

  AfxDeferRegisterClass会根据控件的种类不同,设置不同的参数,然后调用_AfxInitCommonControls,比如下面的代码:

来源:vckbase    作者:南风    责编:豆豆技术应用

正在加载评论...