自定义button形状

我想用一个自定义的位图来实现一个简单的音量增大/减小button,它将会有一个简单的hover效果和鼠标下移效果。
我的第一个想法是处理hover的WM_MOUSEMOVE ,并处理WM_LBUTTONUPWM_LBUTTONDOWN为鼠标的效果。

首先,这是最简单的方法吗? 我可以超级button,只是绘制位图,忘记文本…

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

您需要创建一个常规按钮,并使用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张图片的查询,可能是用1张图做的,但是我以前没有试过。