ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3. 윈도우 프로그램의 뼈대
    I'm a Developer/MFC 2015. 8. 10. 12:12

    MFC는 프로그램의 메인 윈도우를 창틀과 창을 분리해 내듯이 윈도우의 틀과 클라이언트 영역으로 서로 다른 오브젝트로 나누었습니다. 


    ● 프레임 윈도우(CFrameWnd) - 윈도우의 창틀에 해당합니다. 스크롤바, 최소,최대,닫기 버튼, 메뉴표시줄 등이 여기에 속합니다.

    ● 도큐먼트(CDocument) - 윈도우의 클라이언트 영역으로 데이터를 저장 및 처리하는 기능을 합니다. 우리 눈에는 보이지 않고 내부적으로 동작합니다.

     뷰(CView) - 윈도우의 창에 해당하고 클라이언트 영역으로 데이터들을 보여주는 역할을 합니다. 우리가 눈으로 보는 화면영역이라고 볼 수 있습니다. 여기에서 CDocument의 데이터를 참조할 수 있는 기능이 준비되어 있습니다.



    - 프로그램의 뼈대를 이루는 클래스들의 계층 구조


    CObject                                 - 거의 모든 MFC 클래스의 기반 클래스

     CCmdTarget                  - 이벤트를 받는 기능

     CWinApp                - 프로그램을 구동시키는 기능

     CDocument             - 데이터를 저장하고 처리하는 기능

     CWnd                    - 윈도우에 관련된 기능 (눈에 보이는 오브젝트)

     CFrameWnd       - 윈도우 프레임(외곽)을 관리하는 기능

     CView               - 데이터를 보여주는 윈도우 관리하는 기능


    - 윈도우 프로그램의 동작 방식

    윈도우는 사용자의 모든 동작을 감지하여 메시지 형태로 프로그램에 전달해 줍니다.

    따라서 윈도우 프로그램을 만들 때는 프로그램의 동작 순서를 몰라도 됩니다. 

    즉, 어떤 메시지가 발생했을 때 메시지에 해당하는 일을 처리한다고 생각하면 됩니다.



     윈도우 메시지

     발생하는 상황 

     WM_CREATE

     윈도우가 생성될 때

     WM_ACTIVATE

     윈도우가 활성화 되거나 비활성화 될 때

     WM_PAINT

     윈도우가 다시 그려져야 할 필요가 있을 때

     WM_MOUSEMOVE

     마우스 커서가 움직였을 때

     WM_COMMAND

     사용자가 메뉴 등으로 명령을 내렸을 때

     WM_LBUTTONDOWN

     마우스 왼쪽 버튼이 눌렸을 때

     WM_LBUTTONUP

     마우스 왼쪽 버튼이 떼어졌을 때

     WM_LBUTTONDBLCLK

     마우스 왼쪽 버튼이 더블 클릭 됐을 때

     WM_KEYDOWN

     키보드가 눌렸을 때

     WM_KEYUP

     키보드가 떼어졌을 때

     WM_SIZE

     윈도우의 크기가 변경되었을 때

     WM_MOVE

     윈도우가 이동 되었을 때 

     WM_TIMER

     설정된 타이머 시간이 다 되었을 때

     WM_DESTROY

     윈도우가 없어질 때




    CWinApp 클래스

    ◎ 역할

    1. 프로그램의 시작과 종료를 담당합니다.

    2. 프로그램이 시작될 때, 메인 프레임 윈도우를 생성시켜 줍니다.

    3. 메시지 루프를 돌면서 프로그램을 구동 시킵니다.

    4. 프로그램 전체를 대표하는 기능들을 수행합니다.


    ◎ 구조

    프로그램이 시작되면 CWinApp 클래스의 인스턴스가 생성되고, 세 개의 멤버 함수가 차례로 호출됩니다.

    - InitInstance();

    - Run();

    - ExitInstance();

    프로그램이 시작되면 InitInstance함수가 잠깐 실행되고, 무한루프를 돌며 메시지를 처리하는 Run 함수에 계속 머무르다가 프로그램이 끝나기 직전에 ExitInstance 함수가 잠깐 실행되고 프로그램이 종료됩니다. Run 함수에서 WM_QUIT메시지를 만나면 무한루프를 빠져나옵니다.



    CWnd 클래스

    ◎ 역할

    윈도우라는 오브젝트를 클래스로 구현한 것으로 윈도우 프로그래밍에 있어서 가장 핵심이 되는 클래스 입니다. 이 클래스는 약 300여개의 멤버 함수들을 가지고 있는데, 크게 두 부류로 나눌 수 있습니다.

    첫 번째는 윈도우의 크기, 위치, 모양, 상태 등을 제어하는 함수로서, 약 100여 개의 멤버 함수가 이 부류에 속합니다.

    두 번째는 메시지 처리기라 불리는 멤버 함수로서, 윈도우에서 발생하는 메시지를 처리하는 함수입니다. 윈도우 메시지는 약 200여 가지가 있는데, 메시지 처리기는 윈도우 메시지마다 각각 하나씩 존재하기 때문에 약 200여 개의 메시지 처리기가 존재합니다.


    ◎ 구조

    CWnd 클래스는 메시지가 날아올 때마다, 그 메시지를 처리하기 위한 함수를 호출합니다. 메시지를 처리하는 함수를 메시지 처리기라고 합니다. 메시지처리기의 함수명은 윈도우 메시지의 이름에서 앞의 WM_을 떼고, On~을 붙여서 만듭니다.



    CDocument 클래스

    ◎ 역할

    Document 오브젝트는 프로그램에서 처리하는 데이터를 저장하고, 읽어오고, 처리하는데 필요한 모든 기능을 수행하는 눈에는 보이지 않는 오브젝트입니다.

    CDocument 클래스는 다음의 기능들을 가지고 있습니다.

     - 파일로부터 데이터를 읽어오는 기능

     - 파일에 데이터를 저장하는 기능

     - 새로운 데이터를 만드는 기능

     - 작업 중인 데이터를 닫는 기능

     - 데이터가 변경된 사실을 뷰 오브젝트에 알리는 기능



     자주사용하는 윈도우 메시지 모음 


    WM_CREATE : 윈도우가 생성될 때 발생

    WM_ACTIVE : 윈도우가 활성화될 때 또는 비활성화되면 발생

    WM_NCACTIVATE : 윈도우의 비작업영역의 활성화 또는 비활성화시 발생 (윈도우 타이틀바 색상 제어) 

    WM_DESTROY : 윈도우가 파괴되기 직전에 발생

    WM_NCDESTROY : 모든 윈도우가 파괴되고 난 후 발생

    WM_QUERYENDSESSION : 운영체제가 log-off 또는 종료될 때 발생

    WM_PAINT : 윈도우가 다시 그려져야 하면 발생 (아주 중요한 메시지로 MFC에서는 OnPaint() 또는 OnDraw()를 메시지 처리기로 가지고 있음)

    WM_ERASEBKGND : 윈도우의 배경색이 다시 그려져야 할 때 발생

    WM_SHOWWINDOW : 윈도우가 보여질 때 또는 숨겨질 때 발생

     

    WM_LBUTTONDOWN : 마우스 왼쪽 버튼을 누르면 발생

    WM_LBUTTONUP : 마우스 오른쪽 버튼을 눌렀다가 떼면 발생

    WM_RBUTTONDOWN : 마우스 오른쪽 버튼을 누르면 발생

    WM_RBUTTONUP : 마우스 오른쪽 버튼을 눌렀다가 떼면 발생

    WM_MOUSEMOVE : 마우스가 움직이고 있으면 발생

    WM_NCHITTEST : 마우스가 움직이고 있으면 발생. 마우스의 아이콘을 제어하기 위해 사용

    WM_SETCURSOR : 마우스의 아이콘을 재설정해야 할 때 발생

     

    WM_KEYDOWN : 키보드가 눌리면 발생

    WM_KEYUP : 키보드를 눌렀다가 떼면 발생

    WM_CHAR : 키보드가 눌려지면 발생

     

    WM_SIZE : 윈도우의 크기가 변경되면 발생

    WM_MOVE : 윈도우가 이동되면 발생

    WM_WINDOWPOSCHANGING : 윈도우의 위치, 크기 등이 변하고 있으면 발생

    WM_GETMINMAXINFO : 윈도우의 최소, 최대 크기가 변경되기 직전에 발생.

    WM_HSCROLL : 스크롤바에서 수평 스크롤시 발생

    WM_VSCROLL : 스크롤바에서 수직 스크롤시 발생

     

    WM_TIMER : 타이머 설정 시 주기적으로 발생

     

    WM_COMMAND : 메뉴, 버튼, 엑셀러레이터 선택 시 발생

    WM_SYSCOMMAND : 시스템 메뉴, 최소화, 최대화, 이동, 닫기 등에서 발생. SC_CLOSE,

                                        SC_MINIMIZE, SC_MAXIMIZE, SC_MOVE, SC_SIZE, SC_RESTORE

    WM_SYSKEYDOWN : 프로그램 실행 시 F10 키 또는 Alt의 조합키를 누르면 발생

    WM_SYSKEYUP : 프로그램 실행 시 F10 키 또는 Alt의 조합키를 눌렀다가 떼면 발생



    [출처 - Visual C++6 완벽가이드 2nd Edition 영진닷컴]


    'I'm a Developer > MFC' 카테고리의 다른 글

    OnPaint OnDraw  (1) 2015.08.18
    윈도우 메뉴  (0) 2015.08.17
    ComboBox  (0) 2015.08.17
    2. 변수 표기법  (0) 2015.08.07
    1. MFC란?  (0) 2015.08.07

    댓글

Designed by Tistory.