선그리기
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;
}