Win32 API Windows Programming 1 http://idb.korea.ac.kr DB & Mining LAB. Korea Univ. 최종업데이트 : 2012. 08. 14 1
컴퓨터시스템의주요구성요소 2 2
컴퓨터하드웨어구성 Fetch : 메인메모리에저장되어있는명령어를 CPU 로 Decode : 컨트롤유닛에의해분석 Execution : ALU 에의해연산 레지스터 : 실행의중간결과나적은양의자료를임시로저장하는장치 CPU 내부의레지스터 : 프로그램카운터 (Program Counter), 명령어레지스터 (Instruction Register), 기억장치주소레지스터 (Memory Address Register), 기억장치버퍼레지스터 (Memory buffer Register), 입출력주소레지스터 (I/O Address Register), 입출력버퍼레지스터 (I/O Buffer Register) 버스 : 컴퓨터에서두개혹은그이상의장치들을연결하는공유전송매체 - 주소버스 : 데이터가읽혀지거나쓰여질기억장소의주소를전송 - 데이터버스 : 모듈들사이의데이터전송통로 - 제어버스 : 데이터버스와주소버스의사용을제어하는신호들을전송. Ex) 기억장치읽기 / 쓰기, I/O 읽기 / 쓰기, 신호전송확인 (transfer acknowledge), 버스요구 (bus request), 버스승인 (bus grant) 인터럽트요구, 확인, 등등 3 3
프로세스란? 운영체제 : 멀티프로세스 (Multi-Process) 프로세스란것이여러개존재 인터넷익스플로러아이콘을클릭 실행파일 iexplorer.exe 라는프로그램실행된것 익스플로러창은프로세스이다. 아이콘을다시클릭하면또다른익스플로러창이뜨고, 2번째프로세스생성됨 프로세스스케줄링 4 4
윈도우프로그래밍 API(Application Programming Interface) Windows System Call SDK(Software Development Kit ) 윈도우프로그램의작성에사용할수있는 C 함수라이브러리 모든윈도우프로그래밍환경에서사용가능 MFC(Microsoft Foundation Class) Visual C++ Class Library RAD(Rapid Application Development) Visual Basic, PowerBuilder, Delphi 실행속도느리고, 실행파일큼 5
윈도우프로그래밍동작방식 메시지 (Message) 메시지큐 (Message Queue) 메시지루프 (Message Loop) 윈도우프로시저 (Window Procedure) 6
메시지 윈도우에발생하는모든사건 WM_CREATE, WM_DESTROY, WM_MOUSEMOVE, WM_KEYDOWN. winuser.h 에정의 각윈도우에어떤사건이발생하는지를감시하여이를메시지로만들어내는것은기본적으로운영체제의책임이다 메시지가발생하면메시지는해당윈도우가속한프로그램의메시지큐로들어간다 7
메시지큐 하나의프로그램에하나의메시지큐할당 윈도우에사건이발생하면운영체제는이를메시지로만들어 발생순서대로메시지큐에넣는다 8
메시지루프 메시지큐에있는메시지를읽어서윈도우프로시저로전송하는루프 MSG msg; while(getmessage(&msg,null,0,0)) { TransLateMessage(&msg); // 키보드메시지변환 } DispatchMessage(&msg); // 윈도우프로시져로메시지전달 9
윈도우프로시져 메시지에응답하여처리하는함수 LONG APIENTRY WinProc // 윈도우프로시저이름 (HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { switch (message) { case 메시지1 :... break; case 메시지2 :... break;... default : return DefWindowProc(hWnd, message, wparam, lparam); } return 0; } 10
윈도우프로그램동작원리 운영체제 응용프로그램 메시지큐 } while(getmessage( )) {. 메시지를큐에서읽음 DispatchMessage( )... 메시지를처리할프로시저에전달 switch(msg) switch(msg) { {. } } 11
데이터타입 기존의타입들을 typedef 문으로재정의 BOOL: Boolean value. LPSTR: 32-bit pointer to a character string. UINT: 16-bit unsigned integer on Windows versions 3.0 and 3.1; a 32- bit unsigned integer on Win32. WORD: 16-bit unsigned integer. DWORD: 32-bit unsigned integer or the address of a segment and its associated offset. LONG: 32-bit signed integer. WPARAM: value passed as a parameter to a window procedure or callback function: 16 bits on Windows versions 3.0 and 3.1; 32 bits on Win32. LPARAM: 32-bit value passed as a parameter to a window procedure or callback function. HANDLE: Handle of an object, UINT. HWND: Handle of a window., UINT. HINSTANCE: Handle of an instance, UINT 12
윈도우에서의출력방법 디바이스에비의존적 (device-independent) 출력하고자하는장치의종류에따라출력방법이달라지지않음 GDI(Graphic Device Interface) 어떤디바이스에든지출력하는데사용되는함수들 13
윈도우에서의출력방법 Win32 API 응용프로그램 G D I 디바이스드라이브 실제출력장치 윈도우운영체제에서의출력 14
디바이스컨텍스트 윈도우운영체제에서출력대상을지칭 논리적으로볼때붓과펜, 팔레트, 종이 ( 여기서는비트맵에해당 ), 폰트등의그림을그리기위한도구의집합 윈도우화면출력절차 화면에대한디바이스컨텍스트핸들을구함 BeginPaint(), GetDC() 함수 GDI를이용해원하는출력모든출력장치에동일 디바이스컨텍스트제거 EndPaint()(BeginPaint() 로디바이스컨텍스트를얻은경우 ) ReleaseDC()(GetDC() 로디바이스컨텍스트를얻은경우 ) 15
윈도우에서의출력절차 출력할장치의디바이스컨텍스트핸들을얻는다. HDC hdc = GetDC(hWnd); GDI로앞에서얻은핸들에출력을행한다. TextOut(hDC,0,0, Hello,5); LineTo(hDC,100,100); : 디바이스컨텍스트를제거한다. ReLeaseDC(hWnd,hDC); 16
WM_PAINT 메시지처리 예제 - Hello, everybody case WM_PAINT: HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hWnd, &ps); TextOut(hDC, 10, 10, "Hello, everybody", 16); EndPaint(hWnd, &ps); break; // 비교 : C 언어였다면, printf( Hello, everybody ); 17
BeginPaint() HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lppaint ); PAINTSTRUCT structure typedef struct tagpaintstruct { // ps HDC hdc; // Identifies the display DC to be used for painting. BOOL ferase; // Specifies whether the background must be erased. RECT rcpaint; // specifies the upper left and lower right corners of the rectangle in which the painting is requested. BOOL frestore; // Reserved; used internally by Windows. BOOL fincupdate; // Reserved; used internally by Windows. BYTE rgbreserved[32]; // Reserved; used internally by Windows. } PAINTSTRUCT; 18
TextOut(), EndPaint() BOOL TextOut( HDC hdc, // handle of device context int nxstart, // x-coordinate of starting position int nystart, // y-coordinate of starting position LPCTSTR lpstring, // address of string int cbstring // number of characters in string ); BOOL EndPaint( HWND hwnd, // handle to window CONST PAINTSTRUCT *lppaint // pointer to structure for paint data ); 19
GDI(Graphic Device Interface) 어떤디바이스에든지출력하는데사용되는함수들 첫번째인자는디바이스컨텍스트에대한핸들 GDI 의출력영역은어디까지나사용자영역안 디바이스컨텍스트의속성관련함수 도형관련출력함수 텍스트관련출력함수 맵핑모드관련함수 그림도구변경함수 20
WM_PAINT 메시지 윈도우운영체제에서화면복구시사용 1 2 1 2 1 2 1 번윈도우에의해가 려졌던 2 번윈도우가 클릭된다. 가려졌던영역이일단 WM_ERASEBKGND 메시지에의해지워진다. 윈도우에서의화면복구 WM_PAINT 메시지에 의해가려졌던영역이 복구된다. 21
WM_PAINT 메시지 WM_PAINT 메시지에서화면복구 디바이스컨텍스트는 BeginPaint 함수사용하여구함그이외에는 GetDC 사용 BeginPaint 함수의두번째인자에복구되어야할영역을지정 case WM_PAINT: HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hWnd, &ps); // ps.rcpaint에복구영역의좌표가들어있다. // 이부분만딱그려줄수있다면가장이상적이다. EndPaint(hWnd, &ps); 22