모듈 1. 첫 번째 Windows 프로그램

이 모듈에서는 최소한의 Windows 데스크톱 프로그램을 작성합니다. 빈 창을 만들고 표시하기만 합니다. 이 첫 번째 프로그램에는 빈 줄과 주석을 제외한 약 50줄의 코드가 포함되어 있습니다. 그것이 시작점이 될 것입니다. 나중에 그래픽, 텍스트, 사용자 입력, 기타 기능을 추가합니다.

Visual Studio에서 기존 Windows 데스크톱 애플리케이션을 만드는 방법에 대한 자세한 내용은 연습: 일반적인 Windows 데스크톱 애플리케이션 만들기(C++)를 확인하세요.

Learn to Program Windows라는 제목의 빈 창을 보여 주는 예제 프로그램의 스크린샷

프로그램의 전체 코드는 다음과 같습니다.

#ifndef UNICODE
#define UNICODE
#endif 

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    // Register the window class.
    const wchar_t CLASS_NAME[]  = L"Sample Window Class";
    
    WNDCLASS wc = { };

    wc.lpfnWndProc   = WindowProc;
    wc.hInstance     = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // Create the window.

    HWND hwnd = CreateWindowEx(
        0,                              // Optional window styles.
        CLASS_NAME,                     // Window class
        L"Learn to Program Windows",    // Window text
        WS_OVERLAPPEDWINDOW,            // Window style

        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

        NULL,       // Parent window    
        NULL,       // Menu
        hInstance,  // Instance handle
        NULL        // Additional application data
        );

    if (hwnd == NULL)
    {
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);

    // Run the message loop.

    MSG msg = { };
    while (GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);

            // All painting occurs here, between BeginPaint and EndPaint.

            FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

            EndPaint(hwnd, &ps);
        }
        return 0;

    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

Windows Hello World 샘플에서 전체 Visual Studio 프로젝트를 다운로드할 수 있습니다.

이 코드가 수행하는 작업을 간략하게 설명하는 것이 유용할 수 있습니다. 이후 항목에서 코드를 자세히 살펴봅니다.

  1. wWinMain은 프로그램 진입점입니다. 프로그램이 시작되면 애플리케이션 창의 동작에 대한 일부 정보를 등록합니다. 가장 중요한 항목 중 하나는 이 예제에서 이름이 WindowProc인 함수의 주소입니다. 이 함수는 창의 모양, 사용자와 상호 작용하는 방식 등 창의 동작을 정의합니다.
  2. 다음으로 프로그램은 창을 만들고 창을 고유하게 식별하는 핸들을 받습니다.
  3. 창이 성공적으로 만들어지면 프로그램은 while 루프를 입력합니다. 프로그램은 사용자가 창을 닫고 애플리케이션을 종료할 때까지 이 루프에 남아 있습니다.

대부분의 애플리케이션 논리가 정의되는 곳이라고 했음에도 불구하고 프로그램이 WindowProc 함수를 명시적으로 호출하지 않는다는 점에 유의하세요. Windows는 일련의 메시지를 전달하여 프로그램과 통신합니다. while 루프 내의 코드가 이 프로세스를 구동합니다. 프로그램이 DispatchMessage 함수를 호출할 때마다 간접적으로 Windows가 각 메시지에 대해 한 번씩 WindowProc 함수를 호출하도록 합니다.

섹션 내용

C++로 Windows용 프로그래밍 배우기

Windows Hello World 샘플