Как перекрасить нажимную кнопку в Win32? - PullRequest
1 голос
/ 27 августа 2010

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

Так, как мне нарисовать кнопку ее цветом по умолчанию?

//WinMain 
hmain = CreateWindowEx (0, L"Window", L"Window", WS_OVERLAPPEDWINDOW, 0, 0, 200, 200,
    NULL, NULL, hinstance, NULL);

HWND hwnd2 = CreateWindowEx (0, L"Button", L"Red", WS_CHILD | BS_PUSHBUTTON, 0, 0, 50, 50,
    hmain, (HMENU) redbtt, hinstance, NULL);
//Winmain

//WndProc
COLORREF red = RGB (255, 0, 0);
HBRUSH redbrush = CreateSolidBrush (red);

switch (msg) {
    case WM_COMMAND: {
        if (LOWORD (wparam) == redbtt) {
            color = 'r';
            RECT rect;
            GetClientRect (hmain, &rect);
            HDC hdc = GetDC (hmain);
            FillRect (hdc, &rect, redbrush);
            ReleaseDC (hmain, hdc);

            /*GetClientRect ((HWND) lparam, &rect);
            hdc = GetDC ((HWND) lparam);
            COLORREF color = GetBkColor (hdc);
            HBRUSH brush = CreateSolidBrush (color);
            FillRect (hdc, &rect, brush);
            ReleaseDC ((HWND) lparam, hdc);*/
        }

        break;
                     }
    case WM_PAINT: {
        HBRUSH brush;

        if (color == ' ') {
            brush = (HBRUSH) (COLOR_WINDOW + 1);
        } else if (color == 'r') {
            brush = redbrush;
        }

        PAINTSTRUCT ps;
        HDC hdc = BeginPaint (hmain, &ps);
        FillRect (hdc, &ps.rcPaint, brush);
        EndPaint (hmain, &ps);
        break;
                   }
//WndProc

Ответы [ 4 ]

1 голос
/ 27 августа 2010

Это потому, что вы не включили стиль WS_CLIPCHILDREN для главного окна. Исправлено:

hmain = CreateWindowEx (0, L"Window", L"Window", 
          WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, 0, 0, 200, 200,
          NULL, NULL, hinstance, NULL);

Переменная 'color' - это хак, избегайте этого в реальном коде. Вы протекаете кисть между прочим.

1 голос
/ 27 августа 2010

Прошло много времени с тех пор, как я сделал Win32, но мне кажется, что ваш материал для рисования будет лучше, чем WM_ERASEBKGND, поскольку, похоже, это то, что вы делаете.Вы пробовали это там?(Вам придется посмотреть и посмотреть, но я не уверен, подходит ли BeginPaint для WM_ERASEBKGND)

Кроме того, вы должны звонить DeleteObject по результату CreateSolidBrush,Я бы также подождал, пока внутри объекта рисования, чтобы выделить его - я бы не выделил кисть для каждого сообщения, полученного вашим окном.

0 голосов
/ 27 августа 2010
  1. Вы должны установить стиль WS_CLIPCHILDREN для своего окна. Таким образом, кнопка будет автоматически исключена из области рисования, поэтому ваша кнопка не будет «перезаписана».
  2. Вы можете использовать функцию InvalidateRect, `для достижения необходимого эффекта.
0 голосов
/ 27 августа 2010

WM_PAINT - время рисования чего-либо поверх фона.Если вы хотите, чтобы окно было сплошным красным и не мигало между фоном по умолчанию и регистром, то вы, вероятно, захотите использовать WM_ERASEBKGND.

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

Наконец, вы всегда можете сделать недействительным или отправить WM_PAINT элементам управления, которые вы хотите перерисовать.

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