06 일반적 유형의 프로그램2. 2
먼저 윈도우 클래스 두 개
하나는 흰색 배경
또 다른 하나는 검은색 배경
윈도우 배경 색 설정은 윈도우 클래스 정의 부분에 있었다
윈도우 클래스를 두 개 등록하면 돼
3. 3
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HWND _hWnd2;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE
hPrevInstance, LPSTR lpszArg, int nCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS WndClass;
WndClass.style = NULL;
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 = "Hello";
if(!RegisterClass(&WndClass)) return NULL;
흰색배경 갖는
hello로 하나 정의
등록
5. 5
hWnd = CreateWindow(
"Hello",
"Hello",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL, NULL, hInstance,
NULL
);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
윈도우 클래스 이름이
hello인 클래스를 이용
하여 윈도우 생성
hello 윈도우 클래스 이용해서 윈도우 생성
hello 윈도우 클래스에서 배경색을 흰색으로 설정했으니까
만들어 지는 윈도우의 배경은 흰색
6. 6
_hWnd2 = CreateWindow(
"WND2",
"World",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL, NULL, hInstance,
NULL
);
ShowWindow(_hWnd2, nCmdShow);
UpdateWindow(_hWnd2);
윈도우 클래스 이름이
WND2인 클래스를 이용
하여 윈도우 생성
WND2 윈도우 클래스 이용해서 윈도우 생성
WND2 윈도우 클래스에서 배경색을 검은색으로 설정했으니까
만들어 지는 윈도우의 배경은 검은색
7. 7
윈도우 프로시저도 두 개
마우스 왼쪽 버튼 눌림에 대해
두 윈도우에서 각기 다른 메시지 박스 출력
메시지 박스 함수의 첫 번째 인자를 생각해 보면
다음과 같이 간단히 해결될 수 있다
MessageBox(hWnd, "안녕하세요", "인사", MB_OK);
8. 8
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
switch(mesg)
{
case WM_LBUTTONDOWN:
if (hWnd == _hWnd2)
MessageBox(hWnd, "저리가세요", "인사", MB_OK);
else
MessageBox(hWnd, "안녕하세요", "인사", MB_OK);
break;
case WM_DESTROY :
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
이벤트를 발생시킨 윈도우의
핸들이 넘어온다
파라미터로 넘어온 윈도우 핸들이 누구인지를 비교
검은색 윈도우의 핸들이 전역변수 _hWnd2 이기에 가능
전역변수가 아닐 땐 어떻게 하지 ?
9. 9
검은색 윈도우도 별도의 윈도우 프로시저를 갖도록
WndClass.lpfnWndProc = WndProc2;
WndClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
WndClass.lpszClassName = "WND2";
if(!RegisterClass(&WndClass)) return NULL;
사용할 윈도우 프로시저 함수의 이름을 WndProc2로 정함
이름은 붙이기 나름
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc2(HWND, UINT, WPARAM, LPARAM);
도입부에 함수의 프로토타입 추가
10. 10
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
switch(mesg) {
case WM_LBUTTONDOWN:
MessageBox(hWnd, "안녕하세요", "인사", MB_OK);
break;
case WM_DESTROY :
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
LRESULT CALLBACK WndProc2(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
switch(mesg) {
case WM_LBUTTONDOWN:
MessageBox(hWnd, "저리가세요", "인사", MB_OK);
break;
case WM_DESTROY :
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
11. 11
이와 관련하여 메시지 루프 부분을 다시 살펴보면
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
CTRL-C CTRL-V 같은 단축키 처리 (번역)
이벤트가 발생한 윈도우의 윈도우 프로시저 호출
메시지 전달 = 메시지 분배
dispatch
이벤트 발생한 윈도우 구분해서 호출 필요
윈도우 프로시저 호출 담당 함수에 대한 궁금증 해결 됐지 ?
13. 13
SetWindowText(HWND hWnd, LPCSTR lpString)
윈도우 타이틀 관련 함수
변경할 윈도우 타이틀
윈도우 타이틀 변경
GetWindowText(HWND hWnd, LPSTR lpString, int nMaxCount)
윈도우 타이틀 얻기
얻어올 윈도우 타이틀
문자열의 최대 길이
char szTitle[1024];
14. 14
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
switch(mesg)
{
case WM_LBUTTONDOWN:
SetWindowText(_hWnd2, "Black");
break;
case WM_DESTROY :
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
검은색 윈도우의 윈도우 핸들만 알면 가능
검은색 윈도우의 핸들이 전역변수 _hWnd2 이기에 가능
윈도우 간의 통신이라고 거창하게 얘기했지만
윈도우 핸들만 알면 Ok~ 전역변수가 계속 신경 쓰여