티스토리 뷰

C,C++/MFC

WinMain 및 WndProc 메시지 크래커

Andrew Shin 2017. 3. 27. 15:19
본 자료는 숭실대학교 정보통신전자공학부 소속 소모임 BlindC에서 3학년을 대상으로 하는 자료입니다.

개인의 소중한 창작물이기 때문에 자료의 열람은 자유이고, 소스코드를 긁어갈 수 있도록 우클릭제한이나 기타 제한은 걸어놓지 않았으나, 외부 공개나, 2차 수정등은 자제해주시길 부탁드립니다.

본격적으로 MFC를 공부하기 이전에, Win32 프로그래밍을 간단하게 경험해보고 메시지 크래커에 대해서 학습해보는 시간을 가질까 합니다.
기존 C나 파이썬의 콘솔환경과 다르게 우리는 이제 GUI 프로그래밍을 할텐데, Main에서 시작해서 return 0 으로 끝나는 프로그램이 아니기 때문에 이와같은 구조에 대해서 이해하는 것이 중요하다고 할 수 있습니다.

비주얼 스튜디오에서 Win32 프로젝트로(콘솔 프로젝트 아님) 빈프로젝트를 생성한 뒤에 main.cpp를 생성후 아래 코드를 붙여넣어 봅시다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <Windows.h>
#include <windowsx.h>
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
 
BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
void OnPaint(HWND hwnd);
void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify);
void OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags);
void OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags);
void OnSize(HWND hwnd, UINT state, int cx, int cy);
void OnKeyDown(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags);
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR cmdLine, int cmdShow)
{
    const wchar_t *clsName = L"BlindC";
    WNDCLASS wc = { 0 };
 
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor = LoadCursor(hInstance, IDC_ARROW);
    wc.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
    wc.hInstance = hInstance;
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = clsName;
    wc.lpszMenuName = NULL;
    wc.style = CS_HREDRAW | CS_VREDRAW;
 
    RegisterClass(&wc);
 
    //생성
    HWND hwnd = CreateWindow(clsName, L"블씨 윈도우", WS_OVERLAPPEDWINDOW, 00500400NULLNULL, hInstance, NULL);
 
    //표시
    ShowWindow(hwnd, SW_SHOW);
 
    //루프
    MSG msg;
    while (GetMessage(&msg, hwnd, 00== TRUE)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return msg.wParam;
}
 
 
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        HANDLE_MSG(hwnd, WM_PAINT, OnPaint);
        HANDLE_MSG(hwnd, WM_CREATE, OnCreate);
        HANDLE_MSG(hwnd, WM_SIZE, OnSize);
        HANDLE_MSG(hwnd, WM_COMMAND, OnCommand);
        HANDLE_MSG(hwnd, WM_LBUTTONDOWN, OnLButtonDown);
        HANDLE_MSG(hwnd, WM_LBUTTONUP, OnLButtonUp);
        HANDLE_MSG(hwnd, WM_KEYDOWN, OnKeyDown);
    }
 
    return DefWindowProc(hwnd, message, wParam, lParam);
}
 
 
BOOL OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
{
 
    return TRUE;
}
 
void OnPaint(HWND hwnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
 
    Rectangle(hdc, 100100200200);
 
    EndPaint(hwnd, &ps);
}
 
void OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
 
}
 
void OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
{
    MessageBox(hwnd, L"L버튼 테스트"NULLNULL);
}
 
void OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags)
{
 
}
 
void OnSize(HWND hwnd, UINT state, int cx, int cy)
{
 
}
 
void OnKeyDown(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)
{
 
}
 
cs


'C,C++ > MFC' 카테고리의 다른 글

[MFC] MFC 시작하기  (0) 2017.03.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함