2015-10-03 2 views
0

Я хочу изменить цвет этикетки фона внутри функции, я попробовал этот код, но ничего не изменилось после вызова changecolor функциякак я могу установить статические элементы управления цвет фона программным

HWND hWndLabel; 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    case WM_CREATE: 
     hWndLabel = CreateWindowEx(WS_EX_TRANSPARENT, 
      L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_LEFT | WS_SYSMENU, 
      75, 75, 70, 70, hWnd, (HMENU)labelId, hInst, NULL); 
     break; 

    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 

    case WM_COMMAND: // all events are handled here 
     break; 
    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
     break; 
    } 
    return 0; 
} 

DWORD WINAPI changecolor(){ 
    HDC hdc = GetDC(hWndLabel); // get context 
    SetBkColor(hdc, RGB(0, 0, 230)); // Code Copied from the above answer by cpx. 
    return 0; 
} 

Я читал, что статические элементы управления отправить их родитель WM_CTLCOLORSTATIC сообщение перед тем, как они сами нарисуют. код реализуется в CALLBACK функции, но где этот код называется (изменение цвета) ?, как я могу назвать SetTextColor в функции

пример кода:

case WM_CTLCOLORSTATIC: 
    if (the_button_was_clicked) { 
    HDC hdc = reinterpret_cast<HDC>(wParam); 
    SetTextColor(hdc, COLORREF(0xFF, 0x00, 0x00)); 
    } 
    return ::GetSysColorBrush(COLOR_WINDOW); // example color, adjust for your circumstance 

ответ

2

Попробуйте что-то больше, как это:

HWND hWndLabel; 
HBRUSH hBrushLabel; 
COLORREF clrLabelText; 
COLORREF clrLabelBkGnd; 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    case WM_CREATE: 
     hWndLabel = CreateWindowEx(0, L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_LEFT, 
      75, 75, 70, 70, hWnd, (HMENU)labelId, hInst, NULL); 
     hBrushLabel = NULL; 
     clrLabelText = GetSysColor(COLOR_WINDOWTEXT); 
     clrLabelBkGnd = GetSysColor(COLOR_WINDOW); 
     break; 

    case WM_DESTROY: 
     if (hBrushLabel) DeleteObject(hBrushLabel); 
     PostQuitMessage(0); 
     break; 

    case WM_CTLCOLORSTATIC: { 
     HDC hdc = reinterpret_cast<HDC>(wParam); 
     SetTextColor(hdc, clrLabelText); 
     SetBkColor(hdc, clrLabelBkGnd); 
     if (!hBrushLabel) hBrushLabel = CreateSolidBrush(clrLabelBkGnd); 
     return reinterpret_cast<LRESULT>(hBrushLabel); 
    } 

    case WM_COMMAND: // all events are handled here 
     break; 

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

DWORD WINAPI changecolor() 
{ 
    if (hBrushLabel) { 
     DeleteObject(hBrushLabel); 
     hBrushLabel = NULL; 
    } 
    clrLabelText = RGB(0xFF, 0x00, 0x00); 
    clrLabelBkGnd = RGB(0, 0, 230); 
    InvalidateRect(hWndLabel, NULL, TRUE); 
    return 0; 
} 

Существует аналогичный пример в WM_CTLCOLORSTATIC documentation.

Следующий пример C++ показывает, как установить цвет текста переднего плана и фона для статического элемента управления в ответ на сообщение WM_CTLCOLORSTATIC. Переменная hbrBkgnd - это статическая переменная HBRUSH, которая инициализируется значением NULL, и сохраняет кисть фона между вызовами в WM_CTLCOLORSTATIC. Кисть должна быть уничтожена вызовом функции DeleteObject, когда она больше не нужна, обычно, когда соответствующее диалоговое окно уничтожается.

case WM_CTLCOLORSTATIC: 
    { 
    HDC hdcStatic = (HDC) wParam; 
    SetTextColor(hdcStatic, RGB(255,255,255)); 
    SetBkColor(hdcStatic, RGB(0,0,0)); 

    if (hbrBkgnd == NULL) 
    { 
     hbrBkgnd = CreateSolidBrush(RGB(0,0,0)); 
    } 
    return (INT_PTR)hbrBkgnd; 
    } 
+0

я получил возвращенную ошибку на возвращение 'hBrushLabel,' 'на случай WM_CTLCOLORSTATIC:' ??? – mikmak

+0

Я обновил свой ответ. –

+0

спасибо большое, вы спасли мою неделю – mikmak