▶ 뭉충닷컴
 
mungchung.com login
Site Search
My Space
주절주절...
공부방
쥔장소개
Board
자유게시판
유용한 정보
자료실
Programming
강좌 & Articles
Spring 3.0
프로그래밍 Tip
   -ASP
   -PHP
   -JavaScript
   -HTML
   -Java/JSP
   -Database
   -Crystal Report
   -Visual Basic
   -이클립스
   -리눅스
   -기타
Windows API (VB)
Spread Sheet 7.0
컴퓨터활용 Tip
Other things
StarCraft 전략
StarCraft 문서
김용(金庸)
Son Q & Dieda

[C++ Study] WinMain와 WinProc

기타 조회 수 8743 추천 수 0 2004.06.28 08:53:02
뭉충닷컴 *.92.117.106
// TestSDK.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    // TODO: Place code here.
    static char szAppName[] = "Test SDK_버전 1";
    static char szTitle[] = "Test SDK 윈도우즈 프로그램";

    MSG         msg;
    HWND        hWnd;
    WNDCLASSEX  wc;

    wc.cbSize       = sizeof(WNDCLASSEX);
    wc.style        = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc  = (WNDPROC)WndProc;
    wc.cbClsExtra   = 0;
    wc.cbWndExtra   = 0;
    wc.hInstance    = hInstance;
    wc.hIcon        = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor      = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground= GetSysColorBrush(COLOR_WINDOW);
    wc.lpszMenuName = NULL;
    wc.lpszClassName= szAppName;
    wc.hIconSm      = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassEx(&wc);

    hWnd = CreateWindow(szAppName, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

    if (!hWnd)
        return (FALSE);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (msg.wParam);
}

#include <stdio.h>  // sprintf 함수를 이용하기 위해서 include함
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        char temp[80];
        PAINTSTRUCT ps;
        HDC hdc;
        static int count;
        // uMsg : OS로부터 전달받은 Paramater 변수
        switch(uMsg)
        {
        case WM_CREATE:     // Window 생성시 불려지는 Message
                count = 0;
                break;
        case WM_PAINT:      // 출력이 필요한 경우 or 출력을 해도 좋다는 Message
                hdc = BeginPaint(hWnd, &ps);

                strcpy(temp, "Hello world");
                
                // 아래 코드는 WM_PIAINT가 얼마나 자주 호출되는지 보여주는 코드이다.
                // 최소화, 최대화 시키면 숫자 증가함(WM_PAINT는 여러번 호출!)
                count++;
                sprintf(temp, "Count = %d", count);

                TextOut(hdc, 50, 50, temp, strlen(temp));
                EndPaint(hWnd, &ps);
                break;
        case WM_DESTROY:    // Window 종료시
                PostQuitMessage(0);
                break;
        }
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

/*

  WinMain
    일반적인것 처리
    1. RegisterClassEx로 Application을 등록시킨다.
    2. CreateWindow로 Window를 하나 만든 후 ShowWindow로 그 윈도우를 나타낸다.
    3. Message Pumping를 시작한다.

  WinPorc  
    strcpy(temp, "Hello world") 부분을 WM_CREATE에서 코딩한후 실행시키면 안된다.
    왜냐면 WM_CREATE와 WM_PAINT등등이 호출되는 시기는 서로 다른 시기이기 때문이다.
    
    WM_CREATE에서 strcpy(temp, "Hello world")과 같이 temp변수를 초기화 해도
    CALLBACk 함수는 해당 처리를 마친후 바로 리턴을한다. WM_PAINT가 호출 될때 temp
    는 다시 로컬 변수로 선언, 사용된다. 때문에 이것을 해결하려면 temp 변수를
    static char temp[80] 으로 선언하여 값이 없어지지 않도록 하면 된다.


  *) Message들은 <winuser.h>에 정의되어 있다.
  *) Message Pumping
        WinMain은 CreateWindow로 Window를 생성한 후, Message Pumping를 계속 수행한다.
        System에서 발생하는 연속적인 Message(Event)는 Message Queue에 쌓이게 되는데,
        Message Pumping이란 이를 Queue에서 하나씩 꺼내어 처리(DispatchMessage)하는 것을 말한다.
  *) WinMain이 Entry-Point라면, WndProc 함수는 누가 호출되는 하는가?
        WndProc함수는 Event 발생시 OS에 의해 직접 호출되며, 이때 Message 종류와 내용을
        Paramater로 전달받는다. 이렇게 OS에 의해 직접 불려지는 함수를 CALLBACK 함수라고 한다.
        WinProc가 호출될 함수라는 정보는 사실, WinMain에서 등록할때 이 함수명을 함수 포인터에
        전달하기 때문에 가능해진다.
  *) WM_CREATE와 WM_PAINT는 각각 별개이나, 이 두 Message 간의 순서는 는 있다. 윈도우가
     생성되면 WM CREATE가 호출되며, 그 후 최초에 화면을  Display 하기 위해 WM_PAINT가 호출된다.
  *) 프로그램에 필요한(Message 간에 설쳐서 사용되는) 데이타는 static로 선언한다.
  *) Window에서 화면에 숫자를 직접 나타낼수 없다. 때문에 sprintf함수를 이용해서 count -> string로 변환
     한다. sprintf함수는 printf함수와 유사하며, printf의 내용을 맨 왼쪽 temp string에 넣어준다.


  */
문서 첨부 제한 : 0Byte/ 2.00MB
파일 크기 제한 : 2.00MB (허용 확장자 : *.*)
List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 기타 공부하는 곳 -_-; [2] 뭉충닷컴 2002-09-22 10654
31 토비의 스프링 뭉충닷컴 2011-03-28 3932
30 웹사이트 최적화 기법 file [1] 뭉충닷컴 2009-08-10 7759
29 기타 아파치 튜닝 [1] 뭉충닷컴 2009-08-03 8232
28 기타 아파치 설정 httpd.conf 뭉충닷컴 2009-08-03 5381
27 Intercepting Filter 패턴 뭉충닷컴 2009-06-17 7080
26 Core J2EE Pattern file 뭉충닷컴 2009-06-16 6551
25 기타 [C++ Study] Timer 사용 [3] 뭉충닷컴 2004-06-29 8638
24 기타 [C++ Study] Click Count, Toggle, Move String 뭉충닷컴 2004-06-29 7368
» 기타 [C++ Study] WinMain와 WinProc 뭉충닷컴 2004-06-28 8743
22 기타 C# Pattern - Simple Pattern 뭉충닷컴 2004-03-17 6241
21 기타 1. abex3 크랙 설명서 뭉충닷컴 2004-03-12 7028
20 기타 어셈 강좌 1, 2장 정리 뭉충닷컴 2004-03-12 7722
19 기타 SoftICE 4.05 설치 & 간단한 사용법 뭉충닷컴 2004-03-12 9132
18 기타 5. Overloading, Overriding, Runtime Type and 객체지향 뭉충닷컴 2003-12-02 6493
17 기타 4. Flow 통제와 예외 처리(Exception Handling) 뭉충닷컴 2003-11-05 6016
16 기타 3. 연산자와 지정 뭉충닷컴 2003-11-03 6634
15 기타 2. 선언과 엑서스 제어 뭉충닷컴 2003-11-03 5923
14 기타 1. 자바언어의 기본 뭉충닷컴 2003-11-03 5813
13 기타 Parameter 을 asp 처럼 사용하게 만든 class 뭉충닷컴 2003-11-03 6687