Win32API 입문 학습 기록 ~창 만들기~
15927 단어 VisualStudio2017Win32APIWindows초보자입문
환경
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에 손을 내려고 합니다만...)
Reference
이 문제에 관하여(Win32API 입문 학습 기록 ~창 만들기~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Baum-51/items/aa8ebc6a1a69166c2152
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
말이나 이해가 잘못되면 죄송합니다.
최소 프로그램
우선 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에 손을 내려고 합니다만...)
Reference
이 문제에 관하여(Win32API 입문 학습 기록 ~창 만들기~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Baum-51/items/aa8ebc6a1a69166c2152
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Win32API 입문 학습 기록 ~창 만들기~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Baum-51/items/aa8ebc6a1a69166c2152텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)