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






4.29/5 (4投票s)
2000年9月7日

253324

4482
本文介绍如何为您的 Win95/NT4 非模态对话框提供类似 Win98/W2K 的渐变标题栏。
引言
本文介绍如何向模态或非模态对话框添加类似 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 文件中为此消息编写一个处理程序,并使用所需的参数调用 CCaptionPainter
的 PaintCaption
成员函数,如下所示。
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_NCLBUTTONDOWN
和 WM_NCRBUTTONDOWN
消息。
如果您不这样做,那么只要您单击对话框栏,关闭按钮就会弹出,并且效果相当令人不愉快。
要处理这些消息,请查看 CCaptionPainter
的 WindowProc()
。在处理 WM_SETTINGCHANGE
和 WM_SYSCOLORCHANGE
消息之后添加以下代码
case WM_NCLBUTTONDOWN: case WM_NCRBUTTONDOWN: return 0;
就是这样。 现在一切都应该正常工作了。