Пользовательские трекбары - PullRequest
1 голос
/ 14 июня 2019

Я использую стоковый Трекбар .Я бы хотел нарисовать галочки.

Здесь я провел эксперимент, просто пытаясь нарисовать в правильном месте:

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_CHANNEL и TBCD_THUMB) я получаю действительный прямоугольник и могу рисовать вместо канала и большого пальца.

Хорошо: так в чем смысл TBCD_TICSесли это не даст мне прямоугольник для рисования?

Так что, возможно, я смогу получить положения тиков по-другому.Ну, есть TBM_GETTICPOS , который, похоже, будет работать.Кроме документации упоминается это:

Позиции первой и последней меток не доступны напрямую через это сообщение.

Так, как я могу получить первый и последнийотметьте позиции?Они не соответствуют началу и концу канала, галочки немного вставлены.Возможно, мы можем рассчитать вставку по сторонам канала, но это кажется хрупким (особенно на дисплеях с разным масштабированием).

1 Ответ

3 голосов
/ 15 июня 2019

Так как я могу получить первую и последнюю позиции тиков?

Старый метод (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);
...