c++ - 自定义按钮形状

标签 c++ windows button bitmap

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

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

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

最佳答案

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

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

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

如果你想处理 MouseUp/MouseDown,你可以将 boolean 改为 int 并具有三态。但是,大多数实现都将 MouseDown 与常规按钮相同,而 MouseUp 则只是鼠标悬停在背景上的常规按钮。

至于您关于 2 张图片的查询,很可能用一张来完成,但我以前没有尝试过。

关于c++ - 自定义按钮形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7649252/

相关文章:

c++ - 使用基于范围的 for 迭代临时 std::initializer_list

c++ - 找不到我的错误-抽象错误

c# - CurrentApp.LicenseInformation 只允许我访问一次

Facebook Like 按钮不在任何浏览器中显示/显示

c++ - 无法在 Xcode 4 中进行调试

Windows 计算机分析器

c - 获取与桌面关联的已登录 Windows 用户名

c# - 如何动态禁用和启用按钮?

单击 javascript 按钮和单击 asp.net 按钮

c++ - 将端口号绑定(bind)到 TCP 套接字(出站)以发送数据包