一个更好的位图按钮类

表的内容 概述cimagebutton类 CImageButton方法 CToggleButton类 CToggleButton方法 概述 我一直不太喜欢CBitmapButton类。它有几个主要缺陷。 它需要一种非自然的资源命名范式。它在多种屏幕分辨率下不能很好地工作。对于程序员来说,创建按钮图像需要做太多的工作。 对于“典型”情况,这个类有太多的通用性和威力。所以简单的情况和一般的情况一样困难。我不需要最一般的情况,你们可能也不需要。您只是想在按钮中显示一个有趣的位图,而不是一些乏味的文本。剩下的部分,你可以不费任何力气就能正常工作。 CBitmapButton类确实很奇怪,因为它名义上要求你创建1 - 4个按钮的图像,所有这些都设计得很好,有正确的边缘和所有东西,并且用时髦的名字命名它们,比如“ACTIOND”、“ACTIONU”、“ACTIONF”和“ACTIONX”。当然,您可以实际使用id,并自己调用LoadBitmaps方法,但您仍然必须创建这些位图。 你知道如何创建一个真正好看的3D边缘吗?这是棘手的。当您必须创建一个在任何分辨率下都能工作的分辨率时,这就更加棘手了。你知道如何创建一个在任何分辨率下看起来都不错的焦点矩形吗?如果你不想让你的按钮调整到位图的大小呢? 但为什么要担心这些问题呢?当我做一个位图按钮时,我想要一个看起来像普通按钮的按钮。它有适当的边,适当的边在下推时变化,并显示一个焦点矩形。唯一不同的是位图。我只想画一张。 本文中描述的位图类解决了所有这些问题。我的代码已经流传了一段时间,但是最近位图问题的数量促使我清理它并将其转换为可发布的形式。 一个智能位图按钮类 CImageButton绘制处于上升或下降状态的按钮,并在控件具有焦点时绘制图像周围的焦点矩形。 这个类只需要一个位图,尽管您可以提供最多三个位图。您不需要第四个(焦点)位图,因为焦点矩形是自动绘制的。 位图仅由其资源id指定。不需要使用非标准的命名约定。如果您想为不同的分辨率使用不同的位图,您可以通过在OnInitDialog处理程序中使用所需的位图id调用LoadBitmaps来实现。 如果您只提供一个位图(理想的情况),那么相同的位图用于上下,并将在禁用时用交替灰色像素变灰。如果你不喜欢灰色-out算法,你可以提供一个显式的灰色-out图像为你自己设计的禁用状态。 类似地,由于边缘和焦点是为您提供的,您通常不需要为“向下”状态提供一个特殊的位图。在执行“向下”状态时,唯一真正的技巧是焦点矩形和位图图像向右和向下移动,以保持按下按钮的视觉错觉。 那么“对话单元”的问题呢?这是困扰着每个试图使用位图和对话框做一些事情的人的噩梦。如果你不知道这个问题是什么,微软聪明地决定一个对话框应该根据屏幕分辨率调整自己的大小,这样一个对话框在640×480看起来合理的时候,在1600×1200看起来也同样合理。实际上,这是一个好主意,但它的实现还有很多需要改进的地方。最严重的缺陷是任何使用位图的东西都有严重的问题,因为位图总是像素分辨率。所以640×480的16×16位图在1600×1200的时候几乎是看不见的。640×480是屏幕的1/40×1/30。在1600×1200时,是屏幕的1/100×1/75。它的体积缩小了2.5倍。 我通过规定用位图图像“填充”按钮区域来处理这个问题。这使用了StretchBlt函数来展开位图。对于一些图片,这是很有效的;对其他人来说,它会产生非常难看的效果,比如混叠。但是对于您为按钮使用的大量简单图像来说,这是令人满意的,并且不必在多个分辨率下创建位图。 如果你想要的图像在你的按钮中不是从边缘到边缘的,但是你想要它调整大小呢?简单地创建一个更大的位图,并用标称的3D面部颜色填充位图,即RGB(192, 192, 192),“灰色”。我用LR_LOADMAP3DCOLORS加载位图,因此深灰色、灰色和浅灰色的实例都将被替换为用户当前的显示方案设置。如果您没有提供自己的灰色图像,我使用COLOR_3DFACE来“灰色化”图像,因此将遵循用户选择的配色方案。 我如果您选择不使用“填充”特性,那么这个类将支持各种按钮样式,例如用于水平对齐的BS_CENTER、BS_LEFT和BS_RIGHT,用于垂直对齐的BS_VCENTER、BS_TOP和BS_BOTTOM。 实际上,所有这些代码中唯一真正需要技巧的部分是处理所有奇怪的情况,比如位图比按钮大,而调用者指定了右对齐的图像怎么办?(答案:左边的图像被截断了)。您可以阅读代码来发现所有其他奇怪的情况。 要创建一个图像按钮,需要在对话框编辑器中创建一个按钮,并将其标记为owner-draw。您提供的任何标题将被忽略。然后进入类向导,为它创建一个类型为CImageButton的控制变量。注意,在将CImageButton添加到项目后,可能需要重新构建.clw文件。删除.clw文件并调用ClassWizard,然后告诉它从现有的项目文件中重建该文件。 CImageButton方法 我在CImageBitmap类中提供的是一组扩展基本CButton类的简单方法。 隐藏,复制Code

void CImageBitmap::LoadBitmaps(UINT up, UINT down = 0, UINT disabled = 0)

调用此方法来告诉按钮要使用什么图像。只需要up映像。其余的都是可选的,并根据下表在绘图时隐含地提供: 位图提供 使用位图 ——LoadBitmaps参数 ——按钮状态—— 上下来残疾了下禁用了0 0起灰色的()上下降0上升下灰色的()0禁用上上上禁用了下禁用了禁用 隐藏,复制Code

void CImageBitmap::GetBitmaps(UINT &up, 
                              UINT &down, 
                              UINT &disabled)

这可以用来检索由最后一次LoadBitmaps调用设置的位图的资源id。 字DWORD CImageButton:: SetVPos(风格) 这可以用来设置图像的垂直位置。它可以是BS_TOP、BS_BOTTOM或BS_VCENTER中的一个。它返回先前的垂直样式。 字DWORD CImageButton:: SetHPos(风格) 这可以用来设置图像的水平位置。它可以是BS_LEFT、BS_RIGHT或BS_CENTER中的一个。它返回以前的水平样式。 BOOL CImageButton: m_fill; 构造函数将该值设置为FALSE。如果希望进行图像填充,可以显式地将其设置为TRUE。 注意,如果在OnInitDialog完成后更改该变量的值,则应该在CImageButton对象上调用InvaldiateRect,迫使它重新绘制。 (注:你可能已经读过我对愚蠢的m_符号被无故使用的抨击;我甚至看到有人被它误导,他们使用这种命名约定在堆栈上声明局部变量!但是,我使用它的一个地方是命名用于从类外部向类实例传递信息的成员变量。这就是一个这样的例子。) 一个切换按钮类 因为有几个关于如何创建“切换”按钮的请求,所以我创建了一个toggle位图类,它也随这个项目下载。在ToggleButton.cpp和ToggleButton.h中查找CToggleButton类。要创建一个切换按钮,您需要在对话框编辑器中创建一个按钮,添加一个标题,并将其标记为owner-draw。然后进入类向导,为它创建一个类型为CToggleButton的控制变量。注意,在将CToggleButton添加到项目后,可能需要重新构建.clw文件。删除.clw文件并调用ClassWizard,然后告诉它从现有的项目文件中重建该文件。 CToggleButton方法 BOOL CToggleButton: GetState () 这将返回当前的按钮状态,如果按钮被打开(图像被压抑),则返回TRUE,如果按钮被压抑(图像未被压抑),则返回FALSE。 BOOL CToggleButton::设置状态(BOOL newState) 这将设置状态。如果newState为真,则状态为“on”(抑郁),如果newState为假,则状态为“off”(非抑郁)。这将返回按钮之前的状态。 字DWORD CToggleButton:: SetVPos(风格) 这可以用来设置文本的垂直位置。它可以是BS_TOP、BS_BOTTOM或BS_VCENTER中的一个。它返回先前的垂直样式。 字DWORD CToggleButton:: SetHPos(风格) 这可以用来设置文本的水平位置。它可以是BS_LEFT、BS_RIGHT或BS_CENTER中的一个。它返回以前的水平样式。 可以通过单击页面顶部的链接直接下载这些类的源文件和用于测试它们的项目。 Jeff Malett更新 CImageButton类被扩展为支持切换,所以现在您可以拥有一个可以切换的图像按钮。基本上,我是通过将代码从CToggleButton类合并到CImageButton类中,调用结果CImageToggleButton来完成这个操作的。按钮切换是否由一个新的类成员变量m_toggle控制,它可以在任何时候被改变。合并这两个类是一个在CodeProject留言板上某人要求的特性。我改变了CImageToggleButton和CToggleButton,这样当它们被切换时,它们的背景会用当前设置按钮的高亮颜色绘制。这是切换按钮的更标准的行为。我扩展了对话框演示,以显示两个图像按钮,一个有切换,另一个没有。我扩展了对话框演示来显示一个MFC文本切换按钮(你可以通过创建一个复选框并赋予它“Push-like”属性来实现)和CToggleButton。注意它们的行为略有不同,例如,当你点击一个按下的切换按钮时,它会在你的版本中以鼠标向下的方式释放,在MFCs中以鼠标向上的方式释放。我比较喜欢MFC版本的UI,但是CToggleButton更优越,因为文本可以用不同的方式对齐(不知道为什么你想这样做)。 在这些文章中表达的观点是作者的观点,不代表,也不支持,微软。 你可以在下面留下关于这篇文章的问题或评论。 版权©1999。保留所有权利 www.flounder.com/mvp_tips.htm 许可证 本文没有附带明确的许可,但可能包含文章文本或下载文件本身的使用条款。如果有疑问,请通过下面的讨论区联系作者。 可以在这里找到作者可能使用的许可证列表。 本文转载于:http://www.diyabc.com/frontweb/news1036.html

原文地址:https://www.cnblogs.com/Dincat/p/13456211.html