设为首页 加入收藏

TOP

MFC程序员的WTL指南之分隔窗口(四)
2012-11-04 15:05:14 来源: 作者: 【 】 浏览:1991
Tags:MFC 程序员 WTL 指南 分隔 窗口
  窗格容器内的特殊绘制

  CPaneContainer也有几个函数可以重载,用来改变窗格容器的外观。你可以从CPaneContainerImpl派生新类并重载你需要的方法,例如:

class CMyPaneContainer :
public CPaneContainerImpl<CMyPaneContainer>
{
public:
DECLARE_WND_CLASS_EX(_T("My_PaneContainer"), 0, -1)
//... overrides here ...
};

  一些更有意思的方法是:

  ·void CalcSize()

  调用CalcSize()函数只是为了设置m_cxyHeader,这个变量控制着窗格容器的顶部区域的宽度和高度。不过SetPaneContainerExtendedStyle()函数中有一个BUG,导致窗格从水平切换到垂直时没有调用派生类的CalcSize()方法,你可以将CalcSize()调用改为pT->CalcSize()来修补这个BUG。

  ·HFONT GetTitleFont()

  这个方法返回一个HFONT,它被用来画顶部区域的文字,默认的值是调用GetStockObject(DEFAULT_GUI_FONT)得到的字体,也就是MS Sans Serif。如果你想改称更现代的Tahoma字体,你可以重载GetTitleFont()方法,返回你创建的Tahoma字体。

  ·BOOL GetToolTipText(LPNMHDR lpnmh)

  重载这个方法提供鼠标移到Close按钮时弹出的提示信息,这个函数实际上是TTN_GETDISPINFO的相应函数,你可以将lpnmh转换成NMTTDISPINFO*,并设置这个数据结构内相应的成员变量。记住一点,你必须检查通知代码,它可能是TTN_GETDISPINFO或TTN_GETDISPINFOW,你需要有区别的访问这两个数据结构。

  ·void DrawPaneTitle(CDCHandle dc)

  你可以重载这个方法自己画顶部区域,你可以用GetClientRect()和m_cxyHeader来计算顶部区域的范围。下面的例子演示了在水平容器的顶部区域画一个渐变填充的背景:

void CMyPaneContainer::DrawPaneTitle ( CDCHandle dc )
{
RECT rect;

GetClientRect(&rect);

TRIVERTEX tv[] = {
{ rect.left, rect.top, 0xff00 },
{ rect.right, rect.top + m_cxyHeader, 0, 0xff00 }
};
GRADIENT_RECT gr = { 0, 1 };

dc.GradientFill ( tv, 2, &gr, 1, GRADIENT_FILL_RECT_H );
}

  例子工程代码中演示了对这几个方法的重载,使得结果看起来是这个样子的:


  从上面的图中可以看到,这个演示程序有一个Splitters菜单,通过它可以在各种风格的分隔条(包括自画风格)和窗格容器之间切换,比较它们之间的异同。你还可以锁定分隔条的位置,这是通过设置和取消SPLIT_NONINTERACTIVE扩展风格来实现的。

  在状态栏显示进度条

  正如我在前几篇文章中做得保证那样,新的ClipSpy也演示了如何在状态条上创建进展条,它和MFC版本得功能一样,几个相关得步骤是:

  得到状态条第一个窗格得坐标范围RECT

  创建一个进展条作为状态条得子窗口,窗口大小就是哪个状态条窗格得大小随着edit控件被填充的同时更新进展条的位置,这些代码在CMainFrame::CreateProgressCtrlInStatusBar()函数中。
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/11/11
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC程序中实现控件的动态生成与响应 下一篇制作一个基于MFC对话框的OpenGL类

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: