본문 바로가기

프로그램언어/C++

API 그리기 모드(Draw Mode)

래스터 연산

클라이언트 영역에 출력한 문자/그림의 색은 펜, 브러시의 색 자체이다. 클라이언트 영역에 그려저 있는 기존 도형의 색에 따라 출력하는 문자/그림의 색이 달라지게 하려면 다음 한수를 사용한다.

SetROP2(hdc, nDrawMode);

그리기 모드를 구할 때 사용하는 함수이다.

P : 펜 또는 브러시의 색, D : 화면 색

nDrawMode 연산식 그리는 방식(그려지는 색)
2 R2_NOTMERGEPEN ~(P|D) 펜과 화면의 색을 합한 색을 반전시킨 색
3 R2_NOT ~D 화면색의 반전색
4 R2_XORPEN P^D 펜과 화면색을 XOR 시킨 색
5 R2_MASKPEN P&D 펜과 화면색의 공통색
6 R2_COPYPEN P 펜의 색, 내정값

 

SetROP2(hdc, R2_XORPEN);

그리기 모드가 R2_XORPEN으로 설정되어 있으면, 바탕색의 보색으로 도형을 그린다. 예를 들어 검색이면 하얀색으로 하얀색이면 검정색으로 그린다.

 

직선그리기

#include <windows.h>

#include <TCHAR.H>

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)

{

    HWND hwnd;

    MSG msg;

    WNDCLASS WndClass;

    WndClass.style = CS_HREDRAW | CS_VREDRAW;

    WndClass.lpfnWndProc = WndProc;

    WndClass.cbClsExtra = 0;

    WndClass.cbWndExtra = 0;

    WndClass.hInstance = hInstance;

    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);

    WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

    WndClass.lpszMenuName = NULL;

    WndClass.lpszClassName = _T("Window Class Name");

    RegisterClass(&WndClass);

    hwnd = CreateWindow(_T("Window Class Name"), _T("Window Title Name"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);

    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))

    {

        TranslateMessage(&msg);

        DispatchMessage(&msg);

    }

    return (int)msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

    HDChdc;

    PAINTSTRUCT ps;

    static intstartX, startY, oldX, oldY;

    static BOOL Drag;

     intendX, endY;

 

    switch (iMsg)

    {

    case WM_CREATE:

        startX = oldX = 50;startY = oldY = 50;

        Drag = FALSE;

        break;

    case WM_PAINT:

        hdc = BeginPaint(hwnd, &ps);

        MoveToEx(hdc, startX, startY, NULL);

        LineTo(hdc, oldX, oldY);

        EndPaint(hwnd, &ps);

        break;

    case WM_LBUTTONDOWN:

        Drag = TRUE;

        break;

    case WM_LBUTTONUP:

        Drag = FALSE;

        break;

    case WM_MOUSEMOVE:

        hdc = GetDC(hwnd);

        if (Drag)

        {

            SetROP2(hdc, R2_XORPEN);

            SelectObject(hdc, (HPEN)GetStockObject(WHITE_PEN));

            endX = LOWORD(lParam);

            endY = HIWORD(lParam);

            MoveToEx(hdc, startX, startY, NULL);

            LineTo(hdc, oldX, oldY);// 지우기

            MoveToEx(hdc, startX, startY, NULL);

            LineTo(hdc, endX, endY);// 그리기

            oldX = endX; oldY = endY;

        }

        ReleaseDC(hwnd, hdc);

        break;

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    }

    return(DefWindowProc(hwnd, iMsg, wParam, lParam));

}

실행 결과]

 

마우스를 드래그하여 타원형 그리기

LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

    HDChdc;

    PAINTSTRUCT ps;

    static int startX, startY, oldX, oldY;

    static BOOL Drag;

    int endX, endY;

 

    switch (iMsg)

    {

    case WM_CREATE:

        startX = oldX = 50;
        startY = oldY = 50;

        Drag = FALSE;

        break;

    case WM_PAINT:

        hdc = BeginPaint(hwnd, &ps);

        Ellipse(hdc, startX, startY, oldX, oldY);

        EndPaint(hwnd, &ps);

        break;

    case WM_LBUTTONDOWN:

        Drag = TRUE;

        break;

    case WM_LBUTTONUP:

        Drag = FALSE;

        break;

    case WM_MOUSEMOVE:

        hdc = GetDC(hwnd);

        if (Drag)

        {

            SetROP2(hdc, R2_XORPEN);

            SelectObject(hdc, (HPEN)GetStockObject(WHITE_PEN));

            SelectObject(hdc, (HBRUSH)GetStockObject(BLACK_BRUSH));

            endX = LOWORD(lParam);

            endY = HIWORD(lParam);

            Ellipse(hdc, startX, startY, oldX, oldY); // 지우기

            Ellipse(hdc, startX, startY, endX, endY); // 그리기

            oldX = endX; oldY = endY;

        }

        ReleaseDC(hwnd, hdc);

        break;

    case WM_DESTROY:

        PostQuitMessage(0);

        break;

    }

    return(DefWindowProc(hwnd, iMsg, wParam, lParam));

}

실행 결과]

 

'프로그램언어 > C++' 카테고리의 다른 글

API 공용 대화상자 사용1  (0) 2020.09.25
API 리소스  (0) 2020.09.23
API 마우스  (0) 2020.09.22
API 타이머  (0) 2020.09.21
API 키도드 입력로 도형제어  (0) 2020.09.21