래스터 연산
클라이언트 영역에 출력한 문자/그림의 색은 펜, 브러시의 색 자체이다. 클라이언트 영역에 그려저 있는 기존 도형의 색에 따라 출력하는 문자/그림의 색이 달라지게 하려면 다음 한수를 사용한다.
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; 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 |