工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > 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  下一页

  介绍

  随着使用两个分隔的视图管理文件系统的资源管理器在Windows 95中第一次出现,分隔窗口逐渐成为一种流行的界面元素。MFC也有一个复杂的功能强大的分隔窗口类,但是要掌握它的用法确实有点难,并且它和文档/视图框架联系紧密。在第七章我将介绍WTL的分隔窗口,它比MFC的分隔窗口要简单一些。WTL的分隔窗口没有MFC那么多特性,但是易于使用和扩展。

  本章的例子工程是用WTL重写的ClipSpy,如果你对这个程序不太熟悉,现在可以快速浏览一下本章内容,因为我只是复制了ClipSpy的功能而没用深入的解释它是如何工作的,毕竟这篇文章的重点是分隔窗口,不是剪贴板。

  WTL 的分隔窗口

  头文件atlsplit.h含有所有WTL的分隔窗口类,一共有三个类:CSplitterImpl,CSplitterWindowImpl和CSplitterWindowT,不过你通常只会用到其中的一个。下面将介绍这些类和它们的基本方法。

  相关的类

  CSplitterImpl是一个有两个参数的模板类,一个是窗口界面类的类名,另一个是布尔型变量表示分隔窗口的方向:true表示垂直方向,false表示水平方向。CSplitterImpl类包含了几乎所有分隔窗口的实现代码,它的许多方法是可重载的,重载这些方法可以自己绘制分隔条的外观或者实现其它的效果。CSplitterWindowImpl类是从CWindowImpl和CSplitterImpl两个类派生出来的,但是它的代码不多,有一个空的WM_ERASEBKGND消息处理函数和一个WM_SIZE处理函数用于重新定位分隔窗口。

  最后一个是CSplitterWindowT类,它从CSplitterImpl类派生,它的窗口类名是“WTL_SplitterWindow”。还有两个自定义数据类型通常用来取代上面的三个类:CSplitterWindow用于垂直分隔窗口,CHorSplitterWindow用于水平分隔窗口。

  创建分割窗口

  由于CSplitterWindow是从CWindowImpl类派生的,所以你可以像创建其他子窗口那样创建分隔窗口。分隔窗口将存在于整个主框架窗口的生命周期,应该在CMainFrame类添加一个CSplitterWindow类型的变量。在CMainFrame::OnCreate()函数内,你可以将分隔窗口作为主窗口的子窗口创建,然后将其设置为主窗口的客户区窗口:

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

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

 m_hWndClient = m_wndSplit;
}

  创建分隔窗口之后,你就可以为每个窗格指定窗口或者做其他必要的初始化工作。

  基本方法

bool SetSplitterPos(int xyPos = -1, bool bUpdate = true)
int GetSplitterPos()

  可以调用SetSplitterPos()函数设置分隔条的位置,这个位置表示分割条距离分隔窗口的上边界(水平分隔窗口)或左边界(垂直分隔窗口)有多少个象素点。你可以使用默认值-1将分隔条设置到分隔窗口的中间,使两个窗格大小相同,通常传递true给bUpdate参数表示在移动分隔条之后相应的改变两个窗格的大小。GetSplitterPos()返回当前分隔条的位置,这个位置也是相对于分隔窗口的上边界或左边界。

bool SetSinglePaneMode(int nPane = SPLIT_PANE_NONE)
int GetSinglePaneMode()

  调用SetSinglePaneMode()函数可以改变分隔窗口的模式使单窗格模式还是双窗格模式,在单窗格模式下,只有一个窗格使可见的并且隐藏了分隔条,这和MFC的动态分隔窗口相似(只是没有那个小钳子形状的手柄,它用于重新分隔分隔窗口)。对于nPane参数可用的值是SPLIT_PANE_LEFT,SPLIT_PANE_RIGHT,SPLIT_PANE_TOP,SPLIT_PANE_BOTTOM,和SPLIT_PANE_NONE,前四个指示显示那个窗格(例如,使用SPLIT_PANE_LEFT参数将显示左边的窗格,隐藏右边的窗格),使用SPLIT_PANE_NONE表示两个窗格都显示。GetSinglePaneMode()返回五个SPLIT_PANE_*值中的一个表示当前的模式。

DWORD SetSplitterExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0)
DWORD GetSplitterExtendedStyle()

  分隔窗口有自己的样式用于控制当整个分隔窗口改变大小时如何移动分隔条。有以下几种样式:

  ·SPLIT_PROPORTIONAL: 两个窗格一起改变大小

  ·SPLIT_RIGHTALIGNED: 右边的窗格保持大小不变,只改变左边的窗格大小

  ·SPLIT_BOTTOMALIGNED: 下部的窗格保持大小不变,只改变上边的窗格大小

  如果既没有指定SPLIT_PROPORTIONAL,也没有指定SPLIT_RIGHTALIGNED/SPLIT_BOTTOMALIGNED,则分隔窗口会变成左对齐或上对齐。如果将SPLIT_PROPORTIONAL和SPLIT_RIGHTALIGNED/SPLIT_BOTTOMALIGNED一起使用,则优先选用SPLIT_PROPORTIONAL样式。

  还有一个附加的样式用来控制分隔条是否可以被用户移动:

  ·SPLIT_NONINTERACTIVE:分隔条不能被移动并且不相应鼠标

  扩展样式的默认值是 SPLIT_PROPORTIONAL。

bool SetSplitterPane(int nPane, HWND hWnd, bool bUpdate = true)
void SetSplitterPanes(HWND hWndLeftTop, HWND hWndRightBottom, bool bUpdate = true)
HWND GetSplitterPane(int nPane)

  可以调用SetSplitterPane()为分隔窗口的窗格指派子窗口,nPane是一个SPLIT_PANE_*类型的值,表示设置拿一个窗格。hWnd是子窗口的窗口句柄。你可以使用SetSplitterPane()将一个子窗口同时指定给两个窗格,对于bUpdate参数通常使用默认值,也就是告诉分隔窗口立即调整子窗口的大小以适应窗格的大小。可以调用GetSplitterPane()得到某个窗格的子窗口句柄,如果窗格没有指派子窗口则GetSplitterPane()返回NULL。

bool SetActivePane(int nPane)
int GetActivePane()

  SetActivePane()函数将分隔窗口中的某个子窗口设置为当前焦点窗口,nPane是SPLIT_PANE_*类型的值,表示需要激活哪个窗格,这个函数还可以设置默认的活动窗格(后面介绍)。GetActivePane()函数查看所有拥有焦点的窗口,如果拥有焦点的窗口是窗格或窗格的子窗口就返回一个SPLIT_PANE_*类型的值,表示是哪个窗格。如果当前拥有焦点的窗口不是窗格的子窗口,那么GetActivePane()返回SPLIT_PANE_NONE。

bool ActivateNextPane(bool bNext = true)

  如果分隔窗口是单窗格模式,焦点被设到可见的窗格上,否则的话,ActivateNextPane()函数将调用GetActivePane()查看拥有焦点的窗口。如果一个窗格(或窗格内的子窗口)拥有检点,分隔窗口就将焦点设给另一个窗格,否则ActivateNextPane()将判断bNext的值,如果是true就激活left/top窗格,如果是false则激活right/bottom窗格。

bool SetDefaultActivePane(int nPane)
bool SetDefaultActivePane(HWND hWnd)
int GetDefaultActivePane()

  调用SetDefaultActivePane()函数可以设置默认的活动窗格,它的参数可以是SPLIT_PANE_*类型的值,也可以是窗口的句柄。如果分隔窗口自身得到的焦点,可以通过调用SetFocus()将焦点转移给默认窗格。GetDefaultActivePane()函数返回SPLIT_PANE_*类型的值表示哪个窗格是当前默认的活动窗格。

void GetSystemSettings(bool bUpdate)

  GetSystemSettings()读取系统设置并相应的设置数据成员。分隔窗口在OnCreate()函数中自动调用这个函数,你不需要自己调用这个函数。当然,你的主框架窗口应该响应WM_SETTINGCHANGE并将它传递给分隔窗口, CSplitterWindow在WM_SETTINGCHANGE消息的处理函数中调用GetSystemSettings()。传递true给bUpdate参数,分隔窗口会根据新的设置重画自己。


1 2 3 4 5 6  下一页

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

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

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

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索