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