티스토리 뷰
API 에서 MFC처럼 메시지 맵구현
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182 |
#include "MyProc.h"
typedef struct MESSAGEMAP
{
UINT iMessage;
LRESULT (*lpfnMsgProc)(HWND,WPARAM,LPARAM);
}MESSAGEMAP;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevlnstance,LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
g_hInst=hInstance;
MSG Message;
WNDCLASS WndClass;//만들어질 윈도우의 여러가지 특성을 정의하는 구조체
WndClass.cbClsExtra=0;//특수한 목적에 사용되는 여분의 공간, 사용하지
WndClass.cbWndExtra=0;//않을 때는 0으로 지정한다.
WndClass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);//배경색상 설정
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); //커서지정
WndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION); //마우스지정
WndClass.hInstance=hInstance; //클래스를 등록하는 프로그램 번호
WndClass.lpfnWndProc=WndProc; //윈도우의 메시지 처리함수를 지정(여기는 WndProc)
WndClass.lpszClassName=lpszClass;//이름지정, 전역변수를 대입하므로 "First"가 들어감
WndClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);//메뉴지정, NULL이므로 생략
WndClass.style=CS_HREDRAW|CS_VREDRAW; //윈도우의 스타일 정의
RegisterClass(&WndClass);//이런 이런 특성을 가진 윈도우를 앞으로 사용하겠다고 등록함.
//윈도우를 만들려면 윈도우 클래스를 등록한 후 CreateWindow함수를 호출한다.
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL | WS_THICKFRAME,20,20,
1100,700, NULL,(HMENU)NULL,hInstance,NULL);
//등록된 클래스를 기본으로 실제 윈도우 생성(메모리에 진입)
//이 함수의 인자들은 위에서 등록한 내용들이 각각의 인자로 들어온다.
//이 함수는 윈도우에 관한 모든 정보를 메모리에 만든후 대표 번호인 윈도우 핸들을 반환한다.
ShowWindow(hWnd,nCmdShow); //화면에 출력하는 함수. //첫번째 인자는 출력하고자 하는 윈도
//우의 핸들이며 CreateWindow함수가 리턴한 값이다. 두번째 인자는 출력하는 방법 지정.
//아래의 While문은 프로그램 메시지를 처리하는 부분이다.
while(GetMessage(&Message,NULL,0,0)) //메시지를 읽어들여서 false가 리턴될때 까지 반복
{
TranslateMessage(&Message); //키보드에 이벤트가 발생하면 그 것을 나타 내 준다. 키보드 입력처리
DispatchMessage(&Message); //받은 메시지를 WndProc함수로 전달한다
//그러면 그 함수에서 메시지를 점검하여 동작하게 된다.
}
return (int)Message.wParam;
}
typedef struct DMESSAGEMAP
{
UINT iMessage;
BOOL (*lpfnMsgProc)(HWND,WPARAM,LPARAM);
}DMESSAGEMAP;
BOOL CALLBACK MajorDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
int i;
static DMESSAGEMAP dMessageMaps[]=
{
{WM_INITDIALOG,OnInitDialog},
{WM_COMMAND,OnDIgCommand}
};
for(i=0;i<sizeof(dMessageMaps)/sizeof(dMessageMaps[0]);i++)
{
if(dMessageMaps[i].iMessage==iMessage)
return (*dMessageMaps[i].lpfnMsgProc)(hDlg,wParam,lParam);
}
return FALSE;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam, LPARAM lParam)
{
int i;
static MESSAGEMAP MessageMaps[]=
{
{WM_CREATE,OnCreate},
{WM_COMMAND,OnCommand},
{WM_LBUTTONDOWN,OnLButtonDown},
//{WM_LBUTTONUP,OnLButtonUp},
//{WM_RBUTTONDOWN,OnRButtonDown},
//{WM_MOUSEMOVE,OnMouseMove},
//{WM_CTLCOLOREDIT,CTLCOLOREDIT},
{WM_PAINT,OnPaint},
{WM_DESTROY,OnDestroy}
//{WM_CHAR,OnChar}
};
for(i=0;i<sizeof(MessageMaps)/sizeof(MessageMaps[0]);i++)
{
if(MessageMaps[i].iMessage==iMessage)
return (*MessageMaps[i].lpfnMsgProc)(hWnd,wParam,lParam);
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
LRESULT OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
CreateWindow(TEXT("button"),TEXT("BITMAP info" ), WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
700,70,300,435, hWnd,(HMENU)0,g_hInst,NULL);
return 0;
}
LRESULT OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int iNum = 0;
switch(LOWORD(wParam))
{
case ID_FILE_OPEN40001:
memset(&OFN, 0, sizeof(OPENFILENAME));
OFN.lStructSize = sizeof(OPENFILENAME);
OFN.hwndOwner = hWnd;
OFN.lpstrFilter = TEXT("비트맵 파일(*.*)\0*.bmp\0");
OFN.lpstrFile = lpstrFile;
OFN.nMaxFile = MAX_PATH;
OFN.lpstrTitle = TEXT("파일 선택하기");
if(GetOpenFileName(&OFN) != 0)
{
//wsprintf(str, TEXT("%s 파일을 선택했습니다."), OFN.lpstrFile);
//MessageBox(hWnd, str, TEXT("파일 열기 성공"), MB_OK);
angle = 0;
wsprintf(str, TEXT("%s 파일을 선택했습니다."), OFN.lpstrFile);
}
hFile = CreateFile(lpstrFile, GENERIC_READ,0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
ReadFile(hFile, buf, BSIZE, &dwRead, NULL);
InvalidateRect(hWnd,NULL,TRUE);
CloseHandle(hFile);
break;
case ID_FILE_CLOSE40002:
//if(MessageBox(hWnd, TEXT("에잇~~ 구경 좀 더하시징~"), TEXT("확인"), MB_YESNO == IDYES))
if(MessageBox(hWnd, TEXT("종료하시겠습니까?"), TEXT("가지마용~~"), MB_OKCANCEL | MB_ICONERROR) == IDOK)
{
OnDestroy(hWnd, wParam, lParam);
}
else
{
;
}
break;
case ID_EDIT_40003:
blackclr = 1; //흑백
InvalidateRect(hWnd, NULL, TRUE);
break;
case ID_EDIT_40004:
blackclr = 0; //칼라
InvalidateRect(hWnd, NULL, TRUE);
break;
case 0:
angle=angle+1;
InvalidateRect(hWnd,NULL,TRUE);
break;
case 1:
if(angle==0 && iNum==0)
{
angle=angle+3;
}else
{
angle=angle-1;
}
InvalidateRect(hWnd,NULL,TRUE);
break;
case 2:
angle+=2 ;
InvalidateRect(hWnd,NULL,TRUE);
break;
}
return 0;
}
|
cs |
MyProc.h
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 |
#ifndef __MSGPROC_H_
#define __MSGPROC_H_
#include <windows.h>
#include "resource.h"
extern HINSTANCE g_hInst;
void DrawBitmap(HDC hdc,int x,int y,HBITMAP hBit);
/* WndPRoc()관련*/
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT OnCreate(HWND,WPARAM,LPARAM);
//LRESULT OnChar(HWND,WPARAM,LPARAM);
LRESULT OnCommand(HWND,WPARAM,LPARAM);
LRESULT OnLButtonDown(HWND,WPARAM,LPARAM);
//LRESULT OnLButtonUp(HWND,WPARAM,LPARAM);
//LRESULT OnRButtonDown(HWND,WPARAM,LPARAM);
LRESULT OnPaint(HWND,WPARAM,LPARAM);
LRESULT OnDestroy(HWND,WPARAM,LPARAM);
//LRESULT OnMouseMove(HWND,WPARAM,LPARAM);
//LRESULT CTLCOLOREDIT(HWND ,WPARAM,LPARAM);
/*DigProc()관련 */
BOOL CALLBACK MajorDlgProc(HWND,UINT,WPARAM,LPARAM);
//BOOL CALLBACK AboutDIgProc(HWND,UINT,WPARAM,LPARAM);
//BOOL CALLBACK MainDIgProc(HWND,UINT,WPARAM,LPARAM);
BOOL OnInitDialog(HWND,WPARAM,LPARAM);
BOOL OnDIgCommand(HWND,WPARAM,LPARAM);
#endif |
cs |