【问题标题】:Custom button shape自定义按钮形状
【发布时间】:2011-10-04 14:12:47
【问题描述】:

我想使用自定义位图实现一个简单的音量增大/减小按钮,它所要做的就是一个简单的悬停效果和鼠标按下效果。
我的第一个想法是处理WM_MOUSEMOVE 用于悬停,处理WM_LBUTTONUPWM_LBUTTONDOWN 用于鼠标按下效果。

首先,这是最简单的方法吗?我可以超类一个按钮,只绘制位图而忘记文本......

然后我的背景有问题,它应该是透明的,我知道我可以通过将SRCAND 传递给BitBlt 来使用蒙版,但这需要我为每个按钮有 2 个图像。有没有办法只用一张图片来做到这一点?就像我在图像编辑器中将绿色背景放在上面一样,我可以用类似绿屏的效果来掩盖它吗?

【问题讨论】:

    标签: c++ windows button bitmap


    【解决方案1】:

    您需要创建一个常规按钮,并使用SetWindowSubclass 对其进行子类化。该按钮必须具有所有者绘制样式,这意味着在父 WndProc 中,您正在处理WM_DRAWITEM。正如你所说的那样,你将BitBlt'ing 或StretchBlt'ing 图片的背景。

    对于悬停事件,您必须执行以下操作:

    • 在父类和子类 WndProc 之间有某种共享布尔值,例如。 IsMousedOver
    • 在子类 WndProc 中,处理 WM_MOUSEMOVE。当这个消息被命中时,你应该设置IsMousedOver,然后用InvalidateRect使控件无效(这将触发父级中的WM_DRAWITEM
    • 在父WndProc中,如果收到WM_MOUSEMOVE,则应清除IsMousedOver
    • 在父 WndProc 的 WM_DRAWITEM 中,您应该根据该状态检查 IsMousedOver 和 BitBlt

    如果您想处理 MouseUp/MouseDown,您可以将布尔值改为 int 并具有三态。但是,大多数实现都将 MouseDown 与常规按钮相同,然后 MouseUp 只是常规的鼠标悬停背景。

    至于您对 2 张图片的查询,很可能只使用一张,但我之前没有尝试过。

    【讨论】:

    • 我应该如何创建共享布尔值?我听说过很多次全局变量是纯粹的邪恶。那么,还有其他方法可以创建共享变量吗?
    • 我的一个想法是采用面向对象的方法并创建一个按钮类,其中初始化程序调用CreateWindow,并将状态和其他信息保存为私有成员。但是我仍然需要为每个按钮设置一个类,而且它们很可能必须是全局的。
    • 不幸的是,我编程的是 C,而不是 C++,所以实际上没有任何其他选择。我相信您可以想到一些面向对象的方法来正确封装布尔值:)
    猜你喜欢
    • 2016-07-27
    • 2012-12-01
    • 2016-08-16
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    相关资源
    最近更新 更多