MFC

선그리기

박__주홍 2020. 9. 5. 09:00

WndProc함수에서 윈도우를 벗어난 클라이언트안의 선의 좌표를 기억하여 윈도우를 클라이언트가 벗어나도 선이 지워지지 않도록 하는 코드를 추가했다. PAINT는 메세지큐가 아닌 메세지테이블, 메세지큐보다 우선순위가 뒤인 메세지들을 저장하는 구조다. 더 이론적으로 복잡하겠지만 내가 이해하고 짠 코드는 이러하다. 

 

또한 BeginPaint()와 EndPaint()를 쓴다면 CPU점유율이 낮아진다. 이는 .. 

 

메세지테이블은 우선순위가 낮은 메세지들을 관리하는 테이블로 Flag성 메세지를 관리한다.

그래서 메세지테이블에 있는 메세지가 1이면 처리하고, 처리 후 0으로 바꿔 메세지가 중복처리되지 않도록 관리한다.

 

GetDC로 DC값을 받게되면 메세지테이블에 있는 메세지들이 다 1로 되어있어 CPU가 모든메세지를 중복관련없이 다 처리하니 CPU점유율이 높아진다, 한마디로 쓸데없는 일들을 하게 한다는 코드인 것이다. 그러므로 GetDC로 DC값을 받는 것보다 BeginPaint()와 EndPaint()을 쓰는 편이 좋다, 아니 써라.

 

링크리스트?

 

 

 

 

#include "pch.h"
#include "framework.h"
#include "practice_win32.h"

#define MAX_COUNT 1000

int g_is_clicked = 0;
int g_x[MAX_COUNT], g_y[MAX_COUNT];
int g_count = 0;

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_DESTROY)PostQuitMessage(0);
else if (uMsg == WM_PAINT) {

// HDC와 같이 PAINTSTRUCT은 구조체이다.
PAINTSTRUCT ps;
HDC h_dc = BeginPaint(hWnd, &ps);

 

// 선의 좌표를 기억하는 함수
for (int i = 0; i < MAX_COUNT; i++) {
MoveToEx(h_dc, g_x[i], g_y[i], NULL);
LineTo(h_dc, g_x[i + 1], g_y[i + 1]);
}
EndPaint(hWnd, &ps);

// return 0으로 반환값을 안해주면 DefWindowProc함수에서 PAINT함수가 중복발생한다.
return 0; 
}
else if (uMsg == WM_LBUTTONDOWN) {
g_is_clicked = 1;
g_x[g_count] = LOWORD(lParam);
g_y[g_count] = HIWORD(lParam);
}
else if (uMsg == WM_LBUTTONUP) {
g_is_clicked = 0;
  }
else if (uMsg == WM_MOUSEMOVE) {
if (g_is_clicked && g_count < MAX_COUNT) {
HDC h_dc = GetDC(hWnd);

MoveToEx(h_dc, g_x[g_count - 1], g_y[g_count - 1], NULL);
g_x[g_count] = LOWORD(lParam);
g_y[g_count] = HIWORD(lParam);
LineTo(h_dc, g_x[g_count], g_y[g_count]);
g_count++;

ReleaseDC(hWnd, h_dc);
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

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

{

WNDCLASS wc;

 

wchar_t my_class_name[] = L"tipssoft";

wc.cbClsExtra = NULL;

wc.cbWndExtra = NULL;

wc.hbrBackground = (HBRUSH)COLOR_WINDOW;

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wc.hI wc.hInstance = hInstance;

wc.lpfnWndProc = WndProc;

wc.lpszClassName = my_class_name;

wc.lpszMenuName = NULL;

wc.style = CS_HREDRAW | CS_VREDRAW;

 

RegisterClass(&wc);

 

HWND hWnd = CreateWindow(my_class_name,L"www.tipssoft.com",

WS_OVERLAPPEDWINDOW,100,90,400,350,NULL,NULL,hInstance, NULL);

ShowWindow(hWnd,nCmdShow);

 

MSG msg;

while(GetM while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

 

return msg.wParam;

}