Почему вместо квадрата залитого цветом WinApi рисует квадрат заполненный чёрными точками?
Когда я рисую квадрат 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;
}
Источник: Stack Overflow на русском