U E D R S I H C RSS
ID
Password
Join
μ Šμ–΄μ„œ 덕을 닦지 λͺ»ν•˜κ³  μž¬μ‚°λ„ μŒ“μ§€ λͺ»ν•œ μ‚¬λžŒμ΄ λŠ™κ³  병듀어 ν›„νšŒ ν•œλ“€ 무엇 ν•˜λ¦¬. - 法 ε₯ ηΆ“

ο»Ώ

Contents

1 λ©”μ„Έμ§€ 기반 처리
2 톡상적인 win32 ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰μˆœμ„œ
3 λΌˆλŒ€μ†ŒμŠ€

1 λ©”μ„Έμ§€ 기반 처리 #

  • win32 μš΄μ˜μ²΄κ³„λŠ” λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€(ν”„λ‘œκ·Έλž¨)의 νŠΉμ • 상황을 "λ©”μ„Έμ§€"둜 μ •μ˜ν•˜κ³  이에 λŒ€ν•œ λ°˜μ‘μ„ μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ λͺ¨λ“  ν”„λ‘œκ·Έλž¨μ„ μš΄μ˜ν•œλ‹€.
  • λ©”μ„Έμ§€μ˜ 예 : μœˆλ„μš°μ˜ ν™•λŒ€, μ΅œμ†Œν™”, 이동, ν‚€λ³΄λ“œ 눌림, 마우슀 클릭, 이동, μ‹œμŠ€ν…œ μ’…λ£Œ λ“±λ“±

2 톡상적인 win32 ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰μˆœμ„œ #

  1. [http]WNDCLASS λ˜λŠ” [http]WNDCLASSEX μ •μ˜ - μœˆλ„μš°μ˜ 기반인 μœˆλ„μš°ν΄λž˜μŠ€ 생성
  2. [http]RegisterClass() λ˜λŠ” [http]RegisterClassEx()λ₯Ό μ‹€ν–‰ - μœˆλ„μš° 클래슀λ₯Ό μš΄μ˜μ²΄κ³„μ— 등둝
  3. [http]CreateWindow() λ˜λŠ” [http]CreateWindowEx()λ₯Ό μ‹€ν–‰ - λ©”λͺ¨λ¦¬μƒμ— μœˆλ„μš° 생성
  4. [http]ShowWindow() μ‹€ν–‰ - μœˆλ„μš°λ₯Ό 화면에 ν‘œμ‹œ
  5. λ©”μ„Έμ§€ 루프 - μš΄μ˜μ²΄κ³„λ‘œλΆ€ν„° μ „μ†‘λœ λ©”μ„Έμ§€λ₯Ό 처리

3 λΌˆλŒ€μ†ŒμŠ€ #

μ•„λ§ˆλ„ μ„Έμƒμ—μ„œ κ°€μž₯ κ°„λ‹¨ν•œ win32 API μ†ŒμŠ€μΌκ²λ‹ˆλ‹€. devcpp ν”„λ‘œμ νŠΈμ—μ„œ νΌμ™”μŠ΅λ‹ˆλ‹€.
#include <windows.h>

/* μœˆλ„μš° ν”„λ‘œμ‹œμ Έ μ„ μ–Έ */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/* μœˆλ„μš° 클래슀λͺ…을 μ •ν•©λ‹ˆλ‹€ */
char szClassName[ ] = "λΌˆλŒ€μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)

{
    HWND hwnd;               /* μœˆλ„μš° ν•Έλ“€ */
    MSG messages;            /* μœˆλ„μš° λ©”μ„Έμ§€λ₯Ό μž„μ‹œμ μœΌλ‘œ λ‹΄μ•„λ‘˜ λ³€μˆ˜. λ©”μ„Έμ§€ λ£¨ν”„μ—μ„œ μ‚¬μš©. */
    WNDCLASSEX wincl;        /* μœˆλ„μš°ν΄λž˜μŠ€ 데이타 ꡬ쑰체 */

    /* μœˆλ„μš° 클래슀 데이타 ꡬ쑰체에 값을 μ±„μš΄λ‹€ */
    wincl.hInstance = hThisInstance;       /* ν˜„μž¬ μΈμŠ€ν„΄μŠ€ ν•Έλ“€κ°’ μ§€μ • */
    wincl.lpszClassName = szClassName;     /* 클래슀 이름. 보톡 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 이름을 μ§€μ •. */
    wincl.lpfnWndProc = WindowProcedure;   /* μœˆλ„μš° ν”„λ‘œμ‹œμ Έ ν•¨μˆ˜ 포인터 */
    wincl.style = CS_DBLCLKS;              /* 더블클릭 이벀트λ₯Ό λ°›μ•„λ“€μž…λ‹ˆλ‹€ */
    wincl.cbSize = sizeof (WNDCLASSEX);    /* 이 ꡬ쑰체 크기 μ„€μ •. (λ°˜λ“œμ‹œ 해야함) */

    /* 마우슀 μ»€μ„œ μ΄λ―Έμ§€λ‘œμ„œ κΈ°λ³Έ μ‹œμŠ€ν…œ μ»€μ„œλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€ */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* 메뉴섀정 μ•ˆν•¨ */
    wincl.cbClsExtra = 0;                      /* μœˆλ„μš° ν΄λž˜μŠ€μ— μ²¨λΆ€λœ 데이타 μ—†μŒ. λŒ€λΆ€λΆ„μ˜ 경우 0 */
    wincl.cbWndExtra = 0;                      /* 뢀가적인 μœˆλ„μš° μΈμŠ€ν„΄μŠ€ λ˜λŠ” ꡬ쑰체 μ—†μŒ. λŒ€λΆ€λΆ„μ˜ 경우 0 */
    /* μœˆλ„μš° κΈ°λ³Έ 배경색상을 μ§€μ •. κΈ°λ³Έ ν…Œλ§ˆ μƒ‰μƒμœΌλ‘œ μ μš©ν•©λ‹ˆλ‹€. */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* μœˆλ„μš° 클래슀λ₯Ό λ“±λ‘ν•˜κ³  μ‹€νŒ¨ν•  κ²½μš°μ—λŠ” ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€ */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* ν΄λž˜μŠ€κ°€ λ“±λ‘λ˜μ—ˆμœΌλ©΄ 이제 μœˆλ„μš°λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€! */
    hwnd = CreateWindowEx (
           0,                   /* μœˆλ„μš° ν™•μž₯ μ˜΅μ…˜ */
           szClassName,         /* ν΄λž˜μŠ€μ΄λ¦„ */
           "ν…ŒμŠ€νŠΈμ–΄ν”Œλ¦¬μΌ€μ΄μ…˜",       /* μœˆλ„μš° 타이틀 바에 적힐 λ¬Έμžμ—΄ */
           WS_OVERLAPPEDWINDOW, /* κΈ°λ³Έ μœˆλ„μš° ν˜•νƒœ */
           CW_USEDEFAULT,       /* μœˆλ„μš° μœ„μΉ˜ x μ’Œν‘œ */
           CW_USEDEFAULT,       /* μœˆλ„μš° μœ„μΉ˜ y μ’Œν‘œ */
           544,                 /* μœˆλ„μš° 폭 */
           375,                 /* μœˆλ„μš° 높이 */
           HWND_DESKTOP,        /* μœˆλ„μš°λŠ” λ°μŠ€ν¬νƒ‘μ— λŒ€ν•΄ μžμ‹μœˆλ„μš°λ‘œμ„œ 생성 */
           NULL,                /* λ©”λ‰΄μ—†μŒ */
           hThisInstance,       /* ν”„λ‘œκ·Έλž¨ μΈμŠ€ν„΄μŠ€ ν•Έλ“€ */
           NULL                 /* μœˆλ„μš° μƒμ„±μ‹œ μ‚¬μš©ν•  μΆ”κ°€ 데이타 μ—†μŒ */
           );

    /* 화면에 μœˆλ„μš°κ°€ 보이도둝 ν•œλ‹€. nCmdShowλŠ” WinMain()μ—μ„œ 4번째 λ§€κ°œλ³€μˆ˜μž„. */
    ShowWindow (hwnd, nCmdShow);

    /* 메세지루프 μ‹€ν–‰. GetMessage()κ°€ 0을 λ°˜ν™˜ν•  λ•ŒκΉŒμ§€ 계속 루프λ₯Ό λ°˜λ³΅ν•©λ‹ˆλ‹€. */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* 가상 ν‚€ λ©”μ„Έμ§€(WM_KEYDOWN)을 문자 λ©”μ„Έμ œ(WM_CHAR)둜 λ²ˆμ—­ν•©λ‹ˆλ‹€ */
        TranslateMessage(&messages);
        /* μœˆλ„μš° ν”„λ‘œμ‹œμ Έλ‘œ λ©”μ„Έμ§€λ₯Ό λ³΄λƒ…λ‹ˆλ‹€ */
        DispatchMessage(&messages);
    }

    /* ν”„λ‘œκ·Έλž¨ λ°˜ν™˜κ°’μ€ 0μž…λ‹ˆλ‹€. μ΄λŠ” PostQuitMessage() ν•¨μˆ˜μ—μ„œ λ§€κ°œλ³€μˆ˜λ‘œ λ„˜κ²Όλ˜ 값이 λ„˜μ–΄μ˜€κ²Œ λ©λ‹ˆλ‹€. (μ•„λž˜ μ°Έμ‘°) */
    return messages.wParam;
}

/* 이 ν•¨μˆ˜λŠ” μœˆλ„μš°μ¦ˆ ν•¨μˆ˜ DispatchMessage()λ₯Ό ν˜ΈμΆœν•  λ•Œ μ‹€ν–‰λ©λ‹ˆλ‹€. */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* 메세지에 따라 λΆ„κΈ°ν•©λ‹ˆλ‹€ */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* λ©”μ„Έμ§€ 큐에 WM_QUIT λ©”μ„Έμ§€λ₯Ό λ³΄λƒ…λ‹ˆλ‹€. */
            break;
        default:                      /* 닀루지 μ•Šμ€ λ©”μ„Έμ§€λŠ” λͺ¨λ‘ μš΄μ˜μ²΄κ³„μ—κ²Œ λ„˜κΉλ‹ˆλ‹€. */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:54
Processing time 0.6227 sec