1 장 윈도우프로그래밍들어가기 김성영교수 금오공과대학교 컴퓨터공학부
예제 다음프로그램은언제종료할까? #include <iostream.h> #define QUIT -1 int Func(void) int i; cout << " 입력 : "; cin >> i; return i; void main(void) int Sum = 0, i; cout << " 프로그램시작 " << endl; while ((i = Func())!= QUIT) Sum += i; cout << "Sum = " << Sum << endl; cout << " 프로그램종료 " << endl; 2
간단한 Win32 응용프로그램 (1) Hello.c win32 console application #include <stdio.h> int main() printf("hello World\n" ); return 0; 3
간단한 Win32 응용프로그램 (2) Hello_Win.c win32 console application #include <windows.h> int main() MessageBox( NULL, "Hello World", "Hello", MB_OK ); return 0; 4
간단한 Win32 응용프로그램 (3) Hello_WinMain.c win32 application #include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, PSTR szcmdline, int icmdshow) MessageBox( NULL, "Hello World", "Hello", MB_OK ); return 0; 5
이벤트처리과정 6
메시지구조체 typedef struct HWND hwnd; UINT message; // 이벤트가발생한윈도우를위한식별자 // 이벤트구분을위한식별자 WPARAM wparam; // 이벤트발생당시의상황 ( 부가 ) 정보를기록 LPARAM lparam; // 이벤트발생당시의상황 ( 부가 ) 정보를기록 DWORD time; POINT pt; MSG // 이벤트발생시간을기록 // 이벤트발생시의마우스좌표를기록 7
Windows Data Type winnt.h 와 windef.h 에재정의 typedef char CHAR; typedef short SHORT; typedef long LONG; typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD; typedef float FLOAT; typedef int INT; typedef unsigned int UINT; typedef UINT WPARAM; typedef LONG LPARAM; typedef LONG LRESULT; typedef char * LPSTR typedef const char * LPCSTR < 변수명명법의예 > a : 배열 (Array) b : BOOL(Bool) ch : 문자 (Character) cb : 바이트수 (Count of Bytes) dw : 부호없는 long형정수 (Double Word) h : 핸들 (Handle) i : 인덱스 (Index) l : long int n : int sz : NULL로끝나는문자열 w : 부호없는 16bit 정수 (Word) m_ : 멤버변수 g_ : 전역변수 8
프로그램작성흐름 1. WinMain() 의작성 2. 윈도우클래스정의및등록 3. 윈도우생성 4. 윈도우화면출력 5. 메시지루프작성 6. 윈도우프로시저정의 9
실습 1-1 WinMain() 메인함수 - 윈도우생성 1. 윈도우클래스정의 2. 윈도우클래스등록 3. 윈도우생성및출력 - 메시지루프 WndProc() 윈도우프로시저 - 이벤트 ( 메시지 ) 처리 p14 의 HELLO.CPP 입력후실행 10
1. WinMain( ) 작성 #include <windows.h> int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow ) return 0; 11
2. 윈도우클래스정의및등록 #include <windows.h> int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow ) WNDCLASS WndClass; TCHAR szappname[] = TEXT( "Hello" ); // 윈도우클래스정의 WndClass.style = 0; 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 = szappname; // 윈도우클래스등록 if (!RegisterClass(&WndClass) ) return -1; return 0; 12
윈도우클래스구조체 typedef struct _WNDCLASS UINT style; // 윈도우클래스스타일 WNDPROC lpfnwndproc; // 윈도우프로시저에대한포인터 int cbclsextra; // 윈도우클래스의데이터영역 ( 기본값 0) int cbwndextra; // 윈도우의데이터영역 ( 기본값 0) HINSTANCE hinstance; // 인스턴스핸들 ( 프로그램자신의핸들값 ) HICON hicon; // 윈도우에사용될아이콘핸들 HCURSOR hcursor; // 윈도우영역에서사용될커서핸들 HBRUSH hbrbackground; // 클라이언트영역배경색을표시할브러시핸들 LPCTSTR lpszmenuname; // 윈도우에사용될메뉴이름 LPCTSTR lpszclassname; // 윈도우클래스이름 WNDCLASS, *PWNDCLASS; http://msdn.microsoft.com/ko-kr/library/ms633576.aspx 13
3. 윈도우생성 #include <windows.h> int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow ) TCHAR szappname[] = TEXT( "Hello" ); HWND hwnd; // 윈도우생성 hwnd = CreateWindow( szappname, // window class name szappname, // window caption WS_OVERLAPPEDWINDOW, // window style CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, // parent window handle NULL, // window menu handle hinstance, // program instance handle NULL // creation parameters ); return 0; 14
CreateWindow( ) HWND CreateWindow( LPCTSTR lpclassname, LPCTSTR lpwindowname, DWORD dwstyle, int x; int y; int nwidth; int nheight; HWND hwndparent; HMENU hmenu; HINSTANCE hinstance; LPVOID lpparam; ); // 등록한윈도우클래스 // 윈도우캡션 // 윈도우스타일 // 윈도우좌측상단의 x좌표 // 윈도우좌측상단의 y좌표 // 윈도우폭 // 윈도우높이 // 부모윈도우의핸들 // 메뉴핸들 // 윈도우를생성한인스턴스핸들 // CREATESTRUCT 구조체를통해전달되는값 http://msdn.microsoft.com/ko-kr/library/ms632679.aspx 15
윈도우스타일 WS_BORDER : 경계를갖는윈도우 WS_CAPTION : 캡션바를갖는윈도우 WS_OVERLAPPED : 캡션바와경계를갖는윈도우 WS_CHILD : 특정윈도우의자식윈도우 WS_POPUP : POPUP 윈도우 WS_MAXIMIZE : 최대화버튼을갖는윈도우 WS_MINIMIZE : 최소화버튼을갖는윈도우 WS_SYSMENU : 캡션바에시스템메뉴를갖는윈도우 WS_THICKFRAME : 크기조정이가능한윈도우 WS_OVERLAPPEDWINDOW : WS_OVERLAPPED WS_CAPTION WS_SYSMENU WS_THICKFRAME WS_MINIMIZEBOX WS_MAXIMIZEBOX WS_POPUPWINDOW : WS_POPUP WS_BORDER WS_SYSMENU WS_CHILDWINDOW : WS_CHILD 16
4. 윈도우화면출력 #include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) HWND hwnd; hwnd = CreateWindow( szappname, szappname, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, NULL ); // 윈도우화면출력 ShowWindow( hwnd, ncmdshow ); UpdateWindow( hwnd ); while (1) return 0; 17
ShowWindow( ) BOOL ShowWindow ( HWND hwnd, int ncmdshow ); // 출력할윈도우핸들 // 초기윈도우상태 ncmdshow SW_HIDE : 윈도우를안보이게함 SW_SHOW : 화면에표시 SW_SHOWMAXIMIZED : 윈도우를최대화면으로출력 SW_SHOWMINIMIZED : 윈도우를작업표시줄의아이콘으로표시 18
5. 메시지루프작성 #include <windows.h> int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) HWND hwnd; MSG msg; ShowWindow( hwnd, icmdshow ); // 메시지루프 while ( GetMessage(&msg, NULL, 0, 0) ) TranslateMessage( &msg ); DispatchMessage( &msg ); return msg.wparam; 19
6. 윈도우프로시저정의 #include <windows.h> LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) WndClass.lpfnWndProc = WndProc; // 윈도우프로시저정의 LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam ) switch(message) case WM_DESTROY: PostQuitMessage( 0 ); return FALSE; // 사용자처리의경우반드시 FALSE 을리턴 // 응용프로그램이처리하지않으면윈도우운영체제가처리 return DefWindowProc( hwnd, message, wparam, lparam ); 20