WEB开发网
开发学院软件开发VC MFC通用控件的初始化 阅读

MFC通用控件的初始化

 2008-01-17 21:36:55 来源:WEB开发网   
核心提示: 注意:对Windows 95/98/Me来说,dll卸载的时候,在其中注册的所有窗口类会自动取消注册.这是自动进行的,并不需要你写下UnregisterClass的调用代码.对Windows NT/2000/XP来说,当dll卸载的时候,在该dll中注册的窗口类并不会自动取消注册,因此必须

注意:

对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,比如下面的代码:

上一页  1 2 3 4  下一页

Tags:MFC 通用 控件

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接