>  기사  >  운영 및 유지보수  >  Win32 SDK 기초 (5) 윈도우 클래스에 대한 간략한 소개

Win32 SDK 기초 (5) 윈도우 클래스에 대한 간략한 소개

黄舟
黄舟원래의
2017-06-06 09:42:552521검색

1. 소개

이전 글에서는 처음부터 창을 만들었습니다. 매우 중요한 단계 중 하나는 다음 코드에 표시된 대로 창 클래스를 등록하는 것입니다.

//注册窗口类
BOOL Register(LPSTR lpClassName, WNDPROC wndProc)
{
    WNDCLASSEX wce = { 0 };
    wce.cbSize = sizeof(wce);
    wce.cbClsExtra = 0;
    wce.cbWndExtra = 0;
    wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wce.hCursor = NULL;
    wce.hIcon = NULL;
    wce.hIconSm = NULL;
    wce.hInstance = g_hInstance;
    wce.lpfnWndProc = wndProc;
    wce.lpszClassName = lpClassName;
    wce.lpszMenuName = NULL;
    wce.style = CS_HREDRAW | CS_VREDRAW;
    ATOM nAtom = RegisterClassEx(&wce);
    if (nAtom == 0)
        return FALSE;
    return true;
}

Windows의 모든 창은 생성되기 전에 시스템에 명시적으로 등록되어야 합니다. CreateWindowEx를 사용하여 창을 만듭니다. 생성 시 두 번째 매개변수의 이름은 창 클래스 이름이며, 코드에 표시되는 범위 내에서 고유해야 합니다. 이 문서에서는 주로 Windows의 창 클래스 문제에 대해 설명합니다.

2. 창 분류

Windows에서 보이는 모든 요소는 기본적으로 원형, 사각형, 불규칙 등 모양에 관계없이 창에 속합니다. 이러한 창은 모두 특정 창 클래스에 속합니다. 일반적으로 Windows 창 클래스는 세 가지 유형으로 나뉩니다.
(1) 시스템 창 클래스
(2) 전역 창 클래스
(3) 로컬 창 클래스
아래에서는 분류를 하겠습니다. Windows의 창 클래스에 대해서는 별도로 설명합니다.

2.1 시스템 창 클래스

버튼 , 편집 상자, Windows 운영 체제에서 볼 수 있는 모든 컨트롤 은 실제로 창입니다. 운영 체제를 설치하면 Windows는 운영 체제 내에 수많은 시스템 수준 창 클래스를 등록합니다. 개발할 때 창 클래스 이름을 기반으로 이러한 창을 직접 만들 수 있습니다. 이 문제를 설명하기 위해 이전 기사의 코드 위에 다음 코드를 도입합니다.

HWND CreateMain(LPSTR lpClassName, LPSTR lpWndName)
{
	HWND hWnd = CreateWindowEx(0, lpClassName, lpWndName,
		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, g_hInstance, NULL);
	return hWnd;
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
	_In_opt_ HINSTANCE hPrevInstance,
	_In_ LPWSTR    lpCmdLine,
	_In_ int       nCmdShow)
{
	// TODO: Place code here.

	g_hInstance = hInstance;
	
	HWND hWnd = CreateMain("Button", "window");
	Display(hWnd);
	Message();
	return 0;
}

CreateMain은 창을 생성하기 위해 정의한 함수입니다. 두 개의 매개변수를 받습니다. 첫 번째는 등록된 창 클래스 이름이고 두 번째는 창 제목입니다. 이전 글의 코드와는 다르게 커스텀 윈도우를 등록하는 단계를 생략했습니다. 대신 WinMain 함수에서 CreateMain이 호출되어 창 클래스 이름이 "Button"인 창을 만듭니다. 우리가 무엇을 할지 이미 알고 계시겠죠? 예, Button 버튼을 생성하는 것입니다. 우리가 일반적으로 사용하는 모든 컨트롤은 운영 체제에 의해 시스템 창 클래스로 등록되어 있으며 직접 사용할 수 있습니다. 아래 프로그램 결과를 확인하세요.



편집 상자, 드롭다운 상자 등과 같은 다른 시스템 수준 창을 만들어 볼 수도 있습니다.

2.2 글로벌 윈도우 클래스

글로벌 윈도우 클래스란 등록 후 애플리케이션의 글로벌 범위에서 사용할 수 있는 윈도우 클래스를 말한다. 예를 들어, dll에 전역 창 클래스를 등록하면 dll을 도입하는 모든 프로그램이 이 클래스를 사용할 수 있습니다. 전역적으로 사용되는 윈도우 클래스를 등록할 때 wec의 structure 스타일 멤버에 CS_GLOBALCLASS속성만 추가하면 됩니다. 다음과 같이

	wce.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;

이 문제를 확인하기 위해, 우리는 새로운 dll 프로젝트를 추가하고 다음과 같이 창 등록 함수 RegisterWindow()를 정의합니다.

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_DESTROY:
		PostQuitMessage(0);//可以使GetMessage返回0
		break;
	default:
		break;
	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

 BOOL RegisterWindow()
{
	WNDCLASSEX wce = { 0 };
	wce.cbSize = sizeof(wce);
	wce.cbClsExtra = 0;
	wce.cbWndExtra = 0;
	wce.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wce.hCursor = NULL;
	wce.hIcon = NULL;
	wce.hIconSm = NULL;
	wce.hInstance = NULL;
	wce.lpfnWndProc = WndProc;
	wce.lpszClassName = "DllMain";
	wce.lpszMenuName = NULL;
	wce.style = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
	ATOM nAtom = RegisterClassEx(&wce);
	if (nAtom == 0)
		return FALSE;
	return true;
}

RegisterWindow()에 등록된 창 클래스의 이름은 "DllMain"이며, dll의 주요 기능 등록 기능은 등록을 완료합니다.

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	....
	RegisterWindow();
	return TRUE;
}
}

이 창 클래스를 사용하여 기본 프로그램에 창을 만듭니다.

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
	_In_opt_ HINSTANCE hPrevInstance,
	_In_ LPWSTR    lpCmdLine,
	_In_ int       nCmdShow)
{
	...
	HWND hWnd = CreateMain("DllMain", "我是一个Dll注册的窗口");
	Display(hWnd);
	Message();
	return 0;
}

프로그램을 실행하면 다음과 같은 결과가 나타납니다. 또한 이 창을 성공적으로 생성했습니다.


2.3 로컬 창 클래스

로컬 창 클래스는 정의 측면에서 정의되며 모든 cs_globalclass는 WCE 스타일에 추가되지 않으며 등록된 창 클래스는 로컬입니다. 창 수업.

wce.style = CS_HREDRAW | CS_VREDRAW;//未添加CS_GLOBALCLASS

       我们在上一文中注册的窗口就是一个局部的窗口类,它的特点就是只能在注册的作用域内使用,由于它和全局窗口类只在注册的style和作用域上有分别,这里就不再详述,如要了解,请参照上一文。

위 내용은 Win32 SDK 기초 (5) 윈도우 클래스에 대한 간략한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.