....................................................................
  OutPut Group Study in API (Application Programming Interface)

  STUDY #1 : Basic structure Code in Windows's API

                      Typed by Jo.K.M   1997/12/16 01:51
....................................................................
   *  :  참고      >>> :  참고 어휘   pn : 파라미터

  (1). API하에서의 코팅의 기본 구조
  ==========================================

    윈도우에서는 모든 애플리케이션이 메서지 처리에 의해서 실행이 됩니다.
    즉, 윈도하의 코딩의 기본 구조는 메서지 처리를 위한 무한 루프가 주가
    됩니다.

    만일, 유저가 작업 창에서 마우스로 클릭을 했다면 윈도우는 그 사건을
    메세지 큐라 곳으로 보내게 됩니다. 따라서 우리는 그 메서지 큐로 부터
    메세지를 받아서 처리할수 있는 루틴을 만드는 것이 윈도 App 코딩의
    주요 골격이라고 할수 있겠지요. 물론 그 루틴은 무한 루프여야 겠지요?

    그런데, 만일 여러 App을 띄우고 마우스를 클릭했다면 어떨까요? 아마
    윈도우는 어떤 App안에서 마우스를 클릭했는지 구분을 해야할 것입니다.
    그래서 존재하는 것이 윈도 핸들이라는 고유번호이지요. >>> hInstance

    다음은 평범한 API 코딩의 예입니다.

    WinMain()
    {
        첫번째 부분 - 생성할 윈도우의 속성을 지정(윈도의 배경색,커서모양등)
        두번째 부분 - 윈도우가 화면에 보이게 끔하는 코딩
        세번째 부분 - 메세지큐로 부터 얻어온 메서지 처리 코딩
    }

    알아두어야 할일은 세번째 부분인 메서지 처리부를 위해서 우리는 윈도우 함수
    라는 메세지를 받아서 그것을 switch문을 통해 일괄 처리하는 함수가 필요하다
    는 것이지요. >>> WNDPROC

  (2). 윈 메인 함수
  ==========================================

   도스에서 main함수가 있듯이 윈도우 프로그래밍에서는
   WinMain이라는 함수가 존재합니다.

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

   * WINAPI  - 함수를 부르는 순서가 WINAPI형식을 따른다는 말입니다.

   p1 hInstance - 윈도 애플리케이션을 실행하고 나면 윈도는 각각 그 애플리케이션
                  마다 핸들이라는 고유번호를 부여하고 관리 하게 되지요.

   p2 hPrevInstance - 같은 App가 실행되었을때 그 전의 App의 핸들값이 들어가게
                      됩니다. 하지만 윈도95는 운영체제 특성상 아무리 같은 App를
                      실행하였다 하여도 각각 다른 App로 인식하기 때문에 이 파라
                      미터는 언제나 NULL값이 들어가게 되지요.

   p3 lpszArg - 명령행에 대한 파라미터

   p4 nCmdShow - 생성될 윈도의 기본 형태 (윈도창의 크기 등)

  (3). WNDCLASS >>> 첫번째 부분
  ===========================================

    아까 말한 윈도의 속성을 지정하는 부분이 있었지요? 그 속성을 지정하는 형식이
    바로 WNDCLASS 라는 구조입니다.

    typedef struct tagWNDCLASS
    {
      UINT style;                 // 윈도의 속성
      WNDPROC lpfnWndProc;        // 윈도함수 지정
      int cbClsExtra;             //
      int cbWndExtra;             //
      HINSTANCE hInstance;        // 인스턴스 핸들,처음 받아온 hInstance 대입
      HICON hIcon;                // 윈도가 최소화 됐을때 사용할 아이콘
      HBRUSH hCursor;             // 커서 모양
      LPCTSTR lpszMenuName;       // 윈도가 지닌 메뉴 이름
      LPCTSTR lpszClassName;      // 윈도 클래스 이름
    }

    이 구조체에 각각 값을 대입해서 RegisterClass()함수를 통해 등록을 합니다.

    ATOM RegisterClass(const WNDCLASS *lpwc);

   (4). CreateWindow >>> 두번재 부분
   ===========================================

     윈도를 생성하는 함수가 CreateWindow()라는 함수 입니다.

     HWND CreateWindow{
         LPCTSTR lpszClassName,
         LPCTSTR lpszWindowName,
         DWORD dwstyle,
         int x,
         int y,
         int nWidth,
         int nHeight,
         HWND hwndParent,
         HMENU hmenu,
         HANDLE hinst,
         LPVOID lpvParam
     );

       p1 lpszClassName - WNDCLASS의 lpszClassName을 대입해야 실제속성이 적용됩니다.

       p2 lpszWindowName - 윈도 타이틀 바의 제목

       p3 dwstyle - 윈도의 모양 : 최소화버튼,최대화 버튼등에 관련

       p4 x - 생성될 윈도의 x좌표

       p5 y - 생성될 윈도의 y좌표

       p6 nWidth - 생성될 윈도의 넓이

       p7 nHeight - 생성될 윈도의 높이

       p8 hwndParent - 윈도를 포함하고 있는 부모 윈도의 핸들을 지정합니다.

       p9 hmenu - 메뉴가 있다면 메뉴 구조체를 받고 없다면 NULL

       pa hinst - 현재 App의 인스턴스 핸들을 지정합니다. >>> hInstance

       pb lpvParam - NULL

     이렇게 하면 윈도가 생성이 되는데 이제는 이 윈도를 보여주는 함수를 봅시다.

       BOOL ShowWindow( HWND hwnd, int nCmsShow);
       BOOL UpdateWindow( HWND hwnd );

     HWND자료형은 윈도 핸들을 의미합니다. 두개의 함수를 함께 씀으로써 위도를
     실제 보여주게 됩니다.

  (5). Message  >>> 세번째 부분
  ==============================================

   이제 메세지 큐에서 메세지를 가져오는 부분에 대해 알아 보겠습니다.
   물론 메세지를 받아 오는 부분은 무한 루프로 만들어야 겠지요?

     BOOL GetMassage ( LPMSG lpmsg ,HWND hwnd ,UINT uMsgFilterMin ,UINT uMsgFilterMax);

   만일 리턴값이 0이면 프로그램 종료를 의미 하게 됩니다.

     BOOL TranslateMessage( CONST MSG *lpmsg );
     LONG DispatchMessage( CONST MSG *lpmsg );

   TranslateMassage()함수는 키보드로 인해 발생한 키값을 윈도가 처리할 수있는
   메세지의 형태로 바꾸는 일을 합니다.
   DispatchMessage()함수는 WNDCLASS의 WNDPROC즉, 윈도함수로 메세지를 보내는
   역활을 합니다.

   LRESULT CALLBACK WndProc( HWND hWnd, UINT mseg, WPARAM wParam, LPARAM lParam );

   WndProc이라는 함수명은 임의로 지은것으로 WNDCLASS의 WNDPROC에 들어갈 함수명
   과 같으면 임의로 지어도 상관 없습니다.
   p2의 mseg는 DispatchMessage()함수에 의해 얻어온 메세지가 들어오는 것이고
   wParam과 lParam은 미처 mseg에 들어가지 못한 부수적인 메세지입니다. 하지만
   두개 모두 중요한 메세지들입니다.

  (6). 아무일도 하지않은 윈도우 생성 예제
============================================

   이번에는 여지껏 알아온 것을 기반으로 아무일도 하지 않는 기본적인 윈도를
   생성해보겠습니다.

   * Compile 방법 : MSDevs 4.1( Microsoft Developer Studio )에서
     File/New/Project Workspace 선택하시고 왼편 타입을 Application으로 맞
     추시고, 아래 소스를 Insert/Files into Project 로 포함합니다.
     마지막으로 Build/Build 를 하시고, Build/Excute 로 실행 합니다.

   ......< api.c >.....................................................
   #include <windows.h>

   LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );

   int WINAPI WinMain
   (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArg,int nCmdShow)
   {
    HWND hWnd;
    MSG msg;
    WNDCLASS WndClass;
    char szAppName[] ="Basic Window";

    // 첫번째 부분 - 윈도의 속성을 지정합니다.
    WndClass.style = NULL;                   // 윈도 스타일 기본값
    WndClass.lpfnWndProc = WndProc;          // 윈도 함수 지정
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hInstance = hInstance;
    WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    WndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
    WndClass.hbrBackGround = GetStockObject(WHITE_BRUSH);
    WndClass.lpszMenuName = NULL;
    WndClass.lpszClassName = szAppName;
    if(!RegisterClass(&WndClass)) return NULL;

    // 두번째 부분 - 윈도를 생성, 보이게 합니다.
    hWnd = CreateWindow(
           szAppName,
           szAppName,
           WS_OVERLAPPEDWINDOW,
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           NULL,
           NULL,
           hInstance,
           NULL
    );

    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);

    // 세번셉 부분 - 메세지를 얻어와서 윈도함수로 메세지를 주어 메세지 처리를 합니다.
    while(GetMessage(&msg,NULL,0,0))
    {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
    }

    return msg.wParam;
  }

  LRESULT CALLBACK WndProc(HWND hWnd,UINT mseg,WPARAM wParam,LPARAM lParam)
  {
      switch(mseg)
      {
          case WM_DESTROY: PostQuitMessage(0);
                           return FALSE;
      }
      return DefWindowProc(hWnd,mseg,wParam,lParam);
  }
  ........................................................................
     * 함수 설명

     HICON LoadIcon( HINSTANCE hinst, LPCSTR lpszIcon );
       보통 p1은 NULL p2는 아이콘의 모양입니다.

     HCUSOR LoadCursor( HINSTANCE hinst, LPCSTR lpszCursor );
       보통 p1은 NULL p2는 화살표의 모양입니다.

     HGDIOBJ GetStockObject( int fnObject );
       펜,브러쉬,폰트등의 핸들을 넘기는 함수, 파라미터에 따라 내용이 달라집니다.

     VOID PostQuitMessage( int nExitCode );
       p1이 0일 경우 프로그램 종료입니다.

     LRESULT DefWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
       윈도 메세지를 디폴트로 처리합니다.

+ Recent posts