65.9K
CodeProject 正在变化。 阅读更多。
Home

模态和非模态对话框的渐变标题栏

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (4投票s)

2000年9月7日

viewsIcon

253324

downloadIcon

4482

本文介绍如何为您的 Win95/NT4 非模态对话框提供类似 Win98/W2K 的渐变标题栏。

  • 下载源代码文件 - 11 Kb
  • 下载演示项目 - 31 Kb
  • Sample Image - GradientTitleBar.gif

    引言

    本文介绍如何向模态或非模态对话框添加类似 Win98 的渐变标题栏,是对 codeguru 上的 Philip Petrescu 文章的修改。我还使用了 Paul DiLascia 1997 年 Microsoft Systems Journal 中的著名 CSubclassWnd

    我需要在模态/非模态对话框中使用渐变标题栏,并且必须修改代码才能使其正常工作。它适用于支持更改标题文本的模态/非模态对话框。我感谢所有姓名出现在源代码各个部分的人的贡献。他们是专家,我只是个新手!

    如何使用

    在您的项目中包含文件PaintCap.cpp, PaintCap.h, Subclass.cpp, Subclass.h,并声明一个 CCaptionPainter 类型的成员变量

    CCaptionPainter m_cap

    您可以使用 ClassView 添加此成员变量,但是如果手动添加,请确保添加

    #include "PaintCap.h"

    到您对话框的头文件中。

    向您的对话框的标题添加一个用户定义的消息 WM_MYPAINTMESSAGE

    #define WM_MYPAINTMESSAGE WM_USER+5

    在对话框的 .cpp 文件中为此消息编写一个处理程序,并使用所需的参数调用 CCaptionPainterPaintCaption 成员函数,如下所示。

    LRESULT <Your Dialog>::OnMyPaintMessage(WPARAM wp,LPARAM lp)
    {
    	m_cap.PaintCaption(wp,lp);
    	return 0;
    }

    接下来,通过将消息映射添加到对话框类的 .cpp 文件(在 AFX_MESSAGE_MAP 之后和 END_MESSAGE_MAP 之前),将用户定义的消息映射到处理程序

    ON_MESSAGE(WM_MYPAINTMESSAGE,OnPaintMyMessage)

    在对话框的 InitInstance 中,首先通过调用 SetCaption 函数来设置标题文本,例如

    CString str="My caption";
    m_cap.SetCaption(str);

    然后按如下方式安装消息挂钩

    m_cap.Install(this,WM_MYPAINTMESSAGE)

    就是这样。

    如果想随时更改标题文本,请使用以下方法

    CString newstr="New Text"; // new string
    m_cap.SetCaption(newstr); //set the caption
    m_cap.UpdateFrameTitle(this->m_hWnd); //paint the new caption 

    您可以在模态对话框中类似地使用渐变标题栏。

    我已经用 VC++ 6.0 在 Win95 下测试了这段代码,但我认为它在 Win98/NT 等其他平台上与其他版本也能很好地工作。

    删除图标和关闭按钮显示

    通常,对话框栏会在对话框中显示关闭按钮和图标。 但是有一些解决方法。 如果您不想在对话框栏中显示图标,或者不想显示关闭按钮,则必须自己编辑一些代码。 查看 *paintcap.cpp* 文件并执行以下操作

    找到 CCaptionPainter 类的 PaintCaption(WPARAM bActive, LPARAM lParam) 成员函数。

    删除图标支持

    移动到该行

    int cxIcon=DrawIcon(pc);

    将此行替换为以下代码,

    int cxIcon=0;

    删除关闭按钮

    移动到该行

    int cxButns= DrawButtons(pc);

    将此行替换为以下代码,

    int cxButns=0;

    您快完成了。如果您的对话框未启用系统菜单,则一切正常。如果在对话框属性中启用了系统菜单选项,则需要处理 WM_NCLBUTTONDOWNWM_NCRBUTTONDOWN 消息。

    如果您不这样做,那么只要您单击对话框栏,关闭按钮就会弹出,并且效果相当令人不愉快。

    要处理这些消息,请查看 CCaptionPainterWindowProc() 。在处理 WM_SETTINGCHANGEWM_SYSCOLORCHANGE 消息之后添加以下代码

    case WM_NCLBUTTONDOWN:
    case WM_NCRBUTTONDOWN:
    return 0; 

    就是这样。 现在一切都应该正常工作了。

    © . All rights reserved.