Download presentation
Presentation is loading. Please wait.
Published byOlavi Haapasalo Modified 5년 전
1
GUI 소켓 애플리케이션 Chapter 08. * 학습목표 윈도우 GUI 애플리케이션의 구조와 동작 원리를 이해
윈도우 기반 소켓 애플리케이션 작성 기법을 익힘 대화상자 기반 애플리케이션의 구조와 동작 원리를 이해 대화상자 기반 소켓 애플리케이션 작성 기법을 익힘
2
윈도우 GUI 애플리케이션 - (1) 윈도우의 GUI 애플리케이션의 특징 용어
다양한 API(Application Programming Interface)를 이용하여 편리하고 화려한 사용자 인터페이스를 제공 메시지 구동 구조(message-driven architecture)로 동작 용어 API 윈도우 운영체제가 애플리케이션을 위해 제공하는 각종 함수 집합 메시지 애플리케이션의 외부 or 내부에서 어떤 변화가 발생 -> 해당 애플리케이션에게 알리기 위해 운영체제가 제공하는 개념
3
윈도우 GUI 애플리케이션 - (2) 메시지 구동 구조 ① 이벤트 발생 대기 ... 시스템 메시지 큐 메시지 큐 #3
메시지 큐 #1 메시지 큐 #2 메시지 큐 #3 ... 처리 대기
4
윈도우 GUI 애플리케이션 - (3) GUI 애플리케이션 코드 용어 프로그래머가 작성한 윈도우 프로시저에 따라 메시지를 처리
처리하지 않는 메시지의 경우 운영체제가 자동으로 처리 용어 메시지 핸들러(message handler) 메시지를 받았을 때 동작을 결정하는 코드 윈도우 프로시저(window procedure) 메시지 핸들러의 집합
5
윈도우 GUI 애플리케이션 - (4) 예제 코드 #include <windows.h> // ①
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // ②윈도우 프로시저 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow) // ③Win32 프로그램의 주메인문 { // ④ 윈도우 클래스 등록 - 윈도우의 다양한 특성을 정의한 구조체(MSDN 참고) WNDCLASS wndclass; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hInstance = hInstance; wndclass.lpszClassName = "MyWindowClass"; wndclass.lpszMenuName = NULL; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = (WNDPROC)WndProc; if(!RegisterClass(&wndclass)) return -1;
6
윈도우 GUI 애플리케이션 - (5) 예제 코드 (계속) // 윈도우 생성 ⑤
HWND hWnd = CreateWindow("MyWindowClass", "WinApp", WS_OVERLAPPEDWINDOW, 0, 0, 600, 300, NULL, (HMENU)NULL, hInstance, NULL); if(hWnd == NULL) return -1; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // 메시지 루프 ⑥ MSG msg; while(GetMessage(&msg, 0, 0, 0) > 0){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;
7
윈도우 GUI 애플리케이션 - (6) 예제 코드 (계속) // 윈도우 프로시저 ⑦
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg){ case WM_CREATE: // 윈도우 생성 return 0; case WM_SIZE: // 윈도우 변경 case WM_DESTROY: // 윈도우 종료 PostQuitMessage(0); } return DefWindowProc(hWnd, uMsg, wParam, lParam); // 처리하지 않은 메시지는 운영체제로 넘겨 알아서 처리함
8
윈도우 GUI 애플리케이션 - (7) 메시지 구동 구조 ② 이벤트 발생 애플리케이션 #1 윈도우 프로시저
시스템 메시지 큐 이벤트 발생 애플리케이션 메시지 큐 #1 메시지 큐 #2 메시지 큐 #3 ... 애플리케이션 #1 메시지 루프 메시지 핸들러 #1 메시지 핸들러 #2 메시지 핸들러 #3 ••• DefWindowProc() 윈도우 프로시저
9
윈도우 GUI 애플리케이션 - (8) 컨트롤(control) 운영체제가 제공하는 일종의 윈도우로, 표준화된 형태와 특성을 제공
사용자에게 입력을 받거나 정보를 보여줌
10
윈도우 GUI 애플리케이션 - (9) 컨트롤과 부모 윈도우 ① 통지 메시지 통지 메시지 컨트롤 부모 윈도우
컨트롤의 상태가 변화되었음을 알림 메모리 부족 등으로 인한 오류를 알림 컨트롤 메시지 컨트롤의 상태를 알아내거나 변경 컨트롤 (자식 윈도우) 부모 윈도우 ① 통지 메시지 ② 컨트롤 메시지
11
예제 1 pp. 277 ~ pp. 284 WinApp.cpp 윈도우 GUI 애플리케이션 작성 예제 기본적인 내용임. (중요)
12
윈도우 기반 소켓 애플리케이션 구조 ... ••• 스레드 1 메시지 루프 DefWindowProc() 윈도우 프로시저
메시지 핸들러 #1 메시지 핸들러 #2 메시지 핸들러 #3 ••• DefWindowProc() 윈도우 프로시저 스레드 2 스레드 3 ... 스레드 n 윈도우 메시지 처리 소켓 통신과 데이터 처리
13
예제 2 pp. 286 ~ pp. 298 GUITCPServer.cpp / TCPClient.cpp(4장) 윈도우 기반 소켓 애플리케이션 작성 예제 중요
14
대화상자 기반 애플리케이션 - (1) 대화상자 대화상자 기반 애플리케이션 다양한 컨트롤을 포함하는 일종의 윈도우
애플리케이션의 일부로 존재하며, 사용자의 입력을 처리하거나 출력하는 목적으로 사용 대화상자 기반 애플리케이션 대화상자가 독립적인 애플리케이션으로 존재
15
대화상자 기반 애플리케이션 - (2) 대화상자 기반 애플리케이션을 작성 순서
① 비주얼 C++의 리소스 편집기를 이용하여 대화상자를 시각적으로 디자인 ② 디스크에 *.RC 파일로 저장 리소스 스크립트(resource script) ③ 프로젝트 컴파일 과정에서 리소스 컴파일러가 실행되어 *.RC 파일을 이진 형태인 *.RES로 변환하고, 최종 링크 과정에서 실행 파일에 리소스로 포함 ④ 프로그램 실행 중 대화상자를 생성하는 API 함수를 호출하면, 운영체제는 실행 파일에 포함된 대화상자 템플릿을 토대로 대화상자를 생성
16
대화상자 기반 애플리케이션 - (3) 예제 코드 #include <windows.h>
#include "resource.h" // ① BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM); // ② int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); // ③ return 0; } BOOL CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) // ④
17
대화상자 기반 애플리케이션 - (4) 예제 코드 (계속) switch(uMsg){ case WM_INITDIALOG: // ⑤
return TRUE; case WM_COMMAND: // ⑥ switch(LOWORD(wParam)){ case IDOK: EndDialog(hDlg, 0); // ⑦ case IDCANCEL: EndDialog(hDlg, 0); } return FALSE;
18
대화상자 기반 소켓 애플리케이션 (1) 구조 일반 GUI 소켓 애플리케이션과 동일 스레드 1 메시지 루프 메시지 핸들러 #1
메시지 핸들러 #2 메시지 핸들러 #3 ••• 대화상자 프로시저 스레드 2 스레드 3 ... 스레드 n 대화상자 메시지 처리 소켓 통신과 데이터 처리
19
대화상자 기반 소켓 애플리케이션 - (2) 스레드 동기화가 필요한 상황 스레드 1 ① ② ⑤ ③ 네트워크 ④ 애플리케이션 버퍼
스레드 2
20
예제 3 pp. 311 ~ pp. 325 GUITCPServer.cpp / GUITCPClient.cpp 대화상자 기반 소켓 애플리케이션 작성 예제 중요 이번 학기 동안 수고 많았습니다.
Similar presentations