교재 소개

다음과 같은 자료들이 있다. 무료 교재 소개 https://open.umn.edu/opentextbooks/ http://bigbook.or.kr/ Green Tea Press – Free books by Allen B. Downey Gilbert Strang, Calculus  https://ocw.mit.edu/courses/res-18-001-calculus-fall-2023/pages/textbook/ Open Logic Project https://builds.openlogicproject.org/ Open Logic Text Complete Version (2024-12-01) 이상구, 선형대수 https://ibook.skku.edu/Viewer/LA-Texbook http://matrix.skku.ac.kr/LA/ David Cherney, Tom Denton, Rohit Thomas and Andrew Waldron, Linear Algebra https://www.math.ucdavis.edu/~linear/

WinAPI - 윈도 프로시저 콜백

https://learn.microsoft.com/ko-kr/windows/win32/learnwin32/your-first-windows-program

https://learn.microsoft.com/ko-kr/windows/win32/learnwin32/writing-the-window-procedure

WinAPI의 가장 기본적인 단위 중 하나는 윈도우입니다. 다음 예제는 윈도우를 생성하고 처리하는 방법을 보여줍니다.


#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);
}


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

다음과 같은 네 개의 매개 변수가 있습니다.
hwnd는 창에 대한 핸들입니다. uMsg는 메시지 코드입니다. 예를 들어 WM_SIZE 메시지는 창의 크기가 조정되었음을 나타냅니다. wParam 및 lParam에는 메시지와 관련된 추가 데이터가 포함되어 있습니다. 정확한 의미는 메시지 코드에 따라 달라집니다.


LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_SIZE:
        {
            int width = LOWORD(lParam);  // Macro to get the low-order word.
            int height = HIWORD(lParam); // Macro to get the high-order word.

            // Respond to the message:
            OnSize(hwnd, (UINT)wParam, width, height);
        }
        break;
    }
}

void OnSize(HWND hwnd, UINT flag, int width, int height)
{
    // Handle resizing
}

LOWORD 및 HIWORD 매크로는 lParam에서 16비트 너비 및 높이 값을 가져옵니다. 창 프로시저는 너비와 높이를 추출한 다음 이러한 값을 함수에 OnSize 전달합니다.


창 프로시저가 실행되는 동안 동일한 스레드에서 만든 창에 대한 다른 모든 메시지를 차단합니다. 따라서 창 프로시저 내에서는 긴 처리를 피합니다. 예를 들어 프로그램이 TCP 연결을 열고 서버가 응답할 때까지 무기한 대기한다고 가정합니다. 창 프로시저 내에서 이 작업을 수행하면 요청이 완료될 때까지 UI가 응답하지 않습니다. 이 시간 동안 창은 마우스 또는 키보드 입력을 처리하거나, 자체적으로 다시 그리거나, 닫을 수 없습니다.


대신 Windows에 기본 제공되는 멀티태스킹 기능 중 하나를 사용하여 작업을 다른 스레드로 이동해야 합니다.


새 스레드를 만듭니다.

스레드 풀을 사용합니다.

비동기 I/O 호출을 사용합니다.

비동기 프로시저 호출을 사용합니다.

댓글

이 블로그의 인기 게시물

WinAPI 0002 - 윈도우 클래스의 등록

목차 (글 목록)

LaTeX - 시작하기