2015-08-06 4 views
0

При изменении цвета, я слушаю WM_CTLCOLORSTATIC и действовать соответственно:Изменение win32 игровая

LRESULT ProcessWindowMessage(_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam) 
    { 
     switch (uMsg) 
     { 
     case WM_CTLCOLORSTATIC: 
      LRESULT lBrush = ::DefWindowProc(hWnd, uMsg, wParam, lParam); // get default brush used so far 
      ::SetBkMode((HDC)wParam, TRANSPARENT); 
      ::SetTextColor((HDC)wParam, RGB(m_color.red, m_color.green, m_color.blue)); 
      return lBrush; 
     } 
    } 

Это хорошо работает с регулярными статическими текстами: этикетки и так далее, но не оказывает никакого влияния на обычных радио-кнопок ,

Во время моих попыток отладки, я пытался слушать:

  1. WM_DRAWITEM - не получают никаких событий
  2. WM_CTLCOLORBTN - получать события только для обычных кнопок (OK/CANCEL)
  3. WM_CTLCOLOREDIT - не получает никаких событий.

Я подклассифицирую в другое окно, которое не создано/создано мной, но создано моим процессом.

+0

Вы не можете контролировать эти цвета, когда темы являются активными. –

+0

Кнопки управления поддерживают 'NM_CUSTOMDRAW', возможно, можно изменить цвет текста таким образом (я никогда не пробовал). –

+0

Почему вы не обрабатываете WM_PAINT и WM_ERASEBKGND и не нарисовываете его ur –

ответ

0

@igal k сказал, что SetWindowTheme не работает. Поскольку комментариев для кода примера недостаточно. Я отправляю его как ответ.

Первый результат.

enter image description here

Код:

OnInitDialog: 
    ::SetWindowTheme(GetDlgItem(IDC_RADIO1)->GetSafeHwnd(), L"wstr", L"wstr"); 

HBRUSH CMFCApplication1Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{ 
    // Call the base class implementation first! Otherwise, it may 
    // undo what we're trying to accomplish here. 
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); 

    // Are we painting the IDC_MYSTATIC control? We can use 
    // CWnd::GetDlgCtrlID() to perform the most efficient test. 
    if (pWnd->GetDlgCtrlID() == IDC_RADIO1) 
    { 
     // Set the text color to red 
     pDC->SetTextColor(RGB(255, 0, 0)); 

     // Set the background mode for text to transparent 
     // so background will show thru. 
     pDC->SetBkMode(TRANSPARENT); 

     // Return handle to our CBrush object 
     hbr = m_brush; 
    } 

    return hbr; 
} 
+0

@Jicaho, Это сделало трюк!кроме того, я также обнаружил, что вместо вызова исходной функции WndProc я случайно вызвал :: DefWindowProc() ... –

0

Если вы заинтересованы в том, чтобы нарисовать полный переключатель, то вам нужно установить произвольное окно proc для переключателя. В этом процессе вы получаете сообщения WM_PAINT и WM_ERASEBKGND. На фоне стирания вы можете просто заполнить цвет фона для элемента управления.

В WM_PAINT вы делаете рисунок управления, получить окно текста управления и сделать DrawText с глубиной цвета, что вам нужно, используя SetTextColor

Нарисуйте образ радио (круг и точку внутри) . Вы можете получить все переменные состояния элемента управления и нарисовать в соответствии с ним, например, выбрали ли оно его или нет. Всякий раз, когда вам нужно перерисовать, то есть новый текст установлен, просто вызовите invalidateRect, чтобы заставить repaint.

+1

Что относительно [Визуальных стилей] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb773187.aspx)? – IInspectable

+5

1999 год, они хотят, чтобы их ответ вернулся –

 Смежные вопросы

  • Нет связанных вопросов^_^