CButtonSSL






4.20/5 (8投票s)
一个所有者绘制的、扁平的、菜单按钮,能正确处理默认状态
Bug修复 (2001年12月5日)
CButtonSSL
现已广泛用于实际产品中,因此在测试方面经历了许多考验。幸运的是,这给了我时间来发现并修复这些问题。
最新版本包括对 GDI 资源泄露的修复(我必须感谢 Dieter Hammer 的发现),以及对按钮状态绘制问题的修复(我必须感谢 Eugene Pustovyt 指出了其中一些更隐蔽的问题),还修复了发布版本中的一个主要 Bug。
问题在于,在包含使用 SetCheck
更改了状态的 CButtonSSL
复选框的发布版本中,应用程序会崩溃。经过大量(大部分是徒劳的)调试,最终在 Alvaro Mendez 的帮助下,我找到了一种持续重现问题的方法。一旦到了这一步,我就开始绝望了,但幸运的是 Joe Newcomer 及时出现,指出了我的错误。OnSetCheck
处理程序没有为 ON_COMMAND
处理程序定义两个必需的参数。所以,栈上推了两个参数,只弹出了一个!
我想感谢所有在这轮 Bug 修复中帮助过我的人,希望(不会有)很多(或者任何)新的 Bug 了。
更新 (2001年9月18日)
似乎无论你多么努力,一天之内也无法完成足够多的事情!试图兼顾工作、娱乐和家庭并不容易!然而,我终于有时间来更新这篇文章了。那么,有什么新内容呢?
CButtonSSL
现在继承自COddButton
,尽管我对它做了一些小的改动(见下文)。- 单选按钮问题已修复(请查看演示)。
- 实现了对按钮绘制的几个修复。
- 菜单的接口大部分已公开,因此我们有了全新的 菜单函数。
由于新增了大量内容,我还没有机会进行广泛的测试,尤其是关于菜单函数。如果存在任何问题,请告知我(最好附带修复方法)。
继承自 COddButton
继承自 COddButton
的改动改变了标准按钮样式的处理方式。COddButton::PreSubclassWindow
的使用意味着控件类型是从对话框编辑器中设置的初始样式确定的。所以现在 **你不能设置 Owner Draw 样式**,否则它将无法正常工作。
默认样式的处理现在也完全由 COddButton 提供,尽管如上所述,我已经做了一些小的改动来同时处理单选按钮。
第一个改动是对构造函数的,使 m_bCanBeDefault
初始值为 TRUE。第二个改动是 WM_GETDLGCODE
处理程序,COddButton::OnGetDlgCode()
。该函数现在处理单选按钮的代码如下:
UINT COddButton::OnGetDlgCode() { UINT nCode = CButton::OnGetDlgCode(); // tell the system if we want default state handling // (losing default state always allowed) UINT nType = GetControlType (); if (BS_RADIOBUTTON == (BS_RADIOBUTTON & nType) || BS_AUTORADIOBUTTON == (BS_AUTORADIOBUTTON & nType)) { nCode |= DLGC_RADIOBUTTON; } else { if (m_bCanBeDefault || m_bDefault) nCode |= (m_bDefault ? DLGC_DEFPUSHBUTTON : DLGC_UNDEFPUSHBUTTON); } return nCode; }
引言
目前按钮似乎是时下的热门,这里又有一个。这个按钮类诞生于需要一个带有菜单下拉的位图按钮,但一如既往地,它演变成了远不止于此!
我找到了 Norm Almond 的“酷炫推送菜单按钮”和 Davide Calabro 的 CButtonST,并想将两者结合起来。在此过程中,我遇到了 BS_OWNERDRAW
问题,并试图找到自己的解决方案。幸运的是,Paolo Messina 和 Jerzy Kaczorowski 用他们的 COddButton 为我解决了这个问题。
我提出的这个类主要借鉴了这些来源,还有一些其他来源,我的感谢必须送给所有在 Visual C++ 论坛上帮助过我的人。我花了很多时间来完成这个,而且我对文档的编写有些过于随意,所以如果你认领了某些代码并希望得到认可,请告诉我,我会更新它。
类的完整文档如下。我希望这足够了,因为我花了很多时间来写它;)
CButtonSSL
CButtonSSL
是对普通 CButton
的功能丰富的扩展。它增加了扁平外观、菜单下拉、位图或图标图像、文本和图像对齐、按钮颜色控制、多行工具提示、正确的默认按钮处理、光标控制以及指定链接 URL 的能力。
CButtonSSL
为复选框、单选按钮和推送按钮提供了所有者绘制功能。可以为这些创建 CButtonSSL
对象。
CButtonSSL
对象可以为按钮的向上、悬停、按下和禁用状态设置不同的图像。如果未为禁用状态指定图像,则会根据必须始终指定的向上状态图像创建禁用图像。此外,按钮颜色和文本颜色对于按钮的向上、悬停和按下状态可以不同。
CButtonSSL
对象的创建方式与 CButton
对象相同。它们可以从对话框模板创建,也可以直接在代码中创建。如果它们是从对话框模板创建的,则在对话框的 DoDataExchange
函数中存在该变量的 DDX_Control
条目时,无需调用 SubclassDlgItem
。但无论如何创建按钮,都 **不得** 设置 BS_OWNERDRAW
样式。
构造后,应初始化按钮对象的外观。可以使用 图像函数 设置按钮的图像和图像对齐方式。可以使用 文本函数 更改按钮文本的字体和对齐方式。可以使用 颜色函数 设置按钮的颜色,并使用 杂项函数 设置按钮的光标、工具提示或 URL。如果按钮对象是复选框,则可以使用 复选框函数 设置或检索按钮的选中状态。
按钮控件以与 CButton
对象相同的方式向父窗口发送 Windows 通知消息给 CButtonSSL
对象。
如果从对话框资源创建 CButtonSSL
对象,则当用户关闭对话框时,CButtonSSL
对象会自动销毁。
#include "ButtonSSL.h"
类成员
然后,当你开始迭代 2(这是构建迭代的开始)时,你可能想要复制测试用例并将它们重新分类到迭代 2。这还允许对测试用例进行粒度跟踪,并允许你说某个测试用例在一个迭代中是准备好的,但在另一个迭代中不是。同样,如何做到这一点取决于你以及你希望如何报告。 “场景”部分提供了更多细节。
CButtonSSL |
构造一个 CButtonSSL 对象。 |
初始化
SetSSLButtonStyle |
更改按钮的样式。 |
GetSSLButtonStyle |
检索有关按钮控件样式的信息。 |
图像函数
SetSSLButtonBitmap |
指定单个位图作为所有按钮状态的图像。 |
SetSSLButtonBitmaps |
为不同的按钮状态指定不同的位图。 |
SetSSLButtonIcon |
指定单个图标作为所有按钮状态的图像。 |
SetSSLButtonIcons |
为不同的按钮状态指定不同的图标。 |
SetSSLImageAlign |
设置按钮图像的对齐方式。 |
GetSSLImageAlign |
检索按钮图像的图像对齐方式。 |
文本函数
SetSSLTextAlign |
设置按钮文本的对齐方式。 |
GetSSLTextAlign |
检索按钮文本的对齐方式。 |
SetSSLButtonFont |
为按钮文本指定字体特征。 |
颜色函数
SetSSLDefaultColors |
将按钮和文本颜色设置为系统定义的默认颜色。 |
SetSSLColor |
为特定按钮状态指定用于按钮面或文本的颜色。 |
GetSSLColor |
检索使用 SetSSLColor 之前为特定按钮状态设置的按钮面或文本颜色。 |
复选框函数
SetSSLCheck |
设置复选框样式按钮的选中状态。 |
GetSSLCheck |
检索单选按钮或复选框的选中状态。 |
菜单函数
SetSSLButtonMenu |
指定菜单资源以供菜单按钮使用。 |
CheckSSLMenuItem |
在弹出菜单中为菜单项添加或移除复选标记。 |
CheckSSLMenuRadioItem |
在菜单项旁边放置一个单选按钮,并从该组中的所有其他菜单项中移除单选按钮。 |
EnableSSLMenuItem |
启用、禁用或变灰(置灰)菜单项。 |
GetSSLMenuItemCount |
确定弹出菜单或顶级菜单中的项目数。 |
GetSSLMenuItemID |
获取位于指定位置的菜单项的菜单项标识符。 |
GetSSLMenuState |
返回指定菜单项的状态或弹出菜单中的项目数。 |
GetSSLMenuString |
检索指定菜单项的标签。 |
GetSSLMenuItemInfo |
检索有关菜单项的信息。 |
ModifySSLMenu |
修改指定位置的现有菜单项。 |
RemoveSSLMenu |
从指定菜单中删除带有关联弹出菜单的菜单项。 |
SetSSLMenuItemBitmaps |
将指定的复选标记位图与菜单项关联。 |
杂项函数
SetSSLButtonCursor |
指定鼠标悬停在按钮上时显示的鼠标光标。 |
SetSSLButtonToolTip |
指定鼠标悬停在按钮上时显示的工具提示。 |
SetSSLButtonURL |
指定点击按钮时要启动的 URL。 |
CButtonSSL::CButtonSSL
CButtonSSL ();
备注
构造一个 CButtonSSL
对象。按钮样式最初设置为 SSL_BS_FLAT
,图像最初使用 SSL_IMAGE_TOP
和 SSL_IMAGE_LEFT
对齐,文本最初使用 SSL_TEXT_CENTER
和 SSL_TEXT_VCENTER
对齐。
CButtonSSL::SetSSLButtonStyle
void SetSSLButtonStyle (UINT nStyle);
参数
nStyle
指定 按钮样式。
备注
更改按钮的样式。
使用 GetSSLButtonStyle
成员函数来检索按钮样式。
另请参阅 CButtonSSL::GetSSLButtonStyle
CButtonSSL::GetSSLButtonStyle
UINT GetSSLButtonStyle ();
返回值
返回此按钮对象的按钮样式。
备注
仅返回 SSL_BS_ 样式值,不返回任何窗口样式。
另请参阅 CButtonSSL::SetSSLButtonStyle
CButtonSSL::SetSSLButtonBitmap
BOOL SetSSLButtonBitmap (UINT nResourceID, COLORREF crMask = SSL_MASK);
返回值
成功则为非零,否则为 0。
参数
nResourceID
要添加的位图的资源 ID。
crMask
用作透明掩码的位图颜色。默认值为 SSL_MASK
。
备注
此函数指定用于所有状态的单个位图。位图被复制到图像列表中,然后被当作图标处理。当按钮处于禁用状态时,会根据指定的位图创建禁用图像。
另请参阅 CButtonSSL::SetSSLButtonBitmaps, CButtonSSL::SetSSLButtonIcon, CButtonSSL::SetSSLButtonIcons
CButtonSSL::SetSSLButtonBitmaps
BOOL SetSSLButtonBitmaps (UINT nUpID, COLORREF crUpMask, UINT nOverID = 0, COLORREF crOverMask = SSL_MASK, UINT nDownID = 0, COLORREF crDownMask = SSL_MASK, UINT nDisabledID = 0, COLORREF crDisabledMask = SSL_MASK);
返回值
成功则为非零,否则为 0。
参数
nUpID
用于向上状态的位图的资源 ID。
crUpMask
用作向上位图透明掩码的颜色。默认值为 SSL_MASK
。
nOverID
用于悬停状态的位图的资源 ID。默认值为零。
crOverMask
用作悬停位图透明掩码的颜色。默认值为 SSL_MASK
。
nDownID
用于按下状态的位图的资源 ID。默认值为零。
crDownMask
用作按下位图透明掩码的颜色。默认值为 SSL_MASK
。
nDisabledID
用于禁用状态的位图的资源 ID。默认值为零。
crDisabledMask
用作禁用位图透明掩码的颜色。默认值为 SSL_MASK
。
备注
必须定义向上位图,但是,对于任何不需要的状态图像,资源 ID 可以为零。如果未为悬停状态指定位图,则使用向上图像。如果未为按下状态指定位图,则使用悬停图像(如果未指定,则使用向上图像)。
如果为禁用状态指定了位图,则将使用全彩色。否则,将使用向上图像创建正常的禁用图像。
另请参阅 CButtonSSL::SetSSLButtonBitmap, CButtonSSL::SetSSLButtonIcon, CButtonSSL::SetSSLButtonIcons
CButtonSSL::SetSSLButtonIcon
BOOL SetSSLButtonIcon (UINT nResourceID);
返回值
成功则为非零,否则为 0。
参数
nResourceID
要添加的图标的资源 ID。
备注
此函数指定用于所有状态的单个图标。图标被复制到图像列表中。当按钮处于禁用状态时,会根据指定的图标创建禁用图像。
源图标中的透明度会被保留。
另请参阅 CButtonSSL::SetSSLButtonBitmap, CButtonSSL::SetSSLButtonBitmaps, CButtonSSL::SetSSLButtonIcons
CButtonSSL::SetSSLButtonIcons
BOOL SetSSLButtonIcons (UINT nUpID, UINT nOverID = 0, UINT nDownID = 0, UINT nDisabledID = 0);
返回值
成功则为非零,否则为 0。
参数
nUpID
用于向上状态的图标的资源 ID。
nOverID
用于悬停状态的图标的资源 ID。默认值为零。
nDownID
用于按下状态的图标的资源 ID。默认值为零。
nDisabledID
用于禁用状态的图标的资源 ID。默认值为零。
备注
必须定义向上图标,但是,对于任何不需要的状态图像,资源 ID 可以为零。如果未为悬停状态指定图标,则使用向上图像。如果未为按下状态指定图标,则使用悬停图像(如果未指定,则使用向上图像)。
如果为禁用状态指定了图标,则将使用全彩色。否则,将使用向上图像创建正常的禁用图像。
源图标的透明度会被保留。
另请参阅 CButtonSSL::SetSSLButtonBitmap, CButtonSSL::SetSSLButtonBitmaps, CButtonSSL::SetSSLButtonIcon
CButtonSSL::SetSSLImageAlign
void SetSSLImageAlign (UINT nImageAlign);
参数
nImageAlign
指定图像 对齐样式。
备注
可以指定一个水平和一个垂直对齐样式,但函数内没有检查以确保这一点。
另请参阅 CButtonSSL::GetSSLImageAlign
CButtonSSL::GetSSLImageAlign
UINT GetSSLImageAlign ();
返回值
按钮图像对齐样式。
备注
此函数仅返回 SSL_IMAGE_
样式值。
另请参阅 CButtonSSL::SetSSLImageAlign
CButtonSSL::SetSSLTextAlign
void SetSSLTexteAlign (UINT nTextAlign);
参数
nTextAlign
指定文本 对齐样式。
备注
可以指定一个水平和一个垂直对齐样式,但函数内没有检查以确保这一点。
另请参阅 CButtonSSL::GetSSLTextAlign
CButtonSSL::GetSSLTextAlign
UINT GetSSLTextAlign ();
返回值
按钮文本对齐样式。
备注
此函数仅返回 SSL_TEXT_
样式值。
另请参阅 CButtonSSL::SetSSLTextAlign
CButtonSSL::SetSSLButtonFont
BOOL SetSSLButtonFont (LPCTSTR lpszFaceName, int nSizePoints = 8, BOOL bUnderline = FALSE, BOOL bBold = FALSE, BOOL bStrikeOut = FALSE, BOOL bItalic = FALSE);
BOOL SetSSLButtonFont (CFont& font);
返回值
成功则为非零,否则为 0。
参数
nSizePoints
字体大小(以磅为单位)。默认值为 8。
bUnderline
指定字体是否加下划线。非零值将字体设置为带下划线。0 值将字体设置为不带下划线。默认情况下字体不带下划线。
bBold
指定字体是否加粗。非零值将字体设置为粗体。0 值将字体设置为正常。默认情况下字体为正常。
bStrikeOut
指定字体是否删除线。非零值将字体设置为删除线。0 值将字体设置为不删除线。默认情况下字体不删除线。
bItalic
指定字体样式是否为斜体。非零值将字体样式设置为斜体。0 值将字体样式设置为正常。默认情况下字体样式为正常。
font
一个 CFont
对象,可对字体外观进行完全控制。
备注
此函数的第一种形式提供了对按钮文本字体主要方面的简单控制。如果需要,可以使用第二种形式来完全控制按钮文本字体的外观。
另请参阅 CButtonSSL::SetSSLTextAlign, CButtonSSL::GetSSLTextAlign
CButtonSSL::SetSSLDefaultColors
void SetSSLDefaultColors (BOOL bRedraw = TRUE);
参数
bRedraw
指定是否重绘按钮。非零值会重绘按钮。0 值不会重绘按钮。默认情况下会重绘按钮。
备注
使用此函数将按钮颜色重置为默认值。默认值是系统颜色 COLOR_BTNFACE
和 COLOR_BTNTEXT
。
另请参阅 CButtonSSL::SetSSLColor, CButtonSSL::GetSSLColor
CButtonSSL::SetSSLColor
BOOL SetSSLColor (BYTE byColorIndex, COLORREF crColor, BOOL bRedraw = TRUE);
返回值
成功则为非零,否则为 0。
参数
byColorIndex
指定要设置的颜色。这是 颜色枚举 中定义的颜色值之一,不包括 SSL_MAX_COLORS
。
crColor
一个 COLORREF
值,指定要设置的颜色。
bRedraw
指定是否重绘按钮。非零值会重绘按钮。0 值不会重绘按钮。默认情况下会重绘按钮。
备注
使用此函数为特定按钮状态设置按钮面或文本颜色。
另请参阅 CButtonSSL::GetSSLColor, CButtonSSL::SetSSLDefaultColors
CButtonSSL::GetSSLColor
BOOL GetSSLColor (BYTE byColorIndex, COLORREF* pcrColor);
返回值
如果 byColorIndex
小于 SSL_MAX_COLORS
,则返回非零;否则返回 0。
参数
byColorIndex
指定要检索的颜色。这是 颜色枚举 中定义的颜色值之一,不包括 SSL_MAX_COLORS
。
pcrColor
指向一个 COLORREF
值的指针,用于接收请求的颜色值。
备注
使用此函数检索特定按钮状态的当前按钮面或文本颜色。
另请参阅 CButtonSSL::SetSSLColor, CButtonSSL::SetSSLDefaultColors
CButtonSSL::SetSSLCheck
void SetSSLCheck (int nCheck, BOOL bRedraw = TRUE);
参数
nCheck
指定选中状态。此参数可以是 0(未选中)或 1(已选中)。
bRedraw
指定是否重绘按钮。非零值会重绘按钮。0 值不会重绘按钮。默认情况下会重绘按钮。
备注
设置或重置复选框的选中状态。此成员函数对推送按钮无效。
CButtonSSL::GetSSLCheck
int GetSSLCheck ();
返回值
返回值是 0(未选中)或 1(已选中)。
备注
检索单选按钮或复选框的选中状态。
CButtonSSL::SetSSLButtonMenu
BOOL SetSSLButtonMenu (UINT nResourceID);
BOOL SetSSLButtonMenu (LPCTSTR lpszResourceName);
返回值
成功则为非零,否则为 0。
参数
nResourceID
指定要加载的菜单资源的菜单 ID。
lpszResourceName
指向一个以 null 结尾的字符串,该字符串包含要加载的菜单资源的名称。
备注
这两个函数都使用提供的菜单中的第一个子菜单,假设它是一个弹出菜单。例如,在资源编辑器中创建一个菜单资源。将第一个菜单项设置为弹出菜单。在该菜单项下方添加子项以显示在菜单按钮上。
菜单项选择的 Windows 消息处理必须由父窗口处理,CButtonSSL
没有机制来处理它们。
CButtonSSL::CheckSSLMenuItem
UINT CheckSSLMenuItem (UINT nIDCheckItem, UINT nCheck = MF_CHECKED);
返回值
项的先前状态:MF_CHECKED 或 MF_UNCHECKED,如果菜单项不存在则为 0xFFFFFFFF (MF_DOES_NOT_EXIST)。
参数
nIDCheckItem
指定要检查的菜单项,由 nCheck 确定。
nCheck
指定如何检查菜单项以及如何确定其在菜单中的位置。nCheck 参数可以是 MF_CHECKED 或 MF_UNCHECKED 与 MF_BYPOSITION 或 MF_BYCOMMAND 标志的组合。这些标志可以使用按位 OR 运算符组合。它们的含义如下:
- MF_BYCOMMAND 指定参数是现有菜单项的命令 ID。这是默认值。
- MF_BYPOSITION 指定参数是现有菜单项的位置。第一个项的位置为 0。
- MF_CHECKED 与 MF_UNCHECKED 切换,在项旁边放置默认复选标记。
- MF_UNCHECKED 与 MF_CHECKED 切换,移除项旁边的复选标记。
备注
在弹出菜单中为菜单项添加或移除复选标记。nIDCheckItem 参数指定要修改的项。
nIDCheckItem 参数可以标识弹出菜单项以及菜单项。检查弹出菜单项无需特殊步骤。顶级菜单项不能被检查。弹出菜单项必须按位置检查,因为它没有关联的菜单项标识符。
CButtonSSL::CheckSSLMenuRadioItem
BOOL CheckSSLMenuRadioItem (UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags);
返回值
成功则为非零,否则为 0。
参数
nIDFirst
指定(作为 ID 或偏移量,取决于 nFlags 的值)单选按钮组中的第一个菜单项。
nIDLast
指定(作为 ID 或偏移量,取决于 nFlags 的值)单选按钮组中的最后一个菜单项。
nIDItem
指定(作为 ID 或偏移量,取决于 nFlags 的值)将在组中用单选按钮检查的项。
nFlags
指定 nIDFirst
、nIDLast
和 nIDItem
的解释方式如下:
- MF_BYCOMMAND 指定参数是现有菜单项的命令 ID。如果未设置 MF_BYCOMMAND 或 MF_BYPOSITION,则这是默认值。
- MF_BYPOSITION 指定参数是现有菜单项的位置。第一个项的位置为 0。
备注
在弹出菜单中为菜单项添加或移除复选标记。nIDCheckItem 参数指定要修改的项。
nIDCheckItem 参数可以标识弹出菜单项以及菜单项。检查弹出菜单项无需特殊步骤。顶级菜单项不能被检查。弹出菜单项必须按位置检查,因为它没有关联的菜单项标识符。
CButtonSSL::EnableSSLMenuItem
UINT EnableSSLMenuItem (UINT nIDEnableItem, UINT nEnable);
返回值
先前状态(MF_DISABLED、MF_ENABLED 或 MF_GRAYED),-1 表示无效,如果菜单未初始化则为 MF_DOES_NOT_EXIST。
参数
nIDEnableItem
指定要启用的菜单项,由 nEnable 确定。此参数可以指定弹出菜单项以及标准菜单项。
nEnable
指定要执行的操作。它可以是 MF_DISABLED、MF_ENABLED 或 MF_GRAYED 与 MF_BYCOMMAND 或 MF_BYPOSITION 的组合。这些值可以使用按位 OR 运算符组合。这些值具有以下含义:
- MF_BYCOMMAND 指定参数是现有菜单项的命令 ID。这是默认值。
- MF_BYPOSITION 指定参数是现有菜单项的位置。第一个项的位置为 0。
- MF_DISABLED 禁用菜单项,使其无法被选中,但不将其变暗。
- MF_ENABLED 启用菜单项,使其可以被选中并恢复其变暗状态。
- MF_GRAYED 禁用菜单项,使其无法被选中,并将其变暗。
备注
启用、禁用或变灰菜单项。
使用 MF_BYPOSITION 值要求应用程序使用正确的 CMenu。如果使用菜单栏的 CMenu,则会影响顶级菜单项(菜单栏中的项)。要按位置设置弹出菜单或嵌套弹出菜单中项的状态,应用程序必须指定弹出菜单的 CMenu。
当应用程序指定 MF_BYCOMMAND 标志时,Windows 会检查 CMenu 下的所有弹出菜单项;因此,除非存在重复的菜单项,否则使用菜单栏的 CMenu 就足够了。
CButtonSSL::GetSSLMenuItemCount
UINT GetSSLMenuItemCount () const;
返回值
如果函数成功,则返回菜单中的项目数;否则返回 -1。如果菜单未初始化,将返回 MF_DOES_NOT_EXIST。
备注
确定弹出菜单或顶级菜单中的项目数。
CButtonSSL::GetSSLMenuItemID
UINT GetSSLMenuItemID (int nPos) const;
返回值
如果函数成功,则返回弹出菜单中指定项的项 ID。如果指定的项是弹出菜单(而不是弹出菜单内的项),则返回值为 -1。如果 nPos 对应于 SEPARATOR 菜单项,则返回值为 0。如果菜单尚未初始化,将返回 MF_DOES_NOT_EXIST 值。
参数
nPos
指定要检索 ID 的菜单项的位置(从零开始)。
备注
获取位于 nPos
定义的位置的菜单项的菜单项标识符。
CButtonSSL::GetSSLMenuState
UINT GetSSLMenuState (UINT nID, UINT nFlags);
返回值
如果指定项不存在或菜单未初始化,则返回 MF_DOES_NOT_EXIST。如果 nId
标识弹出菜单,则高字节包含弹出菜单中的项数,低字节包含与弹出菜单关联的菜单标志。否则,返回值是以下列表中的值(此掩码描述了 nId
标识的菜单项的状态)的掩码(布尔 OR):
- MF_CHECKED 与 MF_UNCHECKED 切换,在项旁边放置默认复选标记。当应用程序提供复选标记位图时(请参阅 SetMenuItemBitmaps 成员函数),将显示“复选标记开启”位图。
- MF_DISABLED 禁用菜单项,使其无法被选中,但不将其变暗。
- MF_ENABLED 启用菜单项,使其可以被选中并恢复其变暗状态。请注意,此常量的值为 0;应用程序不应测试 0 是否失败,当使用此值时。
- MF_GRAYED 禁用菜单项,使其无法被选中,并将其变暗。
- MF_MENUBARBREAK 在静态菜单的新行或弹出菜单的新列中放置项。新弹出菜单列将与旧列之间用垂直分隔线隔开。
- MF_MENUBREAK 在静态菜单的新行或弹出菜单的新列中放置项。列之间不放置分隔线。
- MF_SEPARATOR 绘制水平分隔线。只能在弹出菜单中使用。此线不能被变暗、禁用或高亮显示。其他参数将被忽略。
- MF_UNCHECKED 与 MF_CHECKED 切换,移除项旁边的复选标记。当应用程序提供复选标记位图时(请参阅 SetMenuItemBitmaps 成员函数),将显示“复选标记关闭”位图。请注意,此常量的值为 0;应用程序不应测试 0 是否失败,当使用此值时。
参数
nID
指定菜单项 ID,由 nFlags 确定。
nID
指定 nID 的性质。它可以是以下值之一:
- MF_BYCOMMAND 指定参数是现有菜单项的命令 ID。这是默认值。
- MF_BYPOSITION 指定参数是现有菜单项的位置。第一个项的位置为 0。
备注
返回指定菜单项的状态或弹出菜单中的项目数。
CButtonSSL::GetSSLMenuString
int GetSSLMenuString (UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags);
int GetSSLMenuString (UINT nIDItem, CString& rString, UINT nFlags);
返回值
指定复制到缓冲区的实际字节数,不包括 null 终止符。
参数
nIDItem
指定菜单项的整数标识符或菜单中的菜单项偏移量,具体取决于 nFlags
的值。
lpString
指向要接收标签的缓冲区。
rString
指向要接收复制的菜单字符串的 CString
对象的引用。
nMaxCount
指定要复制的标签的最大长度(以字节为单位)。如果标签比 nMaxCount 指定的最大值长,则额外字符将被截断。
nFlags
指定 nIDItem
参数的解释。它可以是以下值之一:
- MF_BYCOMMAND 指定参数是现有菜单项的命令 ID。如果未设置 MF_BYCOMMAND 或 MF_BYPOSITION,则这是默认值。
- MF_BYPOSITION 指定参数是现有菜单项的位置。第一个项的位置为 0。
备注
将指定菜单项的标签复制到指定的缓冲区。
nMaxCount
参数应比标签中的字符数多一个,以便容纳终止字符串的 null 字符。
CButtonSSL::GetSSLMenuItemInfo
BOOL GetSSLMenuItemInfo (UINT nIDItem, LPMENUITEMINFO lpMenuItemInfo, BOOL ByPos = FALSE);
返回值
如果函数成功,则返回值为非零。如果函数失败,则返回值为零。要获取扩展错误信息,请使用平台 SDK 中描述的 Win32 函数 GetLastError
。
参数
nIDItem
要获取信息的菜单项的标识符或位置。此参数的含义取决于 ByPos
的值。
lpMenuItemInfo
指向 MENUITEMINFO
的指针(如平台 SDK 中所述),其中包含有关菜单的信息。
rString
指向要接收复制的菜单字符串的 CString
对象的引用。
ByPos
指定 nIDItem
含义的值。默认情况下,ByPos
为 FALSE
,表示 nIDItem
是菜单项标识符。如果 ByPos
不设置为 FALSE
,则表示菜单项位置。
备注
此成员函数实现了 Win32 函数 GetMenuItemInfo
的行为,如平台 SDK 中所述。
请注意,在 MFC 的 GetMenuItemInfo
实现中,您不使用菜单句柄。
CButtonSSL::ModifySSLMenu
BOOL ModifySSLMenu (UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL);
BOOL ModifySSLMenu (UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp);
返回值
如果函数成功,则返回非零;否则返回 0。
参数
nPosition
指定要更改的菜单项。nFlags
参数可用于以下方式解释 nPosition
:
- MF_BYCOMMAND 指定参数是现有菜单项的命令 ID。如果未设置 MF_BYCOMMAND 或 MF_BYPOSITION,则这是默认值。
- MF_BYPOSITION 指定参数是现有菜单项的位置。第一个项的位置为 0。
nFlags
指定如何解释 nPosition
并提供有关要对菜单项进行的更改的信息。
nIDNewItem
指定修改后的菜单项的命令 ID,或者,如果 nFlags
设置为 MF_POPUP,则为弹出菜单的菜单句柄 (HMENU
)。如果 nFlags
设置为 MF_SEPARATOR,则忽略 nIDNewItem
参数(不需要)。
lpszNewItem
指定新菜单项的内容。nFlags
参数可用于以下方式解释 lpszNewItem
:
- MF_OWNERDRAW 包含应用程序提供的 32 位值,应用程序可使用该值来维护与菜单项关联的额外数据。应用程序在处理 MF_MEASUREITEM 和 MF_DRAWITEM 时可以使用此 32 位值。
- MF_STRING 包含指向 null 终止字符串或
CString
的长指针。 - MF_SEPARATOR
lpszNewItem
参数被忽略(不需要)。
pBmp
指向将用作菜单项的 CBitmap
对象的指针。
备注
修改指定位置 nPosition
的现有菜单项。应用程序通过设置 nFlags
中的值来指定菜单项的新状态。如果此函数替换与菜单项关联的弹出菜单,则会销毁旧的弹出菜单并释放其占用的内存。
当 nIDNewItem
指定弹出菜单时,它将成为插入其中的菜单的一部分。如果该菜单被销毁,插入的菜单也将被销毁。插入的菜单应与 CMenu
对象分离,以避免冲突。
CButtonSSL::RemoveSSLMenu
BOOL RemoveSSLMenu (UINT nPosition, UINT nFlags);
返回值
如果函数成功,则返回非零;否则返回 0。
参数
nPosition
指定要更改的菜单项。nFlags
参数可用于以下方式解释 nPosition
:
- MF_BYCOMMAND 指定参数是现有菜单项的命令 ID。如果未设置 MF_BYCOMMAND 或 MF_BYPOSITION,则这是默认值。
- MF_BYPOSITION 指定参数是现有菜单项的位置。第一个项的位置为 0。
nFlags
指定如何解释 nPosition
。
备注
从菜单中删除带有关联弹出菜单的菜单项。它不销毁弹出菜单的句柄,因此菜单可以重用。
CButtonSSL::SetSSLMenuItemBitmaps
BOOL SetSSLMenuItemBitmaps (UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked);
返回值
如果函数成功,则返回非零;否则返回 0。
参数
nPosition
指定要更改的菜单项。nFlags
参数可用于以下方式解释 nPosition
:
- MF_BYCOMMAND 指定参数是现有菜单项的命令 ID。如果未设置 MF_BYCOMMAND 或 MF_BYPOSITION,则这是默认值。
- MF_BYPOSITION 指定参数是现有菜单项的位置。第一个项的位置为 0。
nFlags
指定如何解释 nPosition
。
pBmpUnchecked
指定用于未选中菜单项的位图。
pBmpChecked
指定用于已选中菜单项的位图。
备注
将指定的位图与菜单项关联。无论菜单项是否被选中,Windows 都会在菜单项旁边显示相应的位图。
如果 pBmpUnchecked
或 pBmpChecked
为 NULL
,则 Windows 不会在相应属性的菜单项旁边显示任何内容。如果两个参数都为 NULL
,则 Windows 在选中项时使用默认复选标记,在取消选中项时移除复选标记。
当菜单被销毁时,这些位图不会被销毁;应用程序必须销毁它们。
Windows 的 GetMenuCheckMarkDimensions
函数检索菜单项使用的默认复选标记的尺寸。应用程序使用这些值来确定此函数提供的位图的适当大小。获取尺寸,创建位图,然后设置它们。
CButtonSSL::SetSSLButtonCursor
BOOL SetSSLButtonCursor (UINT nResourceID);
返回值
成功则为非零,否则为 0。
参数
nResourceID
指定要加载的光标资源的鼠标光标 ID。
备注
指定的鼠标光标将在鼠标位于按钮的任何部分(包括下拉箭头)时显示。当点击下拉箭头导航菜单时,鼠标光标将恢复到之前的状态。
CButtonSSL::SetSSLButtonToolTip
void SetSSLButtonToolTip (LPCTSTR lpszTipText, BOOL bActivate = TRUE);
void SetSSLButtonToolTip (UINT nResourceID, BOOL bActivate = TRUE);
参数
lpszTipText
指向一个以 null 结尾的字符串,其中包含要在工具提示上显示的文本。
nResourceID
指定字符串表中字符串的资源 ID,该字符串将显示在工具提示上。
bActivate
指定是否激活或停用工具提示。默认情况下会激活工具提示。
备注
当工具提示处于活动状态(bActivate
= TRUE
)时,当鼠标悬停在按钮上时会出现工具提示信息;当其处于非活动状态(bActivate
= FALSE
)时,即使鼠标悬停在按钮上,工具提示信息也不会出现。
CButtonSSL::SetSSLButtonURL
void SetSSLButtonURL (LPCTSTR lpszURL);
参数
lpszURL
指向一个以 null 结尾的字符串,其中包含点击按钮时要打开的 URL。
备注
调用此函数定义点击按钮时要打开的 URL。如果尚未通过 SetSSLButtonCursor 为按钮定义鼠标光标,则此函数会尝试从 WinHlp32.exe 加载手形光标。此方法在 Paul DiLascia 1998 年 1 月的 MSJ 文章中有详细介绍。如果运行时环境没有在 Windows 目录中找到 WinHlp32.exe,则可以定义并使用 SetSSLButtonCursor 进行设置。
另请参阅 CButtonSSL::SetSSLButtonCursor
按钮样式
SSL_BS_FLAT
创建一个扁平外观的按钮。当鼠标悬停在按钮上时,按钮会凸起,但不如普通 3D 控件那样明显。默认样式。SSL_BS_MENU_BTN
创建一个在按钮右侧带有下拉箭头的按钮。可以为此对象分配一个菜单,在点击下拉部分时显示。SSL_BS_AUTOSIZE
创建一个自动调整大小以适应其内容的按钮。此样式不会阻止按钮图像和按钮文本重叠。
对齐样式
SSL_TEXT_TOP
文本垂直对齐到按钮顶部。SSL_TEXT_LEFT
文本水平对齐到按钮左侧。SSL_TEXT_CENTER
文本水平对齐到按钮中心。默认样式。SSL_TEXT_RIGHT
文本水平对齐到按钮右侧。SSL_TEXT_VCENTER
文本垂直对齐到按钮中心。默认样式。SSL_TEXT_BOTTOM
文本垂直对齐到按钮底部。
对于文本对齐,应该只设置一个水平和一个垂直样式。
SSL_IMAGE_TOP
按钮图像垂直对齐到按钮顶部。默认样式。SSL_IMAGE_LEFT
按钮图像水平对齐到按钮左侧。默认样式。SSL_IMAGE_CENTER
按钮图像水平对齐到按钮中心。SSL_IMAGE_RIGHT
按钮图像水平对齐到按钮右侧。SSL_IMAGE_VCENTER
按钮图像垂直对齐到按钮中心。SSL_IMAGE_BOTTOM
按钮图像垂直对齐到按钮底部。
对于按钮图像对齐,应该只设置一个水平和一个垂直样式。
颜色枚举
SSL_UP_BK_COLOR
按钮处于向上状态时使用的按钮颜色。SSL_UP_TEXT_COLOR
按钮处于向上状态时使用的文本颜色。SSL_OVER_BK_COLOR
鼠标悬停在按钮上时使用的按钮颜色。SSL_OVER_TEXT_COLOR
鼠标悬停在按钮上时使用的文本颜色。SSL_DOWN_BK_COLOR
按钮处于按下状态时使用的按钮颜色。SSL_DOWN_TEXT_COLOR
按钮处于按下状态时使用的文本颜色。SSL_MAX_COLORS
定义可定义的最大颜色数。
常量
SSL_MASK
定义为RGB (<span class=cpp-literal >255, <span class=cpp-literal >0, <span class=cpp-literal >255)
已知问题
据我所知,没有。如果你发现了,请告诉我。