(Win32) make window

Posted by : at

Category : win32



우선 WinMain의 매개변수에 대해 분석해 보자

int CALLBACK WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow)
{
	while (true);

	return 0;
}
  • hInstance : 프로그램의 인스턴스 핸들(현 윈도우의 핸들이라 받아들이자)입니다.
  • hPrevInstance : 바로 앞에 실행된 현재 프로그램의 인스턴트 핸들입니다. 없을 경우 NULL이 되며 Win32에서는 항상 NULL 값을 가집니다. 현재는 사용이 안되지만 16비트와의 호환성을 위해 존재합니다.
  • lpCmdLine : 명령행으로 입력된 프로그램 인수입니다. 도스의 argv인수에 해당하며 보통 실행 직후에 파일 경로를 전달합니다.
  • nCmdShow :프로그램이 실행될 형태입니다. 최소화, 보통, 최대화 등을 전달합니다.

  • CALLBACK : 윈도우에 의해서 호출을 당함을 의미
    • __cdecl : 실행 파일 크기 크다 -> 호출자에 코드를 작성
    • __stdcall : 실행 파일 크기 작다 -> 피호출자에 코드를 작성


윈도우를 만들어보자

#include <Windows.h>

int CALLBACK WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpCmdLine,
	int nCmdShow)
{
	const auto pClassName = "hw3dbutts";
	// register window class
	// 자세한 설명은 검색 추천 ... 일단 받아들인다.
	WNDCLASSEX wc = {0};
	wc.cbSize = sizeof(wc);
	wc.style = CS_OWNDC;
	wc.lpfnWndProc = DefWindowProc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = hInstance;
	wc.hIcon = nullptr;
	wc.hCursor = nullptr;
	wc.hbrBackground = nullptr;
	wc.lpszMenuName = nullptr;
	wc.lpszClassName = pClassName;
	wc.hIconSm = nullptr;
	RegisterClassEx(&wc);

	// create window
	// 역시 자세한 설명은 검색 추천
	HWND hWnd = CreateWindowEx(
		0, pClassName,
		"Happy Hard Window",
		WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU,
		200, 200, 640, 480,
		nullptr, nullptr, hInstance, nullptr
		);

	ShowWindow(hWnd, SW_SHOW);
	
	while (true);

	return 0;
}

여기까지 실행하면 아래와 같이 실행된다.


참고 : 인스턴스 등

프로그램의 HANDLE을 의미한다. 사용자가 만드는 것이 아니라 프로그램 시작할 때 운영체제가 제공해준다.
윈도우 운영체제에서 실행되는 프로그램들을 구별하기 위한 ID값을 의미 한다.
window Handle 과 instance는 백업을 하고 사용한다.
HINSTANCE 핸들은 보통 실행되고 있는 Win32 프로그램이 메모리 상에 올라가 있는 시작 주소 값을 갖고 잇습니다.
wWinMain()에서 한 번 들어오는 값으로 값을 저장해서 사용합니다.

  • instance

객체 지향 프로그래밍(OOP)에서 인스턴스(instance)는 해당 클래스의 구조로 컴퓨터 저장공간에서 할당된 실체를 의미한다.
즉, 메모리에 올라가 있는 실체를 의미한다.
프로그램의 시작 주소값을 의미한다.


About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links