MFC - 기본구조

2011. 3. 19. 03:04카테고리 없음


@ 초기화 부분
 

int APIENTRY _tWinMain(...)

{

  초기화 부분

}

- 메시지 꺼내오는 부분 있다.

1. 윈도우 클래스 생성 (윈도우식의 Class style)

2. 윈도우 클래스 등록

3. 프레임 윈도우 생성

4. 메시지 루프

 

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

- hInstance : 운영체제의 커널이 응용프로그램에 부여한 id

- hprev.. : 이전 프로그램 id //지금 안씀

- dzCmdLine : 커맨드라인 상에서 프로그램 구동시 전달된 문자열 //지금 안씀

- iCmdShow : 윈도우가 화면에 출력될 형태

 

- 윈도우 클래스 원형

typedef struct _WNDCLASSEX
{

  UINT cbSize; //본구조체의크기
  UINT style; //출력스타일
  WNDPROC lpfnWndProc; //프로시저함수
  intcbClsExtra; //클래스여분메모리
  intcbWndExtra; //윈도우여분메모리
  HANDLE hInstance; //응용프로그램인스턴스핸들러
  HICON hIcon; //아이콘
  HCURSOR hCursor; //커서
  HBRUSH hbrBackground;//배경색
  LPCTSTR lpszMenuName; //메뉴이름
  LPCTSTR lpszClassName; //클래스이름
  HICON hIconSm; //작은아이콘
} WNDCLASSEX;

 

- 윈도우 클래스 사용법

WNDCLASSEX wndclass;// 구조체정의
wndclass.cbSize= sizeof(wndclass) ;// 구조체크기
wndclass.style= CS_HREDRAW | CS_VREDRAW ;
// 출력스타일-> 수직/수평의변화시다시그림
wndclass.lpfnWndProc= WndProc;// 프로시저함수명
wndclass.cbClsExtra= 0 ; // 여분메모리(Class)
wndclass.cbWndExtra= 0 ; // 여분메모리(Window)
wndclass.hInstance= hInstance;// 응용프로그램인스턴스핸들러
wndclass.hIcon= LoadIcon(NULL, IDI_APPLICATION); //아이콘
wndclass.hCursor= LoadCursor(NULL, IDC_ARROW); // 커서
wndclass.hbrBackground= (HBRUSH)
GetStockObject(WHITE_BRUSH); // 배경색
wndclass.lpszMenuName= NULL ;// 메뉴이름
wndclass.lpszClassName= “ClassNameEx”; // 클래스이름
wndclass.hIconSm= LoadIcon(NULL,IDI_APPLICATION); // 작은아이콘

 

- 윈도우 클래스 등록

RegisterClassEx(&wndclass);

 

- 윈도우 프레임 만들기

hwnd= CreateWindow// 윈도우가생성되면핸들(hwnd)이반환됨
(
szWindowClass, // 윈도우클래스이름
szTitle, // 윈도우타이틀
WS_OVERLAPPEDWINDOW, // 윈도우스타일
CW_USEDEFAULT, // 윈도우위치, x좌표
0, // 윈도우위치, y좌표
CW_USEDEFAULT, // 윈도우폭
0, // 윈도우높이
NULL, // 부모윈도우핸들
NULL, // 메뉴핸들
hInstance, // 응용프로그램인스턴스핸들
NULL) ; // 생성된윈도우정보

ShowWindow(hwnd, iCmdShow);// 윈도우의화면출력
// nCmdShow: SW_HIDE, SW_SHOW, SW_MAXIMIZE, SW_MINIMIZE



 

UpdateWindow(hwnd); // O/S에WM_PAINT 메시지전송

                                 // 최소화나 닫고난뒤 그 부분에대해서 Redraw 할때 필요( 나중에 )

 

- 메시지 큐에서 메시지를 꺼내서 처리



 while (GetMessage(&msg, NULL, 0, 0))// WM_QUIT인경우 종료

//WinProc()에서PostQuitMessage() (0반환) 호출때까지처리(OS에 WM_QUIT 메시지전송)

{

  if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) //핫키, WM_COMMAND 발생된 것 처럼 해석

  {

   TranslateMessage(&msg);// Shift ‘a’ -> 대문자‘A’

   DispatchMessage(&msg);// WinMain-> WinProc

  }

}

 

@ 메시지를 처리하는 부분
 

LRESULT CALLBACK WndProc(...)

{

 메시지 처리루틴

}

- 기본적인 메시지처리 소스가 포함되어 있다.

- 윈도우에서 들어온 메시지를 switch문을 이용하여 처리하는 루틴
 

LRESULT CALLBACK WinProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
  switch(message)

   {
   해당메시지에대한처리
   }
}

 

1. WinMain()에서 전달된 메시지를 처리 (기본소스)

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

  switch (message) // 메시지번호

  {

   case WM_COMMAND: // 메시지에따라처리

     :

   case WM_PAINT: // 화면 그릴 필요가 있을때

     hdc= BeginPaint(hWnd, &ps);

     EndPaint(hWnd, &ps);

   break;

  case WM_DESTROY:

    PostQuitMessage(0); // OS WM_QUIT 메시지 전송, 이부분을 지우면 메시지 루프가 끝나질 않고

                                      프로세스상에 남아있게 된다, 화면에서만 사라짐

    break;

  default:

    return DefWindowProc(hWnd, message, wParam, lParam);
// CASE에서 정의되지 않은 메시지는 커널이 처리하도록 메시지전달
}