自定义轨迹栏刻度

时间:2019-06-14 15:56:06

标签: winapi trackbar common-controls custom-draw

我正在使用股票Trackbar控件。我想自定义刻度线。

我在这里做了一个实验,只是试图在正确的位置绘制:

case WM_NOTIFY:
{
    NMHDR* nMhdr = (NMHDR*) lParam;
    NMCUSTOMDRAW* nMcd = (NMCUSTOMDRAW*) lParam;

    if (nMhdr->code == NM_CUSTOMDRAW)
    {
        switch (nMcd->dwDrawStage)
        {
            case CDDS_PREPAINT:
            {
                return CDRF_NOTIFYITEMDRAW;
            }

            case CDDS_ITEMPREPAINT:
            {
                if (nMcd->dwItemSpec == TBCD_TICS)
                {
                    FillRect(nMcd->hdc, &nMcd->rc, (HBRUSH) GetStockObject(BLACK_BRUSH));

                    return CDRF_SKIPDEFAULT;
                }
                else
                {
                    return CDRF_DODEFAULT;
                }

                break;
            }

            default:
            {
                result = CDRF_DODEFAULT;

                break;
            }
        }
    }

    break;
}

在我的CDDS_ITEMPREPAINT中,如果为dwItemSpec == TBCD_TICS,则更新rect(NMCUSTOMDRAW->rc)始终为空rect。我检查了一下,对于其他项(TBCD_CHANNELTBCD_THUMB),我得到了一个有效的矩形,可以代替通道和拇指来绘制。

好:TBCD_TICS的意义何在?

所以也许我可以通过其他方式获得报价位置。好吧,这里有TBM_GETTICPOS,似乎可以使用。除了文档中提到的内容:

  

第一个和最后一个刻度线的位置无法通过此消息直接获得。

那么我如何获得第一个和最后一个刻度位置?它们与通道的开始和结束不对应,刻度线略微插入。也许我们可以从通道的侧面计算出插入量,但这似乎很脆弱(尤其是在缩放比例不同的显示器上)。

1 个答案:

答案 0 :(得分:3)

  

那我如何获得第一个和最后一个刻度位置?

获取它们的旧方法(XP和更早版本)似乎仍然有效(我刚刚在Windows 10上进行了测试):

    RECT rectTrackbar;
    GetClientRect(hWndTB, &rectTrackbar);
    RECT rectThumb;
    SendMessage(hWndTB, TBM_GETTHUMBRECT, 0, (LPARAM)&rectThumb);
    int nThumbWidth = rectThumb.right - rectThumb.left;
    int nXTicFirst = rectTrackbar.left += (nThumbWidth + 2);
    int nXTicLast = rectTrackbar.right -= (nThumbWidth + 2 + 1);