LoadMenu

원형

HMENU LoadMenu(HINSTANCE hInstance, LPCTSTR lpMenuName);

MFC 원형

BOOL CMenu::LoadMenu( LPCTSTR lpszResourceName );

인수

▶hInstance : 메뉴 리소스를 가진 모듈의 핸들.

▶lpMenuName : 메뉴 리소스의 이름을 지정하는 문자열. 메뉴 리소스를 정수로 정의했을 경우 상위 워드는 0이고 하위 워드에 메뉴 ID를 지정해 주면 된다. MAKEINTRESOURCE 매크로 함수를 사용하면 정수 ID를 가지는 메뉴 리소스를 읽어올 수 있다. 비주얼 C++의 메뉴 편집기는 정수 ID로 메뉴 리소스를 작성해 주므로 통상 MAKEINTRESOURCE 매크로 함수를 사용해야 한다.

리턴

성공하면 읽어온 메뉴의 핸들을 리턴하며 실패시 NULL을 리턴한다.

설명

메뉴 리소스를 읽어온다. 메뉴는 통상 리소스로 작성되며 링크시 실행 파일에 합쳐진다. 윈도우에 메뉴를 붙이는 방법은 여러 가지가 있는데 가장 흔하게 사용되는 방법은 윈도우 클래스의 lpszMenuName 멤버에 사용할 메뉴 리소스를 지정해 주는 것이다.

WndClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);

lpszMenuName 멤버에 메뉴 리소스를 대입해 주면 이후부터 이 윈도우 클래스로부터 생성되는 모든 윈도우는 이 메뉴 리소스를 사용한다. 두번째 방법은 CreateWindow의 hMenu 멤버에 사용할 메뉴 핸들을 대입해 주는 것이다. 만약 윈도우 클래스에도 메뉴가 지정되어 있고 CreateWindow에도 메뉴 핸들이 지정되어 있으면 CreateWindow의 메뉴 지정이 우선이므로 윈도우 클래스에 있는 메뉴 대신 다른 메뉴를 사용하려면 CreateWindow에 메뉴 핸들을 지정하면 된다. 하지만 통상적으로 한 윈도우 클래스로부터 하나의 메인 윈도우를 만드므로 첫번째 방법이 훨씬 더 많이 사용된다.

메뉴를 사용하는 세번째 방법은 실행중에 메뉴를 읽어와 윈도우에 붙이는 것이며 이때 LoadMenu 함수가 사용된다. LoadMenu로 읽어온 메뉴 핸들을 SetMenu 함수로 윈도우에 붙여주면 된다. 단, 이때 LoadMenu로 읽은 메뉴 핸들은 반드시 DestroyMenu 함수로 해제해 주어야 한다.

예제 1

다음 예제는 실행중에 메뉴 리소스를 읽어와 메뉴를 윈도우에 붙인다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	static HMENU hMain;
	char Mes[]="메뉴 예제입니다";

	switch(iMessage) {
	case WM_CREATE:
		hMain=LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_MENU1));
		SetMenu(hWnd,hMain);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		DestroyMenu(hMain);
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

WM_CREATE에서 IDR_MENU1으로 정의된 메뉴 리소스를 읽어와 SetMenu 함수로 메인 윈도우에 메뉴를 설정하였다. 이 두 함수를 사용하면 메뉴 리소스 여러 벌을 읽어놓고 실행중에 메뉴를 바꿔 가며 사용할 수도 있다.

참고함수

SetMenu

플랫폼

95이상

참조

 


written by http://www.winapi.co.kr