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

CButtonSSL

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (8投票s)

2001年8月30日

CPOL

32分钟阅读

viewsIcon

320721

downloadIcon

6945

一个所有者绘制的、扁平的、菜单按钮,能正确处理默认状态

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_TOPSSL_IMAGE_LEFT 对齐,文本最初使用 SSL_TEXT_CENTERSSL_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。

参数

lpszFaceName
字体族名称

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_BTNFACECOLOR_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

CButtonSSL::GetSSLCheck

int GetSSLCheck ();

返回值

返回值是 0(未选中)或 1(已选中)。

备注

检索单选按钮或复选框的选中状态。

概述 | 类成员 | 样式 | 已知问题

另请参阅 CButtonSSL::SetSSLCheck

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_CHECKEDMF_UNCHECKED,如果菜单项不存在则为 0xFFFFFFFF (MF_DOES_NOT_EXIST)。

参数

nIDCheckItem
指定要检查的菜单项,由 nCheck 确定。

nCheck
指定如何检查菜单项以及如何确定其在菜单中的位置。nCheck 参数可以是 MF_CHECKEDMF_UNCHECKEDMF_BYPOSITIONMF_BYCOMMAND 标志的组合。这些标志可以使用按位 OR 运算符组合。它们的含义如下:

  • MF_BYCOMMAND 指定参数是现有菜单项的命令 ID。这是默认值。
  • MF_BYPOSITION 指定参数是现有菜单项的位置。第一个项的位置为 0。
  • MF_CHECKEDMF_UNCHECKED 切换,在项旁边放置默认复选标记。
  • MF_UNCHECKEDMF_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
指定 nIDFirstnIDLastnIDItem 的解释方式如下:

  • MF_BYCOMMAND 指定参数是现有菜单项的命令 ID。如果未设置 MF_BYCOMMANDMF_BYPOSITION,则这是默认值。
  • MF_BYPOSITION 指定参数是现有菜单项的位置。第一个项的位置为 0。

备注

在弹出菜单中为菜单项添加或移除复选标记。nIDCheckItem 参数指定要修改的项。

nIDCheckItem 参数可以标识弹出菜单项以及菜单项。检查弹出菜单项无需特殊步骤。顶级菜单项不能被检查。弹出菜单项必须按位置检查,因为它没有关联的菜单项标识符。

概述 | 类成员 | 样式 | 已知问题

CButtonSSL::EnableSSLMenuItem

UINT EnableSSLMenuItem (UINT nIDEnableItem, UINT nEnable);

返回值

先前状态(MF_DISABLEDMF_ENABLEDMF_GRAYED),-1 表示无效,如果菜单未初始化则为 MF_DOES_NOT_EXIST

参数

nIDEnableItem
指定要启用的菜单项,由 nEnable 确定。此参数可以指定弹出菜单项以及标准菜单项。

nEnable
指定要执行的操作。它可以是 MF_DISABLEDMF_ENABLEDMF_GRAYEDMF_BYCOMMANDMF_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_CHECKEDMF_UNCHECKED 切换,在项旁边放置默认复选标记。当应用程序提供复选标记位图时(请参阅 SetMenuItemBitmaps 成员函数),将显示“复选标记开启”位图。
  • MF_DISABLED 禁用菜单项,使其无法被选中,但不将其变暗。
  • MF_ENABLED 启用菜单项,使其可以被选中并恢复其变暗状态。请注意,此常量的值为 0;应用程序不应测试 0 是否失败,当使用此值时。
  • MF_GRAYED 禁用菜单项,使其无法被选中,并将其变暗。
  • MF_MENUBARBREAK 在静态菜单的新行或弹出菜单的新列中放置项。新弹出菜单列将与旧列之间用垂直分隔线隔开。
  • MF_MENUBREAK 在静态菜单的新行或弹出菜单的新列中放置项。列之间不放置分隔线。
  • MF_SEPARATOR 绘制水平分隔线。只能在弹出菜单中使用。此线不能被变暗、禁用或高亮显示。其他参数将被忽略。
  • MF_UNCHECKEDMF_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_BYCOMMANDMF_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 含义的值。默认情况下,ByPosFALSE,表示 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_BYCOMMANDMF_BYPOSITION,则这是默认值。
  • MF_BYPOSITION 指定参数是现有菜单项的位置。第一个项的位置为 0。

nFlags
指定如何解释 nPosition 并提供有关要对菜单项进行的更改的信息。

nIDNewItem
指定修改后的菜单项的命令 ID,或者,如果 nFlags 设置为 MF_POPUP,则为弹出菜单的菜单句柄 (HMENU)。如果 nFlags 设置为 MF_SEPARATOR,则忽略 nIDNewItem 参数(不需要)。

lpszNewItem
指定新菜单项的内容。nFlags 参数可用于以下方式解释 lpszNewItem

  • MF_OWNERDRAW 包含应用程序提供的 32 位值,应用程序可使用该值来维护与菜单项关联的额外数据。应用程序在处理 MF_MEASUREITEMMF_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_BYCOMMANDMF_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_BYCOMMANDMF_BYPOSITION,则这是默认值。
  • MF_BYPOSITION 指定参数是现有菜单项的位置。第一个项的位置为 0。

nFlags
指定如何解释 nPosition

pBmpUnchecked
指定用于未选中菜单项的位图。

pBmpChecked
指定用于已选中菜单项的位图。

备注

将指定的位图与菜单项关联。无论菜单项是否被选中,Windows 都会在菜单项旁边显示相应的位图。

如果 pBmpUncheckedpBmpCheckedNULL,则 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)

已知问题

据我所知,没有。如果你发现了,请告诉我。

© . All rights reserved.