Win32API 입문 학습 기록 ~창 만들기~

Win32API의 윈도우에 대해 배운 것을 요약합니다.

환경



Windows10 Home ver1909
Visual Stadio 2017
VC++

참고 사이트



Win32 API 입문
h tp // 우우 s m. 사쿠라. 네. jp/sys m/우우나피/
표준 Windows API 70까지 학습 완료

학습 내용



말이나 이해가 잘못되면 죄송합니다.

최소 프로그램



우선 Windows API를 사용하는 최소 프로그램

Win32API1.cpp
#include <windows.h>

int WINAPI WinMain
(
    //引数
    HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow
)
{
    return 0;//windowを作るときはreturn 0だとバグる
} 

아마 이것이 가장 작은 프로그램
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
메인 함수에서이 함수에 작성된 프로그램이 실행됩니다.
return 0
현재의 내용은 이것뿐
실행 후 종료하기만 하면 됩니다.

창 만들기



windows이고 창을 만들 수 없다면
흥미롭지 않기 때문에

Win32API2.cpp

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    DefWindowProc(hwnd, msg, wp, lp);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hwnd;//ウィンドウハンドル
    MSG  msg;//メッセージ構造体
    WNDCLASS winc;

    winc.style = CS_HREDRAW | CS_VREDRAW;
    winc.lpfnWndProc = WndProc;
    winc.cbClsExtra = winc.cbWndExtra = 0;
    winc.hInstance = hInstance;
    winc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    winc.hCursor = LoadCursor(NULL, IDC_ARROW);
    winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    winc.lpszMenuName = NULL;
    winc.lpszClassName = TEXT("HOGE");

    if (!RegisterClass(&winc)) return -1;


    hwnd = CreateWindow
    (
        TEXT("HOGE"),                    //ウィンドウクラスの指定
        TEXT("TEST"),                      //ウィンドウの名前
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,  //ウィンドウのスタイル
        200, 200, 500, 500,                //ウィンドウの座標と大きさ
        NULL,                              //親ウィンドウならNULL
        NULL,                             //子ウィンドウがあればそのIDを指定
        hInstance,                        //インスタンスハンドル
        NULL                              //ウィンドウを作るときにOSに伝えることらしい
    );
    if (hwnd == NULL) { return -1; }

    while (GetMessage(&msg, NULL, 0, 0))//メッセージループ
    {
        DispatchMessage(&msg); //ウィンドウに命令を伝える
    }
    return msg.wParam;
}

이제 창이 만들어집니다.

실행 결과





이런 식으로 새하얀 창이 만들어진다.

해설(라고 할까 고찰)



창을 설정하는 것은

 WNDCLASS winc;

    winc.style = CS_HREDRAW | CS_VREDRAW;
    winc.lpfnWndProc = WndProc;
    winc.cbClsExtra = winc.cbWndExtra = 0;
    winc.hInstance = hInstance;
    winc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    winc.hCursor = LoadCursor(NULL, IDC_ARROW);
    winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    winc.lpszMenuName = NULL;
    winc.lpszClassName = TEXT("HOGE");

의 부분에서 `WNDCLASS 라는 구조체(※)에 각종 파라미터를 설정할 수 있다.
※구조체는 함수가 없는 클래스 같은 것(엄밀하게는 다른 것 같지만)

메인이 되는 윈도우를 만드는 부분은 이쪽

CreateWindow
    (
        TEXT("HOGE"),                    //ウィンドウクラスの指定
        TEXT("TEST"),                      //ウィンドウの名前
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,  //ウィンドウのスタイル
        200, 200, 500, 500,                //ウィンドウの座標と大きさ
        NULL,                              //親ウィンドウならNULL
        NULL,                             //子ウィンドウがあればそのIDを指定
        hInstance,                        //インスタンスハンドル
        NULL                              //ウィンドウを作るときにOSに伝えることらしい
    );

이것이 창을 만드는 함수.
지금은 확장 기능이 추가되었다. (그렇다고 해도 인수가 늘어날 정도의 차이이므로 어렵지 않을지도 ...)

상당히 귀찮은 수의 인수가 있지만 중요하다고 느낀 부분은CreateWindowEx첫 번째 인수와 세 번째 인수의 두
첫 번째 인수는 창의 편지지를 지정하는 인수입니다.
에서 CreateWindow 위에 있는 winc로 설정한 "HOGE"라는 창의 편지지형을 지정하고 있다.
세 번째 인수는 창 동작을 지정하는 인수입니다.

이 두 가지는 설정할 수있는 값이 많이 있으므로 잘 다루기 위해서는 무엇을 할 수 있는지 파악하는 것이 중요하다고 느낀다.

Windows라고 하는 OS는 윈도우와 OS, 윈도우와 윈도우의 사이에서 정보의 교환을 실시해 동작하는 것 같다.
그것을 실현하는 것이 윈도우 프로 시저라는 함수입니다.
아래의 프로그램은 윈도우가 삭제 된 경우의 처리를 기술한다.

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    DefWindowProc(hwnd, msg, wp, lp);
}

윈도우가 삭제되면 TEXT("HOGE")
WS_OVERLAPPEDWINDOW | WS_VISIBLE
라는 매크로에 설정되어 있는 수치가 msg 안에 인수로서 건네받는다.
PostQuitMessage(0)는 Windows에 대해서 어플리케이션이 종료했다고 전하는 역할을 가진다.

마지막 WM_DESTROY 는 창을 삭제하는 것을 제외하고는 기본 처리를 해야 한다는 메시지.

메시지는 윈도우에 대한 명령 or 윈도우로부터 Windows에 대한 상태 천이를 저장하고있는 것 같습니다.
메시지 루프에서 메시지를 처리하고 있습니다.

Win32API의 프로그램은 이 윈도우 프로시저를 설정하거나 새롭게 윈도우를 작성해 실시하는 것 같다.

while (GetMessage(&msg, NULL, 0, 0))//メッセージループ
    {
        DispatchMessage(&msg); //ウィンドウに命令を伝える
    }

이 부분이 메시지 루프의 부분에서 4행밖에 없지만, 이것이 없으면 윈도우를 유지할 수 없게 실행한 순간에 윈도우가 사라진다.

끝에



지금까지 내 인식을 정리했습니다.
실수하고 있는 부분이 있으면 가르쳐 주시면 다행입니다.

Win32API에서는 윈도우 프로시저라고 할까 메시지의 교환이가 가장 중요한 요소라고 생각되기 때문에, 향후는 그 근처를 의식해 학습을 진행시키려고 생각합니다.
(다음은 DirectX에 손을 내려고 합니다만...)

좋은 웹페이지 즐겨찾기