科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Visual C++中删除托管对象、包装库及其他

Visual C++中删除托管对象、包装库及其他

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将给大家讲解一下Visual C++中如何删除托管对象、包装库及其他,大家在实际开发中可以做个参考。

作者:Paul DiLascia 来源:msdn中国 2007年11月20日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
 问:在我的应用程序中,我想将选项卡控件的背景颜色从 gray 转换成 white。我试图从 CTabCtrl 派生一个类并使用所有的功能,但没有成功。能告诉我怎么办吗?

  Mayur Patel

  答:更改选项卡控件中选项卡的颜色十分简单,但要将属性表的颜色翻新则需要大量的工作,不下很大决心是做不到的。对于选项卡,基本思想是使控件成为所有者描述的控件,然后处理 WM_DRAWITEM。如果您使用 MFC,则可以重写虚函数 DrawItem。

  在 Microsoft Systems Journal1998 年 3 月发行的那一期中,我介绍了如何实现一个选项卡控件类 — CtabCtrlWithDisable,它支持禁用选项卡。作为禁用选项卡的一部分,当选项卡禁用时,CTabCtrlWithDisable 将选项卡的文本颜色变为浅灰色。本月,我从 CTabCtrlWithDisable 借用了一些代码,实现了一个新的类 — CcolorTablCtrl,它可以使您更改选项卡的颜色(请参见图 5)。

  要使用 CcolorTablCtrl,请在您的属性表中创建一个实例:

以下是引用片段:
  class CMyPropSheet : public CPropertySheet {
  protected:
  CColorTabCtrl m_tabCtrl;
  };

  您必须在属性表的 OnInitDialog 处理程序中子类化选项卡控件(以便 MFC 可以使用它),然后将前景色和背景色设置成您喜欢的任何颜色:

以下是引用片段:
  // in CMyPropSheet::OnInitDialog()
  HWND hWndTab = (HWND)SendMessage(PSM_GETTABCONTROL);
  m_tabCtrl.SubclassDlgItem(::GetDlgCtrlID(hWndTab), this);
  m_tabCtrl.SetColor(WHITE, RED);

  这里的 WHITE 和 RED 是标准的 COLORREF 值,即 RGB(255, 255, 255) 和 RGB(255,0,0)。一旦您实例化并初始化 CcolorTabCtrl,颜色选项卡控件就会完成剩下的工作(请参见图 6)。

颜色选项卡控件

  图 6 颜色选项卡控件

  CColorTabCtrl 重写了 SubclassDlgItem,它调用 ModifyStyle 来将风格更改为TCS_OWNERDRAWFIXED。进行重写的较好位置是在 PreSubclassWindow 中,因为不管控件是子类化还是通过 CreateWindow 创建都会调用这个函数(但由于杂志篇幅有限,我必须对代码进行压缩,因此我采用了这样的捷径)。注意,SubclassDlgItem 是一个简单的重写,而不是虚函数。为了设置颜色,SetColor 将颜色保存在两个成员变量 m_clrBackground 和 m_clrForeground 中。

  一旦风格设置为所有者描述的,每次需要 Windows? 绘制选项卡时,它都会发送 WM_DRAWITEM 消息。MFC 捕获这个消息并调用选项卡控件的虚函数 DrawItem,CColorTabCtrl 通过用新的颜色绘制文本来实现这个函数:

以下是引用片段:
  // in CColorTabCtrl::DrawItem
  dc.FillSolidRect(rc, m_clrBackground);
  dc.SetBkColor(m_clrBackground);
  dc.SetTextColor(m_clrForeground);
  dc.DrawText(...);

  这些都非常简单,所以要了解具体实现请查看源代码。由于您可能不想只更改选项卡颜色而不更改页面颜色,所以我也实现了一个 CcolorPropertyPage,它可以让您将属性页的背景颜色改成匹配的颜色,如图 6 所示。对于属性表,更改背景颜色最简单的方式就是处理 WM_ERASEBKGND:

以下是引用片段:
  BOOL CColorPropertyPage::OnEraseBkgnd(CDC* pDC)
  {
  CRect rc;
  GetClientRect(&rc);
  pDC->FillSolidRect(rc, m_clrBackground);
  return TRUE;
  }

  如果您自己试运行这段代码,您会发现有各种令人苦恼的问题。首先,如果您更改页面颜色,所有控件的背景色都会是错误的,所以还必须修正。对此,您必须处理 WM_CTLCOLOR 和 WM_ERASEBKGND。有关详细信息,可以参阅 1997 年 5 月一期中我的 MSJ 专栏。

  另一个问题是选项卡控件仍然使用系统 3D 颜色来绘制选项卡的边缘和圆角。唉!要修正这个问题,只能自己处理 WM_PAINT 并负责所有的绘图操作。包括画出选项卡在被选定时与其他选项卡的偏移,以便它以前景色显示。此时,您就要开始对选项卡控件进行一番彻底改造了。每个使用 Windows 的编程人员都知道,更改控件颜色无一例外都是很痛苦的事情,一旦您走上了这条路,要做的事情就似乎没有尽头了。相信很快标准颜色就会比它们原先的颜色漂亮许多,否则您会产生疑问,为什么不转为使用 .NET Framework,它要更改颜色只需简单地写成:

以下是引用片段:
  ctl.BackColor = Color.Aquamarine;

  祝大家编程愉快!

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章