我今天花了很多时间搜索在win32 C ++中对轨道栏(滑块)上的拇指着色的具体解释或示例。我发现的所有内容都得到了部分解释,在尝试各种可能的变化时,我都是空白。
我一直关注的控件在我的rc文件中定义为 CONTROL"",IDC_PLAYSLIDER," msctls_trackbar32",TBS_NOTICKS | WS_TABSTOP,5,22,187,15
基本上,我对NM_CUSTOMDRAW的消息处理归结为以下内容。我对我的颜色/ hdc处理没有信心,但缺少消息是我的主要问题。
INT_PTR CALLBACK dialogproc(HWND h, UINT m, WPARAM w, LPARAM l)
{
switch (m) {
case WM_NOTIFY:
{
switch (((LPNMHDR)l)->code) {
case NM_CUSTOMDRAW:
{
LPNMCUSTOMDRAW lpNMCD = (LPNMCUSTOMDRAW)l;
UINT idc = lpNMCD->hdr.idFrom;
switch (lpNMCD->dwDrawStage) {
case CDDS_PREPAINT:
return CDRF_NOTIFYSUBITEMDRAW;
break;
case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
{
switch (lpNMCD->dwItemSpec)
{
case TBCD_THUMB:
HGDIOBJ old_pen = SelectObject(lpNMCD->hdc, penSlider);
HGDIOBJ old_brush = SelectObject(lpNMCD->hdc, brushSlider);
return CDRF_NEWFONT;
}
}
break;
}
我在运行时获得的是正确控件上的CDDS_PREPAINT,但无论我尝试过什么,我都没有进一步的CDDS_ drawStage消息。
如果有人在轨道栏上完成此操作(大多数示例都是列表控件)并且愿意分享他们的消息处理程序代码,或者可以解释我的困惑,那将非常感激。
答案 0 :(得分:1)
来自NM_CUSTOMDRAW
的文档:
如果在对话程序中处理此消息,则必须设置 在返回TRUE之前返回值作为窗口数据的一部分。对于 更多信息,请参阅DialogProc。
DialogProc
文档说:
如果对话框过程处理需要的消息 具体返回值,对话框程序应设置所需 通过调用SetWindowLong返回值(hwndDlg,DWL_MSGRESULT,lResult) 在返回TRUE之前立即
请注意,随着64位窗口的出现,最好使用SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, lResult)
。