WEB开发网
开发学院软件开发VC MFC程序员WTL指南(8)分隔窗口 阅读

MFC程序员WTL指南(8)分隔窗口

 2008-01-19 20:26:47 来源:WEB开发网   
核心提示:消息处理由于在主框架窗口和我们的窗格窗口之间加了一个分隔窗口,你可能想知道现在通知消息是如何工作的,MFC程序员WTL指南(8)分隔窗口(5),比如,主框架窗口是如何收到NM_CUSTOMDRAW通知消息并将它反射给list控件的?答案就在CSplitterWindowImpl的消息链中:BEGIN_MSG_MAP(t

消息处理

由于在主框架窗口和我们的窗格窗口之间加了一个分隔窗口,你可能想知道现在通知消息是如何工作的,比如,主框架窗口是如何收到NM_CUSTOMDRAW通知消息并将它反射给list控件的?答案就在CSplitterWindowImpl的消息链中:

BEGIN_MSG_MAP(thisClass)
   MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
   MESSAGE_HANDLER(WM_SIZE, OnSize)
   CHAIN_MSG_MAP(baseClass)
   FORWARD_NOTIFICATIONS()
  END_MSG_MAP()

最后的哪个FORWARD_NOTIFICATIONS()宏最重要,回忆一下第四章,有一些通知消息总是被发送的子窗口的父窗口,FORWARD_NOTIFICATIONS()就是做了这些工作,它将这些消息转发给分隔窗口的父窗口。也就是说,当list窗口发送一个WM_NOTIFY消息给分隔窗口时(它是list的父窗口),分隔窗口就将这个WM_NOTIFY消息转发给主框架窗口(它是分隔窗口的父窗口)。当主框架窗口反射回消息时会将消息反射给WM_NOTIFY消息的最初发送者,也就是list窗口,所以分隔窗口并没有参与消息反射。

在list窗口和主框架窗口之间的这些消息传递并不影响分隔窗口的工作,这使得在程序中添加和移除分隔窗口非常容易,因为子窗口不需要做任何改变就可以继续工作。

窗格容器

WTL还有一个被称为窗格容器的构件,它就像Explorer中左边的窗格那样,顶部有一个可以显示文字的区域,还有一个可选择是否显示的Close按钮:

就像分隔窗口管理两个窗格窗口一样,这个窗格容器也管理一个子窗口,当容器窗口的大小改变时,子窗口也相应的改变大小以便能够填充容器窗口的内部空间。

相关的类

这个窗格容器的实现需要两个类:CPaneContainerImpl和CPaneContainer,它们都在atlctrlx.h中声明。CPaneContainerImpl是一个CWindowImpl派生类,它含有窗格容器的完整实现,CPaneContainer只是提供了一个类名,除非重载CPaneContainerImpl的方法或改变容器的外观,一般使用CPaneContainer就够了。

基本方法

HWND Create(
   HWND hWndParent, LPCTSTR lpstrTitle = NULL,
   DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
   DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL)
HWND Create(
   HWND hWndParent, UINT uTitleID,
   DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
   DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL)

创建一个CPaneContainer窗口和创建其它子窗口一样。有两个Create()函数,它们的区别仅仅是第二个参数不同。第一个函数需要传递一个字符串作为容器顶部区域显示的文字,第二个参数需要需要传一个字符串的资源ID,其他参数只要使用默认值就行了。

DWORD SetPaneContainerExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
DWORD GetPaneContainerExtendedStyle()

CPaneContainer还有一些扩展样式用来控制容器窗口上Close按钮的布局方式:

  • PANECNT_NOCLOSEBUTTON:使用样式去掉顶部的Close按钮。
  • PANECNT_VERTICAL:设置这个样式后,顶部的文字区域将沿着容器窗口的左边界垂直放置。

扩展样式的默认值是0,表示容器窗口是水平放置的,还有一个Close按钮。

HWND SetClient(HWND hWndClient)
HWND GetClient()

调用SetClient()可以将一个子窗口指派给窗格容器,这和调用CSplitterWindow类的SetSplitterPane()方法作用类似。SetClient()同时返回原来的客户区窗口句柄而调用GetClient()则可以得到当前的客户区窗口句柄。

BOOL SetTitle(LPCTSTR lpstrTitle)
BOOL GetTitle(LPTSTR lpstrTitle, int cchLength)
int GetTitleLength()

调用SetTitle()可以改变容器窗口顶部显示的文字,调用GetTitle()可以得到当前窗口顶部区域显示的文字,调用GetTitleLength()可以得到当前显示的文字的字符个数(不包括结尾的空字符)。

BOOL EnableCloseButton(BOOL bEnable)

如果窗格容器使用的Close按钮,你可以调用EnableCloseButton()来控制这个按钮的状态。

上一页  1 2 3 4 5 6 7  下一页

Tags:MFC 程序员 WTL

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