自定义轨迹栏刻度

Custom trackbar ticks

我正在使用库存 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,则更新矩形 (NMCUSTOMDRAW->rc) 始终为空矩形。我检查了,对于其他项目(TBCD_CHANNELTBCD_THUMB),我得到了一个有效的矩形并且可以代替通道和拇指绘制。

好的:如果 TBCD_TICS 没有给我一个可以绘制的矩形,那么它有什么意义呢?

也许我可以通过其他方式获得刻度位置。好吧,有 TBM_GETTICPOS,这似乎可行。除了文档提到这个:

The positions of the first and last tick marks are not directly available via this message.

那么我怎样才能得到第一个和最后一个报价位置呢?它们与通道的开始和结束不对应,刻度略微嵌入。也许我们可以从通道的两侧计算插入,但这似乎很脆弱(尤其是在不同比例的显示器上)。

So how can I get the first and last tick positions?

获取它们的旧方法(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);