쑤쑤_CS 기록장

[TIPS 20기]11. Windows 프로그래밍 첫번째 강좌 정리 본문

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

[TIPS 20기]11. Windows 프로그래밍 첫번째 강좌 정리

(╹◡╹)_ 2019. 5. 30. 05:32
728x90

<문제> 연결 리스트를 다형성으로 변경하는 과제 
https://blog.naver.com/tipsware/220876194379

 

[Quiz] 연결 리스트를 사용하여 성적 처리 프로그램 만들기

: C 언어 관련 전체 목차 http://blog.naver.com/tipsware/221010831969이 문제는 제 책('Do it! C 언어...

blog.naver.com

<답> C언어로 만들어진 예제를 C++언어로 변경하기  
https://blog.naver.com/tipsware/221456782438 

 

[Quiz] C 언어로 만들어진 예제를 C++ 언어로 변경하기

: C++ 언어 관련 전체 목차http://blog.naver.com/tipsware/221028559903 1. 문제아래에 링크한 Quiz는 ...

blog.naver.com

 

 



<김성엽의 Windows 프로그래밍 이야기>
https://blog.naver.com/tipsware/221059977193 

 

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

기본적으로 Windows 프로그래밍을 배운다는 뜻은 Win32 API를 사용한 응용 프로그램을 만드는 방법에 ...

blog.naver.com

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

 

'Window Class'에 대하여~

: Win32 프로그래밍 관련 전체 목차 http://blog.naver.com/tipsware/221059977193이 글은 C++ 언어의 cl...

blog.naver.com


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


* Win 32
== Windows 데스크톱 마법사

* Windows 프로그램
시작 : 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 함수 호출, 저 함수 내 프로그램 종료 가능하게 해야)
 -> 윈도우즈가 어떻게 동작하는지?! 알아야

 

 

 

 

 

오늘 수업도 아래 사이트의 댓글을 통해 정리된 정보 더욱 얻을 수 있습니다.

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

 

[20기 TIPS 강좌] 열 한번째 지식 나눔 강좌

안녕하세요. 20기 TIPS 프로그래밍 강좌 수강생 여러분!​다음 강좌 시작 전까지 오늘 공부한 내용을 ...

blog.naver.com

 

728x90
Comments