用于Trackbar的win32 C ++自定义颜色

时间:2014-09-05 05:54:22

标签: c++ winapi custom-controls trackbar

我今天花了很多时间搜索在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消息。

如果有人在轨道栏上完成此操作(大多数示例都是列表控件)并且愿意分享他们的消息处理程序代码,或者可以解释我的困惑,那将非常感激。

1 个答案:

答案 0 :(得分:1)

来自NM_CUSTOMDRAW的文档:

  

如果在对话程序中处理此消息,则必须设置   在返回TRUE之前返回值作为窗口数据的一部分。对于   更多信息,请参阅DialogProc

DialogProc文档说:

  

如果对话框过程处理需要的消息   具体返回值,对话框程序应设置所需   通过调用SetWindowLong返回值(hwndDlg,DWL_MSGRESULT,lResult)   在返回TRUE之前立即

请注意,随着64位窗口的出现,最好使用SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, lResult)