GUI 소켓 애플리케이션 Chapter 08. * 학습목표 윈도우 GUI 애플리케이션의 구조와 동작 원리를 이해 윈도우 기반 소켓 애플리케이션 작성 기법을 익힘 대화상자 기반 애플리케이션의 구조와 동작 원리를 이해 대화상자 기반 소켓 애플리케이션 작성 기법을 익힘
윈도우 GUI 애플리케이션 - (1) 윈도우의 GUI 애플리케이션의 특징 용어 다양한 API(Application Programming Interface)를 이용하여 편리하고 화려한 사용자 인터페이스를 제공 메시지 구동 구조(message-driven architecture)로 동작 용어 API 윈도우 운영체제가 애플리케이션을 위해 제공하는 각종 함수 집합 메시지 애플리케이션의 외부 or 내부에서 어떤 변화가 발생 -> 해당 애플리케이션에게 알리기 위해 운영체제가 제공하는 개념
윈도우 GUI 애플리케이션 - (2) 메시지 구동 구조 ① 이벤트 발생 대기 ... 시스템 메시지 큐 메시지 큐 #3 메시지 큐 #1 메시지 큐 #2 메시지 큐 #3 ... 처리 대기
윈도우 GUI 애플리케이션 - (3) GUI 애플리케이션 코드 용어 프로그래머가 작성한 윈도우 프로시저에 따라 메시지를 처리 처리하지 않는 메시지의 경우 운영체제가 자동으로 처리 용어 메시지 핸들러(message handler) 메시지를 받았을 때 동작을 결정하는 코드 윈도우 프로시저(window procedure) 메시지 핸들러의 집합
윈도우 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;
윈도우 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;
윈도우 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); // 처리하지 않은 메시지는 운영체제로 넘겨 알아서 처리함
윈도우 GUI 애플리케이션 - (7) 메시지 구동 구조 ② 이벤트 발생 애플리케이션 #1 윈도우 프로시저 시스템 메시지 큐 이벤트 발생 애플리케이션 메시지 큐 #1 메시지 큐 #2 메시지 큐 #3 ... 애플리케이션 #1 메시지 루프 메시지 핸들러 #1 메시지 핸들러 #2 메시지 핸들러 #3 ••• DefWindowProc() 윈도우 프로시저
윈도우 GUI 애플리케이션 - (8) 컨트롤(control) 운영체제가 제공하는 일종의 윈도우로, 표준화된 형태와 특성을 제공 사용자에게 입력을 받거나 정보를 보여줌
윈도우 GUI 애플리케이션 - (9) 컨트롤과 부모 윈도우 ① 통지 메시지 통지 메시지 컨트롤 부모 윈도우 컨트롤의 상태가 변화되었음을 알림 메모리 부족 등으로 인한 오류를 알림 컨트롤 메시지 컨트롤의 상태를 알아내거나 변경 컨트롤 (자식 윈도우) 부모 윈도우 ① 통지 메시지 ② 컨트롤 메시지
예제 1 pp. 277 ~ pp. 284 WinApp.cpp 윈도우 GUI 애플리케이션 작성 예제 기본적인 내용임. (중요)
윈도우 기반 소켓 애플리케이션 구조 ... ••• 스레드 1 메시지 루프 DefWindowProc() 윈도우 프로시저 메시지 핸들러 #1 메시지 핸들러 #2 메시지 핸들러 #3 ••• DefWindowProc() 윈도우 프로시저 스레드 2 스레드 3 ... 스레드 n 윈도우 메시지 처리 소켓 통신과 데이터 처리
예제 2 pp. 286 ~ pp. 298 GUITCPServer.cpp / TCPClient.cpp(4장) 윈도우 기반 소켓 애플리케이션 작성 예제 중요
대화상자 기반 애플리케이션 - (1) 대화상자 대화상자 기반 애플리케이션 다양한 컨트롤을 포함하는 일종의 윈도우 애플리케이션의 일부로 존재하며, 사용자의 입력을 처리하거나 출력하는 목적으로 사용 대화상자 기반 애플리케이션 대화상자가 독립적인 애플리케이션으로 존재
대화상자 기반 애플리케이션 - (2) 대화상자 기반 애플리케이션을 작성 순서 ① 비주얼 C++의 리소스 편집기를 이용하여 대화상자를 시각적으로 디자인 ② 디스크에 *.RC 파일로 저장 리소스 스크립트(resource script) ③ 프로젝트 컴파일 과정에서 리소스 컴파일러가 실행되어 *.RC 파일을 이진 형태인 *.RES로 변환하고, 최종 링크 과정에서 실행 파일에 리소스로 포함 ④ 프로그램 실행 중 대화상자를 생성하는 API 함수를 호출하면, 운영체제는 실행 파일에 포함된 대화상자 템플릿을 토대로 대화상자를 생성
대화상자 기반 애플리케이션 - (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) // ④
대화상자 기반 애플리케이션 - (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;
대화상자 기반 소켓 애플리케이션 (1) 구조 일반 GUI 소켓 애플리케이션과 동일 스레드 1 메시지 루프 메시지 핸들러 #1 메시지 핸들러 #2 메시지 핸들러 #3 ••• 대화상자 프로시저 스레드 2 스레드 3 ... 스레드 n 대화상자 메시지 처리 소켓 통신과 데이터 처리
대화상자 기반 소켓 애플리케이션 - (2) 스레드 동기화가 필요한 상황 스레드 1 ① ② ⑤ ③ 네트워크 ④ 애플리케이션 버퍼 스레드 2
예제 3 pp. 311 ~ pp. 325 GUITCPServer.cpp / GUITCPClient.cpp 대화상자 기반 소켓 애플리케이션 작성 예제 중요 이번 학기 동안 수고 많았습니다.