본문 바로가기

윈도우프로그래밍

[윈도우 프로그래밍] 윈도우 프로그래밍의 이해

왜 이해?

나중에 MFC를 사용해서 윈도우 프로그램 작성할 때 도움되므로!

윈도우 프로그래밍은 주로 윈도우 애플리케이션을 만드는 것을 의미

윈도우 프로그래밍의 개념

1. DOS 환경(c++) vs 윈도우 환경

DOS 환경(c++)

-프로그래머가 구현한 순서대로 진행

 

윈도우 환경: 운영체제인 윈도우가 애플리케이션으로 메시지를 보냅니다 !!!!

-사용자가 발생시키는 이벤트에 의한 메시지 처리 방식 (키보드 입력, 마우스 클릭 등의 메시지)

-> 메시지 기반 & 이벤트 기반(사용자) 프로그래밍

=사용자가 왼쪽 마우스 버튼 클릭(이벤트) -> 윈도우 시스템(os-마우스 등 하드웨어와 연결) 해당 애플리케이션에 WM_LBUTTONDOWN 메시지 보냄 -> 이 메시지 받은 애플리케이션(메시지 루프)이 특정 메시지에 대해 어떤 일 수행할 것인지에 대한 처리 루틴 만듭니다. (윈도우 프로시저에서)

-> 애플리케이션에서 사용자가 발생시키는 메시지에 대한 처리 루틴을 만들어 주는 것

-메시지가 발생하면 윈도우 시스템(OS)이 메시지에 해당되는 애플리케이션의 윈도우 프로시저를 호출

 

2. 윈도우 프로그래밍하는 방법

-Wi32 SDK: c언어용 표준 라이브러리, 윈도우 클래스 만들어서 등록 -> 프레임 윈동 생성 -> 메시지 처리 부분까지 모드 프로그래머가 코딩해줘야 함 .... 시간 오래 걸리겠지?

-MFC: c++로 작성된 클래스! 매우 구조적으로 만들어져 있어서 대부분 윈도우를 만들 때 필요한 코드를 자도으로 생성해줘서 프로그래머가 윈도우 프로그램 작성하기 쉽게 해준다 !! 좋아좋아 이걸 우리가 배우고 써먹을 거야. 그런데 이걸 배우기에 앞서서 쉽게 이해하려면 win32 sdk로 만드는 방법도 배워야겠지? ???

 

Win32 SDK 윈도우 프로그램의 기본구조

1.  실제 프로그램에서의 형태: WinMain() + WinProc()

(1) WinMain() 함수{ 초기화 부분 } 초기화 부분

     초기화 부분에 들어가는 내용은??

{

윈도우 클래스(구조체) 속성 정의 후 등록: RegisterClassEx(&WndClass)

프레임 윈도우 생성 및 출력: hwnd(윈도우 핸들)=CreateWindow -> ShowWindow -> UpdateWindow

메시지루프

while(GetMessage(&msg)){

TranslateMessage(&msg)

DispatchMessage(&msg)}

}

 

(2) WinProc() 함수{ 메시지 처리 루틴 } 메시지 처리 부분

윈도우에서 들어온 메시지를 swith문을 이용해서 처리하는 루틴 !!

     메시지 처리 부분에 들어가는 내용은??

{

 

switch(message)

{

해당 메시지에 대한 처리

case WM_CREATE: 

~~

break;

case WM_DESTROY:

~~

break;

}

}

 

-메시지를 처리하는 함수를 procedure라고 합니다.

-윈도우는 message driven 방식입니다.

-함수명 다음에 Proc가 붙으면 프로시저라고 보면 됩니다.

-프로시저는 여러 개가 될 수 있습니다. -> 윈도우 클래스마다 수행되는 프로시저 다르기 때문에

 

2. 실습 1-1 간단한 Win32 SDK 프로그램 만들기

3. 유니코드

4. 윈도우에 문자열 출력하는 방법

문자열 출력하기 위해 반드시 hdc(디바이스 컨텍스트 핸들) 얻어와야 함 -> 어떤 윈도우 창에 우리가 문자열을 출력할 것인지 정하는 것 !!!

-TextOut() 함수: 화면의 지정된 위치에 문자열 출력

-DrawText() 함수 : 화면에 문자를 출력할 때 어느 영역 정하고 이 영역에 출력 형식에 맞게 문자열 출력  -> 출력 형식 플러그 있음 !! 마지막 인자값임.

추가적으로 알아두자 ~~~

-MessageBox() 함수: 사용자에게 간단한 메시지를 출력하는데 사용하는 대화상자 출력하는 함수

윈도우 프로그램의 기본 형식

1. 핸들 vs 구조체

-H로 시작하지 않는 자료형 = 구조체

-Handle: 자원을 식별하기 위한 정수 번호, 핸들 자료형 앞에 H 붙음.. 화면이나 브러쉬 등등 구분해줍니다.

-윈도우에서 모든 자원은 핸들이 관리합니다.

-객체를 컨트롤하기 위해서는 핸들이 필요합니다.

자전거 = 객체, 구조체 / 핸들 = 자전거를 조정하기 위한 핸들

hwnd=윈도우에 대한 핸들

2.  새로운 데이터 형식

-MSG 구조체: 메시지 큐에 저장되는 메시지 정보 담고 있는 구조체

  -> WinMain()의 메시지 루프로 보내줌, WinMain() 함수의 메시지 루프에서 GetMessage() 함수는 메시지 큐에서 메시지를 가져옵니다. &msg

-WNDCLASSEX 구조체: 윈도우 속성에 대한 정보 포함 -> RegisterWinclassEX(&_) 윈도우 등록할 때 !!

-PAINTSTRUCT 구조체: 텍스트나 이미지를 윈도우의 클라이언트 영역에 그리고자 할 때 사용할 정보 포함, hd, RECT 구조체 포함 !

-RECT 구조체: 사각형 형태의 좌표를 지정하는 구조체(왼쪽 상단 좌표와 오른쪽 하단 좌표 지정 가능), DrawText()에서 사용 !

3. 헝가리언 표기법

-변수 이름: 데이터 형식을 의미하는 하나이상의 소문자로 시작(접두어에 int면 i, char형이면 c 붙이는 것!!)

                   -> 변수의 사용과 데이터 형식 기술해 줌으로써, 데이터 형식 불일치 같은 코딩 오류 방지

 

4. 윈도우 시스템의 이해(OS)

-윈도우란 운영체제 시스템이 존재하며, 여기서 애플리케이션 개발합니다.

-윈도우는 GUI

-윈도우 시스템은 멀티태스킹 지원, 윈도우 프로그램 입장에서는 멀티쓰레딩

-윈도우는 메시지 기반 구조: 사용자가 이벤트 발생 -> 윈도우가 애플리케이션으로 메시지 보냄

-윈도우(윈도우 시스템, os)는 윈도우 프로시저(메시지가 해당되어있는 애플리케이션)를 호출

-> 윈도우 프로시저는 메시지에 따른 처리를 한 다음 제어권을 윈도우 시스템으로 반환(윈도우 프로시저에서 WM-QUIT 메시지 발생하고 break;)

연습 문제

-InvalidateRect() 함수:  

-> 윈도우의 클라이언트 영역을 다시 그리는 함수

(다시 그려질 영역을 설정한 윈도우 핸들(hwnd), 다시 그려질 사각 영역(&rect), 배경을 모두 지울 것인지, 놔두고 그릴것인지?(true이면 모두 지움, false이면 그냥 냅두고 그림))