UI及其底层代码用于按钮,通常被忽视,需要不必要的开销。为了解决这些问题,开发了一种简单的方式来增强按钮:ButtonFly - 第一个全功能美观按钮类。
ButtonFly是在Secured Globe, Inc.开发的一个独特类。ButtonFly可以节省大量的开销和编码时间,因为一个按钮可以处理四幅图像:
到目前为止,处理不同的按钮状态需要更多的代码和开销。使用ButtonFly类,有一个易于处理的全能按钮。下面的gif图像显示了一个按钮的四种不同状态,所有这些都包含在一个类中。
ButtonFly具有DPI(每英寸点数)感知,因此程序员可以决定其大小。选定的大小将用于任何显示器的分辨率。
要使用代码,需要采取几个步骤。
1. 定义图像
为了定义显示的图像,使用以下函数:
void SG_ButtonFly::SetImages(UINT nNormalId, UINT nHoverId, UINT nPressId, UINT nDisableId, LPCTSTR lpszResourceType) {
ReleaseImages();
LoadImageFromResource(m_images[Normal], nNormalId, lpszResourceType);
LoadImageFromResource(m_images[Hover], nHoverId, lpszResourceType);
LoadImageFromResource(m_images[Press], nPressId, lpszResourceType);
nDisableId = nDisableId == 0 ? nNormalId : nDisableId;
LoadImageFromResource(m_images[Disable], nDisableId, lpszResourceType);
// AutoSize();
}
通过发送四个资源ID来调用SetImages。
2. 初始化
通常希望调用两个函数来添加SG_ButtonFly到MFC对话框。这些调用将在OnInitDIalog()函数内进行,所以可以使用this来指向当前范围。
例如,如果想添加一个用于导出数据为.txt的按钮:
m_btnExportToTxt.SetImages(IDB_PNG_EXPORT, IDB_PNG_EXPORT2, IDB_PNG_EXPORT3, IDB_PNG_EXPORT4);
m_btnExportToTxt.SetParent(this);
3. 定义
需要在对话框的头文件中定义按钮,希望添加按钮。
SG_ButtonFly m_btnExportToTxt;
// (需要包括 “SG_ButtonFly.h”。)
每个添加到按钮的图像在几个地方定义:
在resource.h中,定义资源ID:
#define IDB_PNG_EXPORT 131
为四个图像中的每一个都这样做。在资源文件(.rc文件)中,添加:
IDB_PNG_EXPORT PNG "res\\export.png"
这意味着在源代码路径的res文件夹中放置了一个名为“export.png”的.png图像。
可以在这里阅读更多关于资源标识符的信息。
4. 四种状态
定义了一个枚举来支持按钮的四种可能状态:
enum State {
Normal = 0,
Hover,
Press,
Disable,
};
Normal是按钮在没有发生任何事情时的外观。Hover是用鼠标悬停按钮时发生的情况。Press是点击按钮时发生的情况。Disable是按钮被禁用时的外观。
5. 向按钮添加标题
可能还想向按钮添加标题(文本)。为此,使用SetCaptionText()。
m_btnExportToTxt.SetCaptionText(L"This is my caption");
6. 使用更少的图像
如果希望按钮只有一个图像,或者有两个图像,只需在初始化时使用相同的图像。例如,可以只使用一个图像IDB_PNG_EXPORT用于所有四种状态。
m_btnExportToTxt.SetImages(IDB_PNG_EXPORT, IDB_PNG_EXPORT, IDB_PNG_EXPORT, IDB_PNG_EXPORT);