14
Ноя
2017

winapi – нарисовать прямоугольник

С помощью мыши рисую прямоугольник в окне. Рисуется вроде нормально. Есть недочеты вроде таких:

  1. При рисовании мышка если возвращать мышь обратно, то область обновляется с артефактами.

  2. Рисование идет поверх уже нарисованных линий(прямоугольников). Тут, в принципе, решаема проблема с рисованием линий, а не использованием функции Rectangle.

Но как грамотно решать артефакты? Скрин прикреплён. Код:

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) 
{
    HDC hdc;
    static HDC secondHdc;
    PAINTSTRUCT ps;
    RECT rect; // структура "прямоугольник"
    static POINT start; // нажата левая копка мышки
    static POINT end; // перемещаем курсор с зажатой клавишей
    static int size_x(0), size_y(0);
    
    switch (iMsg)
    {
    case WM_CREATE: // вызов сообщения при создании окна
    {
        hdc = GetDC(hwnd);
        secondHdc = CreateCompatibleDC(hdc);
        HBITMAP bMap = CreateCompatibleBitmap(hdc, 1000, 1000);
        SelectObject(secondHdc, bMap);
        ReleaseDC(hwnd, hdc);
        break;
    }

    case WM_LBUTTONUP:
    {
        InvalidateRect(hwnd, NULL, false);
        UpdateWindow(hwnd);
        break;
    }

    case WM_LBUTTONDOWN:
    {
        start.x = LOWORD(lParam);
        start.y = HIWORD(lParam);
        break;
    }

    case WM_SIZE:
    {
        size_x = LOWORD(lParam);
        size_y = HIWORD(lParam);
        break;
    }

    case WM_MOUSEMOVE:
    {
        if (wParam == MK_LBUTTON)
        {
            end.x = LOWORD(lParam);
            end.y = HIWORD(lParam);

            hdc = GetDC(hwnd);

            MoveToEx(secondHdc, start.x, start.y, NULL);
            LineTo(secondHdc, end.x, start.y);
            MoveToEx(secondHdc, end.x, start.y, NULL);
            LineTo(secondHdc, end.x, end.y);
            MoveToEx(secondHdc, end.x, end.y, NULL);
            LineTo(secondHdc, start.x, end.y);
            MoveToEx(secondHdc, start.x, end.y, NULL);
            LineTo(secondHdc, start.x, start.y);
            
            ReleaseDC(hwnd, hdc);

            InvalidateRect(hwnd, NULL, false);
            UpdateWindow(hwnd);

        }
        break;
    }

    case WM_PAINT:
    {
        hdc = BeginPaint(hwnd, &ps);

        BitBlt(hdc,start.x, start.y,end.x - start.x, end.y - start.y,secondHdc,0, 0,SRCCOPY);

        EndPaint(hwnd, &ps); 
        break;
    }

    case WM_DESTROY: 
        PostQuitMessage(0); 
        break;
    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam); 
}

введите сюда описание изображения

Источник: https://ru.stackoverflow.com/questions/744788/winapi-%D0%BD%D0%B0%D1%80%D0%B8%D1%81%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA

Тебе может это понравится...

Добавить комментарий