首页 > 编程语言 >Win32编程之资源文件(三)

Win32编程之资源文件(三)

时间:2023-09-10 23:22:32浏览次数:48  
标签:hIns 文件 菜单 wc hWnd 编程 Win32 break NULL

一、菜单资源的使用

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);
}

  

     

标签:hIns,文件,菜单,wc,hWnd,编程,Win32,break,NULL
From: https://www.cnblogs.com/TechNomad/p/17692270.html

相关文章

  • Linux:文件压缩解压gz、tar.gz、tar.xz、tar.bz2、tgz、zip
    (目录)tar#.tartar-xvfarchive.tartar.gz、tgz1、压缩tar-zcvf压缩文件名.tar.gz被压缩文件名#不保留文件路径tar-zcvf压缩文件名.tar.gz-C压缩前切换目录被压缩文件名参考如何在不保留目录结构的情况下tar目录?2、解压tar-zxvf压缩文件名.tar.gz#......
  • cnpm : 无法加载文件 C:\Program Files\nodejs\node_global\cnpm.ps1
    在win10上运行cnpm命令时出现:cnpm:无法加载文件C:\ProgramFiles\nodejs\node_global\cnpm.ps1,因为在此系统上禁止运行脚本。解决办法记录如下: 在powershell中执行Start-Processpowershell-VerbrunAs会提示授权,并以管理员身份运行powershell 继续重新执行set-Ex......
  • unix/linux系统编程第一、二章知识归纳
    1.引言1.1Unix&Linux简介及历史版本Unix和Linux是一系列强大的操作系统,具有丰富的历史和版本。Unix的初始版本由肯·汤普森(KenThompson)和丹尼斯·里奇(DennisRitchie)于20世纪70年代早期开发。它是一种通用操作系统,经典书目包括1988年的《TheCProgrammingLang......
  • Java是一种面向对象的编程语言
    Java是一种面向对象的编程语言,泰兰德幻化广泛应用于各种平台上。它的特点是可移植性强,安全性高,且具有很强的扩展性。Java语言采用了“一次编写,到处运行”的原则,这意味着可以在不同的操作系统和设备上运行相同的Java程序,无需对代码进行修改。Java语言有着丰富的类库和API,可以满足......
  • Golang(又称Go语言)是一种开源的静态强类型编程语
    Golang(又称Go语言)是一种开源的静态强类型编程语言,巧瞒七星解磐键由Google在2007年开始开发,并于2009年发布。它的设计目标是提供一种简洁、高效的语言,同时具备高并发、高性能的特性。Golang的语法风格简洁明了,易于上手,适用于各种规模的项目。下面将介绍Golang在实际应用中的具体案......
  • PHP是一种广泛应用于Web开发的编程语言
    PHP是一种广泛应用于Web开发的编程语言,它具有众多强大的特性和灵活的语法。在本文中,我们将深入探讨PHP的一些具体案例和例子,以帮助您更好地理解并应用它在实际项目中的强大功能。首先,让我们来看一个简单的实例,介绍PHP的核心概念之一:变量。在思密达梦三国PHP中,您可以使用$符号来......
  • Linux删除文件夹命令
    Linux删除文件夹命令在Linux系统中,要删除文件夹,可以使用以下命令:1.rm命令rm命令用于删除文件和目录。要删除一个空文件夹,可以使用以下命令:rm-rfolder_name其中,-r选项表示递归删除,即删除文件夹及其内部的所有文件和子文件夹。如果要删除非空文件夹,可以使用以下命令:rm-rffolder_......
  • 纯前端也可以访问文件系统!
    前言周末逛github的时候,发现我们只需要在github域名上加上1s他就能够打开一个vscode窗口来阅读代码,比起在github仓库中查看更加方便然后我就想网页端vscode能不能打开我本地的项目呢,带着这个疑惑我打开了网页版vscode,它居然真的可以打开我本地的项目代码!难道又出了新的API让......
  • SpringBoot 如何实现文件上传和下载
    当今Web应用程序通常需要支持文件上传和下载功能,SpringBoot提供了简单且易于使用的方式来实现这些功能。在本篇文章中,我们将介绍SpringBoot如何实现文件上传和下载,同时提供相应的代码示例。 文件上传SpringBoot提供了Multipart文件上传的支持。Multipart是HTTP协议中的一种......
  • mybatisplus中按照条件查询的三种方式,常用的是lambda查询,当进行测试查询的时候,可以将
    2023-09-10目录结构 logback.xml<?xmlversion="1.0"encoding="UTF-8"?><configuration></configuration>application.ymlspring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://loca......