工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
MFC程序员的WTL指南之分隔窗口
[文章信息]
作者:LITHE
时间:2005-03-08
出处:BLOG
责任编辑:方舟
[文章导读]
随着使用两个分隔的视图管理文件系统的资源管理器在Windows 95中第一次出现
advertisement
专题教程宝典
【软件应用】
【办公软件】
【图形图像】
【网页制作】
【操作系统】
【网络安全】
【程序开发】
【日报周刊】
【多媒体教程】
· 天极软件应用多媒体教程
· 软件盗版与反盗版之战
· 图解PS按比例自动批量裁剪照片
· Windows开机关机故障分析及排除
· Visual FoxPro9.0构建管理系统图解
· 体验面对面的网络视频通讯
· 对付网页恶意代码
· Word动画教程:表格操作全接触
· JBuilder 2005开发Applet游戏全接触
· WinRAR操作技巧与另类应用
[正文]

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

  创建一个窗格内的窗口

  既然已经有了分隔窗口和子窗口的成员变量,填充分隔窗口就是一件简单的事情了。先创建分隔窗口,然后创建两个子窗口,使用分隔窗口作为它们的父窗口:

LRESULT CMainFrame::OnCreate ( LPCREATESTRUCT lpcs )
{
 //...
 // Create the splitter window
 const DWORD dwSplitStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,dwSplitExStyle = WS_EX_CLIENTEDGE;

 m_wndVertSplit.Create ( *this, rcDefault, NULL,dwSplitStyle, dwSplitExStyle );

 // Create the left pane (list of clip formats)
 m_wndFormatList.Create ( m_wndVertSplit, rcDefault );

 // Create the right pane (rich edit ctrl)
 const DWORD dwRichEditStyle =
  WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
  ES_READONLY | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE;

 m_wndDataViewer.Create ( m_wndVertSplit, rcDefault,NULL, dwRichEditStyle );
 m_wndDataViewer.SetFont ( AtlGetStockFont(ANSI_FIXED_FONT) );


 // Set the splitter as the client area window, and resize
 // the splitter to match the frame size.
 m_hWndClient = m_wndVertSplit;
 UpdateLayout();

 m_wndVertSplit.SetSplitterPos ( 200 );

 return 0;
}

  注意两个类的Create()函数都用m_wndVertSplit作为父窗口,RECT参数无关紧要,因为分隔窗口会重新调整它们的大小,所以可以使用CWindow::rcDefault。

  最后就是将窗口的句柄传递给分隔窗口的窗格,这一步也需要在UpdateLayout()调用之前完成,这样最终所有的窗口都有正确的大小。

LRESULT CMainFrame::OnCreate ( LPCREATESTRUCT lpcs )
{
 //...
 m_wndDataViewer.SetFont ( AtlGetStockFont(ANSI_FIXED_FONT) );

 // Set up the splitter panes
 m_wndVertSplit.SetSplitterPanes ( m_wndFormatList, m_wndDataViewer );


 // Set the splitter as the client area window, and resize
 // the splitter to match the frame size.
 m_hWndClient = m_wndVertSplit;
 UpdateLayout();

 m_wndVertSplit.SetSplitterPos ( 200 );

 return 0;
}

  现在,list控件上增加了几栏,结果看起来是这个样子:


  需要注意的是分隔窗口对放进窗格的窗口类型没有限制,不像MFC那样必须是CView的派生类。窗格窗口只要有WS_CHILD样式就行了,没有任何其他限制。

  消息处理

  由于在主框架窗口和我们的窗格窗口之间加了一个分隔窗口,你可能想知道现在通知消息是如何工作的,比如,主框架窗口是如何收到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窗口和主框架窗口之间的这些消息传递并不影响分隔窗口的工作,这使得在程序中添加和移除分隔窗口非常容易,因为子窗口不需要做任何改变就可以继续工作。


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

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 制作一个基于MFC对话框的OpenGL类
  • MFC六大关键技术之运行时类型识别
  • 轻松实现Visual C++源代码规范整理
  • 用Visual C++实现CPU特权指令操作
  • VC下用串口与电台通信需注意的问题
  • 盛大董事长陈天桥:参股新浪只是一个开始
  • 6C联盟降低DVD收费标准 国内厂商持观望态度
  • 熊猫易美崩盘后无人打理 贴牌模式弊端显现
  • 盛大新浪遭口水突袭 分析称有背后集团操纵
  • 百度发布首款可检索中英文双语硬盘搜索软件
  • 电脑报:涉嫌赌博 盛大“劫天牢”调查
  • 英特尔日本“回扣风波”未了 又遭欧盟调查
  • 黄宏生建议国家投1500亿美元搞10年科技会战
  • Advertisement