쑤쑤_CS 기록장

[TIPS 20기]11. Windows 첫번째 강좌 정리 본문

IT 지식 기록/TIPS - C 언어 수업 정리

[TIPS 20기]11. Windows 첫번째 강좌 정리

(╹◡╹)_ 2019. 2. 14. 19:09
728x90



C언어와 C++언어에 대한 이론 수업 후,

Visual Studio에서 기존 Windows 데스크톱 응용 프로그램을 만드는 실습 수업이 진행되었습니다!


Windows API (Win32 API, Windows Desktop API 및 Windows 클래식 API라고도 불림)는 Windows 응용 프로그램을 만들기 위한 C 언어 기반 프레임 워크입니다. MFC, ATL 및 NET framework와 같은 Windows API를 기반으로 빌드되어 더욱 고급 및 프로그램을 쉽게 개발할 수 있는 프레임 워크입니다.


Windows 수업이 진행된 후, MFC 실습으로 이어질 예정입니다 : )





강의를 진행해 주시는 김성엽 강사님의 블로그에 강의 내용이 정리되어 있는 글 입니다.


<김성엽의 Windows 프로그래밍 이야기>


https://blog.naver.com/tipsware/221059977193




<Window Class에 대하여>


https://blog.naver.com/tipsware/221004018862








[ 강의 정리 ]




오늘의 목표 : Windows 프로그래밍 원리 / 어떻게 구현되는지 알아가기

* Win 32

== Windows 데스크톱 마법사

* Windows 프로그램


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// TipsWin32.cpp : 응용 프로그램에 대한 진입점을 정의합니다.
//
 
#include "stdafx.h"
#include "TipsWin32.h"
 
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   if (uMsg == WM_DESTROY) PostQuitMessage(0);
   return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   WNDCLASS wc;
 
   wc.cbClsExtra = NULL;
   wc.cbWndExtra = NULL;
   wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
   wc.hCursor = LoadCursor(NULL, IDC_ARROW);
   wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
   wc.hInstance = hInstance;
   wc.lpfnWndProc = WndProc;
   wc.lpszClassName = L"tipssoft";
   wc.lpszMenuName = NULL;
   wc.style = CS_HREDRAW | CS_VREDRAW;
 
   RegisterClass(&wc);
 
   HWND hWnd = CreateWindow(L"tipssoft", L"자! 조금만 힘냅시다!",
      WS_OVERLAPPEDWINDOW, 10090400350NULLNULL, hInstance, NULL);
   ShowWindow(hWnd, SW_SHOW);
   UpdateWindow(hWnd);
 
   MSG msg;
   while (GetMessage(&msg, NULL00)) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
 
   return msg.wParam;
}
cs


시작 : WinMain 함수

WINAPI는 콜백의 의미. (파스칼 스택프레임 규정에 따라)

핸들 HANDLE : 운영체제 입장에서 응용 프로그램이 권한을 이용할 수 있는 번호 ex) 은행에서 번호표의 역할

+ 운영체제 내부에 있는 어떤 리소스의 주소를 정수로 치환한 값

++ Windows 운영체제는 자신의 내부 자원(정보)을 응용 프로그램이 간접적으로 사용할 수 있게 포인터의 개념과 유사하지만 포인터는 아닌 '핸들'이라는 개념을 제공하는데 이 '핸들'의 동작 원리를 설명하는 글

https://blog.naver.com/tipsware/221065382244

+ 핸들을 의미하는 자료형은 모두 앞에 H로 시작한다.

+) 용어 정리

- 프로그램 : 디스크에 있는 실행 파일

- 프로세서 : 프로그램이 실행되면 프로세서가 된다. 메모리에 올라가서 운영 가능한 형태. by 운영체제

프로그램을 구별하기 위한 핸들이 존재한다. 모두 구분 가능

- resource : 프로그램에서 쓸 수 있는 자원. 소스와 구분된 그림파일, 아이콘, 메뉴 등의 통칭

HINSTANCE : 리소스에 접근하고 싶을 때 이용하는 핸들

프로세서 안에 존재하는 '리소스'들을 따로 관리할 수 있는 기술. 리소스를 공유하는 개념 - 운영체제가 제공

++ 프로그램에 포함된 각종 리소스에서 비트맵, 아이콘과 같은 정보를 사용하려고 하면 해당 프로그램의 HINSTANCE값이 반드시 필요합니다.

https://blog.naver.com/tipsware/221065845049

4개의 실행 인자

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

H : 핸들

LP : long point 32비트 포인터

n : 열거해 놓은 값 중 정해진 값을 쓸 때

+) cb : count bite

   lpfn : long pointer function name

   sz : zero terminate String. 널 문자가 있는 문자열

   CS_ : class style

   IDI : ID icon

   u : unsigned define

   (예전 용어지만,, 의미는 알아두자^^)

   ( +흔한 naming 규칙_ 함수 : 대문자, 변수 : 소문자)

   (제공되는 함수 보기 : '대문자_' 하면 사용 가능한 함수가 뜬다)

+) Windows (WIN): 운영체제

   Window (WND): 창, 화면

   brush : 채우기

   pen : 선

   carrot : 키보드 입력 시 깜빡이는 |

   cursor : 마우스 커서

   캡션 바 : 시스템 명칭

   

운영체제 : 국가. 거대한 조직

운영체제 설계 - 국가(정부)가 하는 일 처럼 설계 원리

* 구조체 WNDCLASS : 출생신고 - 프로그램이 동작하는데 필요한 정보를 미리 받아두는것이다. (미리 프로그램 등록 시 동작, 설정, 환경에 대한 정보를 적는것이 효율적이므로)

프로그램에 대한 출생신고를 해야 Windows 이용 가능

정보를 빠트리면(서비스 등록 실패) - 컴파일시 파일을 write 할 수 없다는 경고가 뜬다(-> 강제 종료 해야 됨)

프로그램 정보 설명(윈도우)

wc.cbClsExtra = NULL; //뒤에 추가해서 쓸 수 있는. 현재는 없음

wc.cbWndExtra = NULL; //뒤에 추가해서 쓸 수 있는. 현재는 없음

wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //배경색 정함. 0~20 : 많이 사용되는 정해진 색깔을 의미하는 번호

wc.hCursor = LoadCursor(NULL, IDC_ARROW); //마우스 커서. 내 리소스의 커서를 특별하게 사용하지 않고(NULL) 일반적인 커서(ARROW)를 사용한다는 의미. hand와 wait는 사용하지 마세요.

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); //맨왼쪽위 프로그램의 아이콘. 첫번째 인자는 내 리소스의 아이콘 지정할 경우. 두번째 인자는 윈도우가 제공하는 기본.

wc.hInstance = hInstance; //

wc.lpfnWndProc = WndProc; // 어플리케이션 실행시 사용할 수 있는 함수들의 지정해놓은 주소

wc.lpszClassName = L"tipssoft"; //프로그램 이름. 한글 대신 고유한 영문 이름을 권장함

wc.lpszMenuName = NULL; //프로그램 메뉴. 메뉴 사용하지 않을 경우 NULL

wc.style = CS_HREDRAW | CS_VREDRAW; //class스타일. 동작 특성을 의미함. (외적인 형태 아님) ex)CS_DBLCLKS 마우스 더블 클릭 같은 '확장 기능'을 적는다

(패턴을 익히세요^^)

RegisterClass(&wc); 출생신고서 제출. 프로그램 등록 절차 마무리

* 운영체제한테 요구하고 싶을 때 쓰는 함수 API


HWND hWnd = CreateWindow(L"tipssoft", L"자! 조금만 힘냅시다!", WS_OVERLAPPEDWINDOW, 100, 90, 400, 350, NULL, NULL, hInstance, NULL);// 창을 만들어 달라 + 정보(내가만든 이름 + 나올 제목 + Window Style + x, y, cx, cy,  ,, + hInstance 어떤 기능을 하고싶을 때 핸들값을 이용. )

ShowWindow(hWnd, SW_SHOW); //만들어 보여주기

UpdateWindow(hWnd); //그리기 상태일 때 취소하지 말아달라. 취소하지 말고 그려달라.

* 윈도우즈 동작 특성

MSG msg;

while (GetMessage(&msg, NULL, 0, 0)) { // 우체통에 있는 메세지 꺼내옴(복사해서 가져옴 removed). removed를 사용하지 않으려면 PickMessage 이용.

TranslateMessage(&msg); //번역기. 기본적으로 동작하지 않음. 어떤 행위가 발생했을 때 이를 편하게 처리할 수 있는 메세지를 생성해주는 기능 ex) 알파벳 관련 키를 눌렀을 때 어떤 아스키 관련 키라는 추가적인 메세지 발생시킴

DispatchMessage(&msg); //메세지 실행한다. 함수 이름 호출

}

event : 행위

message : 정보. event + 정보

*

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //function pointer 하는 일 등록

{

if (uMsg == WM_DESTROY) PostQuitMessage(0); //프로그램 종료를 위해 필수로 필요한 if문임

return DefWindowProc(hWnd, uMsg, wParam, lParam); //처리하지 않은 메세지 처리. 기능 구현

}

+) 구조

close X 버튼 누르면 -> wm_close 발생 (취소/거부 가능한 메세지임) -> 아무것도 안하면 수긍. 프로그램 종료됨 (VM_CLOSE가 DefWindowProc에 들어가면 프로그램 종료) -> WM_DESTROY 실행됨 -> 우체통 뽑아감. 메세지를 못 뽑아온다

message : 내 프로그램 뿐만 아니라 다른 프로그램 까지 전송 가능한 메세지

WM_DESTROY : 윈도우가 파괴되기 전 너가 할 마지막 작업을 하라는 최후 통첩. 이 메세지가 진행된 후에는 윈도우가 사라진다. 마지막으로 하고싶을 일 정의. 거부할 수 없는 메세지

GetMessage 함수가 0 을 반환하는 경우 : WM_QUIK ->> while문이 빠져나오면서 프로그램 종료

if (uMsg == WM_DESTROY) PostQuitMessage(0); //getmessage 없어지도록

else if(uMsg == WM_CLOSE) { //취소 가능한 메세지

return 1;} //종료 못하게 함

return DefWindowProc(hWnd, uMsg, wParam, lParam);

* 정리

시작 함수 winmain

윈도우즈 운영체제가 지켜야될 것 지켜야 - 출생신고(서비스 등록), createWindow(show, update, 메세지 들어오는지 확인, translate, 디스패치 내 WndProc 함수 호출, 저 함수 내 프로그램 종료 가능하게 해야)

-> 윈도우즈가 어떻게 동작하는지?! 알아야






2019.02.07 수업 사진



#Tips강좌 #Tips프로그래밍강좌 #김성엽 #지식나눔강좌 #tipssoft




728x90
Comments