#include <windows.h> //기본적인 데이터 타입, 함수 원형, 매크로 상수 등을 정의하며 그외 윈도우즈 프로그래밍에 필요한 보조 헤더 파일을 포함
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //사용자와 시스템이 보내오는 메세지를 처리하는 아주 중요한 일을 하는 WInMain외 나머지 하나 시작점
//CALLBACK 메크로는 _stdcall로 정의됨
HINSTANCE g_hInst; //HINSTANCE에 전역변수 g_hInst지정
LPCTSTR IpszClass=TEXT("MessageBox"); //IpszClass라는 전역 문자열 정의
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR IpszCmdParam,int nCmdShow)
//프로그램의 시작점인 엔트리 포인트(Entry Point)
//hInstance 프로그램의 인스턴스 핸들
//hPrevInstance 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들
//IpszCmdParam 명령행으로 입력된 프로그램 인수
//nCmdShow 프로그램이 실행될 형태이며 최소화, 보통 모양
{
HWND hWnd;
MSG Message; //어떤 종류의 메시지인가를 나타냄
//tagMSG
// hwnd : 메시지를 받을 윈도우 핸들
// message : 어떤 종류의 메세지 인지 나타내는 값
// wParam : 전달된 메시지에 대한 부가적인 정보를 가짐
// IParam : 전달된 메시지에 대한 보가적 정보를 가짐
// time : 메시지 발생 시간
// pt : 메시지가 발생할시 마우스 위치
WNDCLASS WndClass; // 클래스 종류 지정
g_hInst=hInstance;
WndClass.cbClsExtra=0; //예약 영역
WndClass.cbWndExtra=0; //예약 영역+
WndClass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH); //배경 색상지정
WndClass.hCursor=LoadCursor(NULL,IDC_NO); //사용할 마우스 커서 지정
WndClass.hIcon=LoadIcon(NULL,IDI_QUESTION); //사용할 아이콘 지정
WndClass.hInstance=hInstance; //등록하는 프로그램 번호 hInstance 값을 그대로 대임함
WndClass.lpfnWndProc=WndProc; //윈도우의 메시지 처리 함수 지정
WndClass.lpszClassName=IpszClass; //윈도우 클래스의 이름을 문자열로 지정, 여기서 지정한 이름 이 CreateWindow함수에 전달됨
WndClass.lpszMenuName=NULL; //사용할 메뉴를 지정, 메뉴는 프로그램 코드에서 실행중에 만드는 것이 아니라 리소스 에디터에 의해 별도로 만들어짐
WndClass.style=CS_HREDRAW|CS_VREDRAW; //윈도위우의 스타일 지정
RegisterClass(&WndClass); //WNDCLASS 구조체의 번지를 전달
hWnd=CreateWindow(IpszClass,TEXT("My First Program"),WS_OVERLAPPEDWINDOW,300,100,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
// IpszClassName 생성하고자 하는 윈도우의 클래스를 지정하는 문자열
// IpszWindowsName 윈도우 타이틀바에 나타날 문자열
// dwStyle 만들고자 하는 윈도우의 형태를 지정하는 인수
// X, Y, nWidth, nHeight 윈도우의 크기와 위치를 지정하며 픽셀 단위를 사용함
// hWndParent 부모 윈도우가 있을 경우 부모 윈도우의 핸들을 지정
// hmenu 윈도우에서 사용할 메뉴의 핸들을 지정
// hinst 프로그램의 핸들을 지정 WinMain의 인수로 전달된 hInstance를 대입
// IpvParam CREATESTRUCT라는 구조체의 번지이며 여러개의 윈도우를 만들때 각 윈도우에 고유의 파라미터를 전달하는 특수한 목적에 사용
// BOOL ShowWindow(hWnd, nCmdShow); hWnd 인수는 화면으로 출력하고자 하는 윈도우의 핸들이며 CreateWindow 함수가 리턴한 핸들을 그대로 넘기면됨,
// nCmdShow는 윈도우를 화면에 출력하는 방법을 지정하며 다음 매크로를 상수들이 정의되어 있음
// SW_HIDE 윈도움 숨김
// SW_MINIMIZE 윈도우를 최소화
// SW_RESTORE 윈도우를 활성화
// SW_SHOW 윈도우를 활성화하여 보여줌
// SW_SHOWNORMAL 윈도우를 활성화하여 보여줌
while (GetMessage(&Message,NULL,0,0)){ //메시지 큐에서 메시지를 읽어들임, 메시지 큐는 시스템이나 사용자로 부터 발생하는 메시지가 임시 저장하는 영역
TranslateMessage(&Message); //키보드의 입력 메세지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 함
DispatchMessage(&Message); //메시지 큐에서 꺼낸 메시지를 윈도우의 메시지 처리 함수로 전달
// 메세지 루프
}
return (int)Message.wParam; // 메세지 루프가 종료 될때 Message.wParam을 리턴하고 종료됨
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM IParam)
{
HDC hdc;
PAINTSTRUCT ps;
static int x;
static int y;
static BOOL bNowDraw=FALSE;
switch (iMessage){
case WM_LBUTTONDOWN: //좌측 버튼이 눌려졌을 때
x=LOWORD(IParam); // 마우스 x좌표의 위치 기억
y=HIWORD(IParam); // 마우스 y좌표의 위치 기억
bNowDraw=TRUE; //그리기가 됨
return 0;
case WM_MOUSEMOVE: //마우스가 움직일 때
if(bNowDraw==TRUE) { //만약 그리는 중이면 아래 내용 실행
hdc=GetDC(hWnd); //DC 핸들을 발급 받음
MoveToEx(hdc,x,y,NULL); //LineTO 위치까지 선을 긋기위한 시작점
x=LOWORD(IParam); // 마우스 x좌표의 새위치 기억
y=HIWORD(IParam); // 마우스 y좌표의 새위치 기억
LineTo(hdc,x,y); //해당 좌표로 이동
ReleaseDC(hWnd,hdc);
}
return 0;
case WM_LBUTTONUP: //좌측 버튼이 올라왔을 때
bNowDraw=FALSE; //그리기를 않함
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,IParam)); //WndProc에서 처리하지 않은 나머지 메시지에 관한 처리
}
더블 클릭으로 마우스로 그린 그림을 지우기
*주의
더블클릭 이벤트를 미리 윈도우 스타일에 지정해 주어야 사용 가능하다.
#include <windows.h> //기본적인 데이터 타입, 함수 원형, 매크로 상수 등을 정의하며 그외 윈도우즈 프로그래밍에 필요한 보조 헤더 파일을 포함
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //사용자와 시스템이 보내오는 메세지를 처리하는 아주 중요한 일을 하는 WInMain외 나머지 하나 시작점
//CALLBACK 메크로는 _stdcall로 정의됨
HINSTANCE g_hInst; //HINSTANCE에 전역변수 g_hInst지정
LPCTSTR IpszClass=TEXT("MessageBox"); //IpszClass라는 전역 문자열 정의
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR IpszCmdParam,int nCmdShow)
//프로그램의 시작점인 엔트리 포인트(Entry Point)
//hInstance 프로그램의 인스턴스 핸들
//hPrevInstance 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들
//IpszCmdParam 명령행으로 입력된 프로그램 인수
//nCmdShow 프로그램이 실행될 형태이며 최소화, 보통 모양
{
HWND hWnd;
MSG Message; //어떤 종류의 메시지인가를 나타냄
//tagMSG
// hwnd : 메시지를 받을 윈도우 핸들
// message : 어떤 종류의 메세지 인지 나타내는 값
// wParam : 전달된 메시지에 대한 부가적인 정보를 가짐
// IParam : 전달된 메시지에 대한 보가적 정보를 가짐
// time : 메시지 발생 시간
// pt : 메시지가 발생할시 마우스 위치
WNDCLASS WndClass; // 클래스 종류 지정
g_hInst=hInstance;
WndClass.cbClsExtra=0; //예약 영역
WndClass.cbWndExtra=0; //예약 영역+
WndClass.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH); //배경 색상지정
WndClass.hCursor=LoadCursor(NULL,IDC_NO); //사용할 마우스 커서 지정
WndClass.hIcon=LoadIcon(NULL,IDI_QUESTION); //사용할 아이콘 지정
WndClass.hInstance=hInstance; //등록하는 프로그램 번호 hInstance 값을 그대로 대임함
WndClass.lpfnWndProc=WndProc; //윈도우의 메시지 처리 함수 지정
WndClass.lpszClassName=IpszClass; //윈도우 클래스의 이름을 문자열로 지정, 여기서 지정한 이름 이 CreateWindow함수에 전달됨
WndClass.lpszMenuName=NULL; //사용할 메뉴를 지정, 메뉴는 프로그램 코드에서 실행중에 만드는 것이 아니라 리소스 에디터에 의해 별도로 만들어짐
WndClass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; //윈도우의 스타일 지정, 더블클릭 이벤트를 사용하겠다는 정의를 미리 해주어야 한다.
RegisterClass(&WndClass); //WNDCLASS 구조체의 번지를 전달
hWnd=CreateWindow(IpszClass,TEXT("My First Program"),WS_OVERLAPPEDWINDOW,300,100,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
// IpszClassName 생성하고자 하는 윈도우의 클래스를 지정하는 문자열
// IpszWindowsName 윈도우 타이틀바에 나타날 문자열
// dwStyle 만들고자 하는 윈도우의 형태를 지정하는 인수
// X, Y, nWidth, nHeight 윈도우의 크기와 위치를 지정하며 픽셀 단위를 사용함
// hWndParent 부모 윈도우가 있을 경우 부모 윈도우의 핸들을 지정
// hmenu 윈도우에서 사용할 메뉴의 핸들을 지정
// hinst 프로그램의 핸들을 지정 WinMain의 인수로 전달된 hInstance를 대입
// IpvParam CREATESTRUCT라는 구조체의 번지이며 여러개의 윈도우를 만들때 각 윈도우에 고유의 파라미터를 전달하는 특수한 목적에 사용
// BOOL ShowWindow(hWnd, nCmdShow); hWnd 인수는 화면으로 출력하고자 하는 윈도우의 핸들이며 CreateWindow 함수가 리턴한 핸들을 그대로 넘기면됨,
// nCmdShow는 윈도우를 화면에 출력하는 방법을 지정하며 다음 매크로를 상수들이 정의되어 있음
// SW_HIDE 윈도움 숨김
// SW_MINIMIZE 윈도우를 최소화
// SW_RESTORE 윈도우를 활성화
// SW_SHOW 윈도우를 활성화하여 보여줌
// SW_SHOWNORMAL 윈도우를 활성화하여 보여줌
while (GetMessage(&Message,NULL,0,0)){ //메시지 큐에서 메시지를 읽어들임, 메시지 큐는 시스템이나 사용자로 부터 발생하는 메시지가 임시 저장하는 영역
TranslateMessage(&Message); //키보드의 입력 메세지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 함
DispatchMessage(&Message); //메시지 큐에서 꺼낸 메시지를 윈도우의 메시지 처리 함수로 전달
// 메세지 루프
}
return (int)Message.wParam; // 메세지 루프가 종료 될때 Message.wParam을 리턴하고 종료됨
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM IParam)
{
HDC hdc;
PAINTSTRUCT ps;
static int x;
static int y;
static BOOL bNowDraw=FALSE;
switch (iMessage){
case WM_LBUTTONDOWN:
x=LOWORD(IParam);
y=HIWORD(IParam);
bNowDraw=TRUE;
return 0;
case WM_MOUSEMOVE:
if(bNowDraw==TRUE) {
hdc=GetDC(hWnd);
MoveToEx(hdc,x,y,NULL);
x=LOWORD(IParam);
y=HIWORD(IParam);
LineTo(hdc,x,y);
ReleaseDC(hWnd,hdc);
}
return 0;
case WM_LBUTTONUP:
bNowDraw=FALSE;
return 0;
case WM_LBUTTONDBLCLK: //더블 클릭 하였을 때
InvalidateRect(hWnd, NULL, TRUE); //작업영역을 무효화
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,IParam)); //WndProc에서 처리하지 않은 나머지 메시지에 관한 처리
}