1

今天,我到处寻找在 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 消息。

如果有人在轨迹栏上完成了此操作(大多数示例是列表控件)并且愿意分享他们的消息处理程序代码,或者可以以其他方式阐明我的困惑,那将不胜感激。

4

1 回答 1

1

从文档中NM_CUSTOMDRAW

如果在对话过程中处理此消息,则必须在返回 TRUE 之前将返回值设置为窗口数据的一部分。有关详细信息,请参阅DialogProc

DialogProc文档说:

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

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

于 2014-09-05T06:01:07.860 回答