要想使用很简单,在创建按钮的时候,加入BS_OWNERDRAW的STYLE.这样在需要绘制的时候,其父窗体就会收到一个"WM_DRAWITEM"消息. 同时使用一个DRAWITEMSTRUCT结构来控制内容.其代码大致如下:
DRAWITEMSTRUCT* pdis;
...
case WM_DRAWITEM:
pdis = (DRAWITEMSTRUCT*) lParam;
switch(pdis->CtlID) {
case ID_PLAY_RESUMEPAUSE:
if (pdis->itemState & ODS_SELECTED) ...
}
...
...
首先根据CtlID熟悉看是谁在画, 然后使用itemState熟悉决定画什么, 关于itemState还是MSDN比较全.
不过这样的代码却有点小问题, 当双击按钮的时候, 并没有像普通的按钮被解析为两次点击.
为什么出现这个情况其实很容易理解, 在Windows中按钮和菜单被认为是一个东西的不同形式(当然还包括check box云云).. 菜单怎么可能被双击呢?
但是按钮毕竟不是菜单,那如果我非要他把双击作为两次单击怎么办呢? 要做的其实很简单, 并不需要手动勾住双击事件. 只要设置一下按钮的属性.
LONG dwValue = GetClassLong(hButton, GCL_STYLE);
SetClassLong(hButton, GCL_STYLE, dwValue & ~CS_DBLCLKS);
CS_DBLCLKS是窗体类的通用熟悉,它表明窗体愿意接受双击. 去掉这个属性, 两次点击, 就是两次点击, 一次也少不了.
这个东西其实很Normal, 但是为什么要拿出来说捏, 不是我半夜闲得蛋疼. 是我发现常见的播放器中只有Media Player的播放按钮能够有效屏蔽双击. 网上甚至有人说这个必须要自己做消息解析才行... 我估计是他只用过MFC,没用过API...
PS:为BinPlayer做的自绘按钮.算是效果图吧

No comments:
Post a Comment