自定义按钮形状

时间:2011-10-04 14:12:47

标签: c++ windows button bitmap

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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