Win32编程之资源文件(三)

发布时间 2023-09-10 23:21:35作者: TechNomad

一、菜单资源的使用

1.菜单的分类

  • 窗口的顶层菜单
  • 弹出式菜单
  • 系统菜单

HMENU类型表示菜单,ID表示菜单项

2、菜单资源的使用

 (1).注册窗口类时设置菜单

 (2).创建窗口传参设置菜单

 (3).在主窗口WM_CREATE消息中利用SetMenu函数设置菜单

 加载菜单资源 

HMENU LoadMenu(
	  HINSTANCE hInstance,
	  LPCTSTR lpMenuName
);

示例代码:

#include <Windows.h>
#include <stdio.h>
#include "resource.h"

HINSTANCE g_hIns = NULL;

//窗口处理函数(自定义,处理消息)
LRESULT CALLBACK WindProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam) {
	switch (msgID) {
	case WM_CREATE: {
		HMENU hMenu = LoadMenu(g_hIns, (LPCWSTR)IDR_MENU1);
		SetMenu(hWnd, hMenu);
		break;
	}
	default:
		break;
	}

	return DefWindowProc(hWnd, msgID, wParam, lParam);
}

//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow) {
	g_hIns = hIns;
	
	//设计窗口类
	WNDCLASS wc = { 0 };
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wc.hCursor = NULL;
	wc.hIcon = NULL;
	wc.hInstance = hIns;
	wc.lpfnWndProc = WindProc;
	wc.lpszClassName = TEXT("Main");
	//1.注册窗口类时设置菜单
	//wc.lpszMenuName = (LPCWSTR)IDR_MENU1;
	wc.lpszMenuName = NULL;
	wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;

	//2.创建窗口传参设置菜单
	//HMENU hMenu = LoadMenu(hIns, (LPCWSTR)IDR_MENU1);
	
	//注册窗口类
	RegisterClass(&wc);//将以上所有赋值全部写入操作系统

	//在内存中创建窗口
	//HWND hWnd = CreateWindowEx(0, wc.lpszClassName, TEXT("Window"), WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, hMenu, hIns, NULL);
	HWND hWnd = CreateWindowEx(0, wc.lpszClassName, TEXT("Window"), WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);

	//显示窗口
	ShowWindow(hWnd, SW_SHOW);
	UpdateWindow(hWnd);

	//消息循环
	MSG nMsg = { 0 };
	while (true) {
		if ((PeekMessage(&nMsg, NULL, 0, 0, PM_NOREMOVE))) {
			//有消息
			if (GetMessage(&nMsg, NULL, 0, 0)) {
				TranslateMessage(&nMsg);
				DispatchMessage(&nMsg);
			}
			else {
				break;
			}
		}
	}

	return 0;
}

3、菜单命令消息处理

菜单消息:WM_COMMAND

附带参数信息:

  wPARAM:HIWORD:对于菜单为0,LOWORD:菜单项的ID

  lPARAM:对于菜单为0

示例代码:

void onCommand(HWND hWnd, WPARAM wParam) {
	switch (LOWORD(wParam)) {
	case ID_NEW:
		MessageBox(hWnd, TEXT("新建被点击"), TEXT("提示"), MB_OK);
		break;
	case ID_EXIT:
		MessageBox(hWnd, TEXT("退出被点击"), TEXT("提示"), MB_OK);
		break;
	case ID_ABOUT:
		MessageBox(hWnd, TEXT("关于被点击"), TEXT("提示"), MB_OK);
		break;
	default:
		break;
	}
}

//窗口处理函数(自定义,处理消息)
LRESULT CALLBACK WindProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam) {
	switch (msgID) {
	case WM_CREATE: {
		HMENU hMenu = LoadMenu(g_hIns, (LPCWSTR)IDR_MENU1);
		SetMenu(hWnd, hMenu);
		break;
	}
	case WM_COMMAND: {
		onCommand(hWnd, wParam);
		break;
	}
	default:
		break;
	}

	return DefWindowProc(hWnd, msgID, wParam, lParam);
}