winapi — win32 C ++ Пользовательский цвет для трекбара

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

Решение

Из документов для NM_CUSTOMDRAW:

Если это сообщение обрабатывается в диалоговой процедуре, вы должны установить
вернуть значение как часть данных окна, прежде чем вернуть TRUE. За
больше информации, см. DialogProc.

DialogProc документы говорят:

Если процедура диалогового окна обрабатывает сообщение, которое требует
конкретное возвращаемое значение, процедура диалогового окна должна установить желаемое
вернуть значение, вызвав SetWindowLong (hwndDlg, DWL_MSGRESULT, lResult)
непосредственно перед возвращением ИСТИНА

Обратите внимание, что с появлением 64-битных окон лучше использовать SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, lResult),

1

Другие решения