2014-09-05 4 views
1

Я провел сегодня поиск везде, где вы найдете конкретное объяснение или пример раскраски большого пальца на трекбаре (слайдер) в win32 C++. Все, что я нашел, было частично объяснено, и, пытаясь понять все мыслимые вариации, я пришел в себя.win32 C++ Custom Color for Trackbar thumb

Элемент управления, на котором я был сфокусирован, определен в моем файле 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.

Если кто-то сделал это на трек-панели (большинство примеров - это элементы управления списком) и желает поделиться своим кодом обработчика сообщений или может пролить свет на мое замешательство, это было бы весьма полезно.

+0

Помимо специальных шагов, которые необходимо предпринять, чтобы возвращать значения из 'DialogProc' (указано в ответе Джонатана), вы, вероятно, будете разочарованы результатами. Пользовательский рисунок элемента управления дорожкой отключит визуальные стили (темы), благодаря чему он будет выглядеть так же, как в Windows 95. Будет намного сложнее изменить цвет элемента управления, сохранив поддержку визуальных стилей. Что вызывает вопрос о том, почему вам необходимо изменить цвет в первую очередь - пользователь должен выбрать его, выбрав тему. –

+0

@CodyGray: пользователям не удалось выбрать тему с Windows XP :) –

+0

@ CodyS.Pumpkins: Я не знаю, где вы видели это поведение. В Win 7 мне удалось настроить тики трек-бэка, используя CDRF_SKIPDEFAULT на CDDS_ITEMPREPAINT TBCD_TICS, все еще получая остальную часть трекбола (самой Windows) с тематическим визуальным стилем. – Fizz

ответ

1

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

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

В DialogProc документах говорят:

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

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

+0

Невероятно! У меня есть отслеживание кода большого пальца. Я использую глобально определенные HBRUSH и HPEN для передачи hdc через SelectObject(). Я предполагаю, что это неправильно (на основе этого не работает: p).Предложения по правильному подходу? –

+0

Я никогда не пробовал настраивать трек-бэк, но я бы предположил, что на самом деле он не использует текущую кисть/ручку. Лучше всего, наверное, сделать это самостоятельно, а не пытаться принудить его к изменению цвета. –