Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Задание цвета Static Text c использованием WinAPI

#winapi #visual_cpp


На форме расположен Static Text, требуется периодически изменять цвет текста, фон
остаётся исходным, дошёл до:
case WM_CTLCOLORSTATIC:
    {

        if( ((HWND)lParam)==GetDlgItem(hDlg, IDC_STATUS_DDE) )
            {
                SetBkMode((HDC) wParam, TRANSPARENT);
                SetTextColor((HDC) wParam, RGB(0,0,255));      
            }
        return (INT_PTR)GetStockObject(NULL_PEN);
    }

В итоге текст IDC STATUS DDE изменяет цвет на синий, но на остальных Static Text,
изменился цвет фона на другой! Кто силён помогите разобраться!
Изменил код, как было рекомендовано @mega
case WM_CTLCOLORSTATIC: 
    if( ((HWND)lParam)==GetDlgItem(hDlg, IDC_STATUS_DDE) )
        {
            SetBkMode((HDC) wParam, TRANSPARENT);
            SetTextColor((HDC) wParam, RGB(0,0,255));
            return (INT_PTR)GetStockObject(NULL_BRUSH);
        }
    else return DefWindowProc(hDlg, message, wParam, lParam);

Заработало почти как и требовалось, но при очередном выводе в Static Text
     SetDlgItemTextA (g_hwndMainForm, IDC_STATUS_DDE, szStatusDDE);

происходит наложение одной строки на другую, что я ещё не учёл!?    


Ответы

Ответ 1



Во первых, результатом WM_CTLCOLORSTATIC должен быть дескриптор кисти, а не пера. Во вторых, Вы его возвращаете независимо от того, какой дескриптор пришел в lParam. Поэтому все компоненты закрашиваются одинаково. Возвращайте дескриптор в условии, а для всех остальных передавайте обработку WM_CTLCOLORSTATIC в стандартную процедуру окна.

Ответ 2



Вот какой вариант получился, с цветом фона самого окна: case WM_CTLCOLORSTATIC: if (((HWND)lParam) == GetDlgItem(hWnd, 3)) { SetTextColor((HDC)wParam, RGB(0, 0, 255)); } return (LRESULT)GetSysColorBrush(COLOR_WINDOW); break;

Комментариев нет:

Отправить комментарий