我想使用自定义位图实现一个简单的音量增大/减小按钮,所有它将具有简单的悬停效果和鼠标按下效果。
我的第一个想法是为悬停处理WM_MOUSEMOVE
,并为鼠标按下效果处理WM_LBUTTONUP
和WM_LBUTTONDOWN
。
首先,这是最简单的方法吗?我可以超级按一个按钮,然后只绘制位图并忘记文本......
然后我遇到了背景问题,它应该是透明的,我知道我可以通过将SRCAND
传递给BitBlt
来使用遮罩,但这需要我为每个按钮分配2张图像。有没有办法只用一张图片来做到这一点?就像我在我的图像编辑器中放置绿色背景一样,我可以用绿色屏幕来掩盖效果吗?
答案 0 :(得分:2)
您需要创建一个常规按钮,并使用SetWindowSubclass将其子类化。该按钮必须具有所有者绘制样式,这意味着在父WndProc中,您正在处理WM_DRAWITEM。正如您所说的那样,您将BitBlt'或StretchBlt在图像的背景上。
对于悬停事件,您必须执行以下操作:
IsMousedOver
IsMousedOver
,然后使用InvalidateRect使控件无效(这将在父级中触发WM_DRAWITEM
)WM_MOUSEMOVE
,则应清除IsMousedOver
WM_DRAWITEM
中,您应该根据该状态检查IsMousedOver和BitBlt 如果要处理MouseUp / MouseDown,可以将布尔值更改为int,并具有三态。但是,大多数实现都将MouseDown与常规按钮相同,然后MouseUp只是常规背景上的鼠标。
至于你对2张图片的查询,很可能只用一张图片,但我之前没有尝试过。