Установка цвета текста дочернего окна - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь изменить цвет текста / фона для статического элемента управления. Я могу сделать это просто следующим образом:

   // This is the 'main' window
   BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
   {
       hInst = hInstance;
       HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW &~WS_MAXIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
    CW_USEDEFAULT, 0, 1035, 764, nullptr, nullptr, hInstance, nullptr);
       ...
   }

   LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
   {
     case WM_CTLCOLORSTATIC:
        {
            MessageBox( NULL, "CTLCOLORSTATIC called", "", MB_OK );
            HDC hdcStatic = (HDC)wParam;
            SetTextColor(hdcStatic, RGB(200, 200, 20));
            SetBkColor(hdcStatic, RGB(10, 10, 10));

            return (INT_PTR)CreateSolidBrush(RGB(30, 30, 30));
        }
        default:
                return DefWindowProc( hWnd, message, wParam, lParam );
   }

Но если я помещу окно в другое окно, цвет текста и фона дочернего элемента управления остается по умолчанию:

    // This is the 'parent' window, which resides in the 'main' window
    HWND parent = CreateWindowEx
    (
        0,
        _TEXT("STATIC"),
        "",
        WS_TABSTOP | WS_VISIBLE  | BS_SOLID | WS_CLIPCHILDREN,
        10, 10, 500, 500,
        hwnd,
        NULL,
        (HINSTANCE)GetWindowLong(hwnd, GWLP_HINSTANCE),
        NULL
    );

    // This is the 'child' window which resides in the 'parent' window
    HWND child = CreateWindowEx
    (
        0,
        _TEXT("STATIC"),
        "SubItem",
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_SOLID,
        10, 10, 100, 100,
        parent,
        NULL,
        (HINSTANCE)GetWindowLong(parent, GWLP_HINSTANCE),
        NULL
    );

Итак, у меня есть 3 окна:

    HWND hwnd;   // the 'main' application window (color changes fine)
    HWND parent; // the 'parent/container' window which is inside the 'main' window (color changes fine)
    HWND child;  // the 'child' window which is inside the 'parent' window (color DOES NOT change)      

Даже если я помещаю MessageBox в WM_CTLCOLORSTATIC, я вижу, что он срабатывает при каждом рисовании дочерних элементов, но цвет для дочернего элемента не изменяется, а только для родительского.

Насколько я понял, мне нужно обработать сообщение в процедуре главного окна, но я не совсем понимаю, как это сделать. если я сравниваю (HWND) lParam с детским HWND, они одинаковы (в случае переключения по умолчанию), поэтому я могу получить ссылку в разделе «по умолчанию», но я не уверен, как мне с этим справиться оттуда ..

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    case WM_CTLCOLORSTATIC:
    {
        if ((HWND)lParam == child )
            MessageBox( NULL, "Reference Match for CTLCOLORSTATIC", "", MB_OK ); // <-- THIS NEVER TRIGGERS
    }
        ....
    default:
        if ((HWND)lParam == child )
            MessageBox( NULL, "Reference Match for DEFAULT", "", MB_OK ); // <-- THIS DOES TRIGGER

            return DefWindowProc( hWnd, message, wParam, lParam );
        }
        return 0;
}

Причина, по которой я помещаю одно окно в другое, заключается в том, что я могу использовать свойство WS_CLIPCHILDREN в родительском объекте (поскольку ребенок будет перемещаться / прокручиваться).

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Читая документ MSDN , я знаю функцию SetWindowsLongPtr, параметр которой GWLP_WNDPROC может установить новый адрес для оконной процедуры.

Эта функция может изменять цвет текста и цвет фона дочернего окна, то есть она может вызывать WM_CTLCOLORSTATIC.

Но после тестирования я обнаружил, что оно недопустимо для вторичного окна, то есть не может изменить цвет текста родительского окна.

Я также ознакомился с большим количеством информации и очень немногими документами, относящимися к трехуровневым окнам.

Итак, я думаю, чтобы решить эту проблему и заставить все три окна изменить цвет текста, вам, возможно, придется переписать WndProc самостоятельно, но это очень сложно и включает в себя много вещей.

Редактировать: если вам просто нужно изменить цвет текста и цвет фона статического элемента управления, вы можете настроить элемент управления так, чтобы вы могли обрабатывать все свои операции.

Надеюсь вам помочь.

0 голосов
/ 23 апреля 2019

WM_CTLCOLORSTATIC отправляется статическим элементом управления в его родительское окно , а не в окно верхнего уровня.

hwndMain: WM_CTLCOLORSTATIC for hwnd1
|    
\--hwnd1: WM_CTLCOLORSTATIC for hwnd2 (You might have to subclass hwnd1)
   |
   \--hwnd2

Вы также пропускаете кисти, сохраняйте кисти из CreateSolidBrush где-то, когда вы создаете окно и удаляете его, когда окно разрушено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...