Почему вместо квадрата залитого цветом WinApi рисует квадрат заполненный чёрными точками?

Рейтинг: 0Ответов: 0Опубликовано: 13.01.2023

Когда я рисую квадрат c помощью функции Rectangle с выбранной кистью brush с определённым цветом, WinApi рисует квадрат НЕ заполненный этим цветом, а заполненный чёрными точками. Причём их количество зависит от цвета, т.е. чем темнее цвет, тем больше точек. Как это исправить?

Выглядит это так:

Прямоугольник на картинке должен быть красным.

Код:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int x = 0, y = 0;
float time = 0;
int mouse_pos_x, mouse_pos_y;
RECT rect;

void moveSquare(int* cur_x, int* cur_y) {
    float angle = atan2f((float)*cur_x - (float)x, (float)*cur_y - (float)y);
    x += (int)(4.0 * sinf(angle));
    y += (int)(4.0 * cosf(angle));
}

void drawSquare(HDC* dc) {
    HBRUSH brush = CreateSolidBrush(RGB(255, 0, 0)); //CreateSolidBrush(RGB((int)((cosf(time) / 2 + 0.5) * 255.0), (int)((sinf(time) / 2 + 0.5) * 255.0), 0));
    SelectObject(*dc, brush);
    Rectangle(*dc, x, y, x + 100, y + 100);
    DeleteObject(brush);
}

void WinShow(HDC* dc) {
    HDC memDC = CreateCompatibleDC(*dc);
    HBITMAP memBM = CreateCompatibleBitmap(memDC, rect.right - rect.left, rect.bottom - rect.top);
    SelectObject(memDC, memBM);

    HBRUSH brush = CreateSolidBrush(RGB(255, 255, 255));
    SelectObject(*dc, brush);
    Rectangle(memDC, 0, 0, rect.right - rect.left, rect.bottom - rect.top);
    drawSquare(&memDC);
    moveSquare(&mouse_pos_x, &mouse_pos_y);
    DeleteObject(brush);

    BitBlt(*dc, 0, 0, rect.right - rect.left, rect.bottom - rect.top, memDC, 0, 0, SRCCOPY);
    DeleteDC(memDC);
    DeleteObject(memBM);
}

LRESULT WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {
    if (message == WM_DESTROY)
        PostQuitMessage(0);
    else if (message == WM_CHAR)
        printf("%c", (char)wparam);
    else if (message == WM_MOUSEMOVE) {
        mouse_pos_x = LOWORD(lparam); mouse_pos_y = HIWORD(lparam);
    }
    else if (message == WM_SIZE)
        GetClientRect(hwnd, &rect);
    else if (message == WM_PAINT) {
        HDC dc = GetDC(hwnd);
        WinShow(&dc);
    }
    return DefWindowProcW(hwnd, message, wparam, lparam);
}

int main(int argc, char* argv[]) {
    WNDCLASSW window;
    memset(&window, 0, sizeof(WNDCLASSW));
    window.lpszClassName = L"WND";
    window.lpfnWndProc = WndProc;
    RegisterClassW(&window);

    HWND hWnd;
    hWnd = CreateWindowW(L"WND", L"Это окно!", WS_OVERLAPPEDWINDOW, 0, 0, 1920, 1080, NULL, NULL, NULL, NULL);

    ShowWindow(hWnd, SW_SHOWMAXIMIZED);
    MSG msg;
    while (1) {
        if (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        /*}
        else {*/
            Sleep(1);
        }
        time += 0.1;
    }
    return 0;
}

Ответы

Ответов пока нет.