SDK5(note上)

以下代码实现菜单窗口和快捷键的ctrl+o打开的操作

#include <windows.h>
#include<tchar.h>
#include <stdio.h>
#include <strsafe.h>
#include <string>
#define IDM_OPEN 102
/*鼠标消息
* 键盘消息
* Onkeydown
* Onkeyup
* //键盘扫描码
* /lParam>>16&0ff
快捷键消息
命令消息WM_COMMAND
1.菜单消息
2.快捷键消息
3.控件消息 

自定义消息
窗口消息
客户区域的概念(Client Aera)
非客户区


*/ 
using namespace std;
string g_Text;
TEXTMETRIC g_tm;//字体信息
VOID showerrormassage()
{
	LPVOID lpMsgBuf;
	FormatMessage(
		FORMAT_MESSAGE_ALLOCATE_BUFFER |/*  分别为FORMAT_MESSAGE_ALLOCATE_BUFFER由函数分配输出缓冲区,
  FORMAT_MESSAGE_FROM_SYSTEM表示程序将会在系统消息表资源中搜索所需消息,FORMAT_MESSAGE_IGNORE_INSERTS程序将会忽略搜索到消息中的插入序列。  */
		FORMAT_MESSAGE_FROM_SYSTEM |
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL,
		GetLastError(),
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		(LPTSTR)&lpMsgBuf,
		0, NULL);
	MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK | MB_ICONINFORMATION);
	LocalFree(lpMsgBuf);
}



LRESULT OnCreate(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	OutputDebugString(_T("[11syy]WM_CREATE\n"));
	HDC hdc = GetDC(hwnd);
	SelectObject(hdc,
		GetStockObject(SYSTEM_FIXED_FONT));
	GetTextMetrics(hdc, &g_tm);
	ReleaseDC(hwnd, hdc);
	return TRUE;
}

LRESULT OnClese(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	OutputDebugString(_T("[11syy]WM_ClOSE\n"));
	DestroyWindow(hwnd);
	return TRUE;
}

LRESULT OnDestroy(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	  PostMessage(hwnd, WM_QUIT, 0, NULL);
	  OutputDebugString(_T("[11syy]WM_DESTROY\n"));
	  return TRUE;
}


LRESULT OnKeydown(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	  OutputDebugString(_T("[11syy]WM_KEYDOWN\n"));
	  return TRUE;
}

LRESULT OnKeyup(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	  OutputDebugString(_T("[11syy]WM_KEYUP\n"));
	  return TRUE;
}



LRESULT OnCommand(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	OutputDebugString(_T("[11syy]Oncommnd \n"));
	WORD WID = LOWORD(wParam);
	WORD wNotifyCode = HIWORD(wParam);
	switch (WID)
	{
	case 102://这里定义宏IDM_OPEN
		MessageBox(NULL, "打开", "asm", MB_OK);
		break;
	}

	//if (wNotifyCode == 1)//快捷键
	//{

	//}
	//else if (wNotifyCode == 0)//菜单
	//{
	//
	//}
	//else 
	if(lParam!=NULL) {//控件
	}

	return TRUE;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	LRESULT lResult = FALSE;
	switch (uMsg)
	{
	case WM_CREATE:
		lResult = OnCreate(hwnd, uMsg, wParam, lParam);
		break;
	case WM_CLOSE:
		lResult = OnClese(hwnd, uMsg, wParam, lParam);
		break;
	case WM_DESTROY:
		lResult = OnDestroy(hwnd, uMsg, wParam, lParam);
		break;
	case WM_KEYDOWN:
		lResult = OnKeydown(hwnd, uMsg, wParam, lParam);
		break;
	case WM_KEYUP:
		lResult = OnKeyup(hwnd, uMsg, wParam, lParam);
		break;
	case WM_COMMAND:
		lResult = OnCommand(hwnd, uMsg, wParam, lParam);
		break;
	}
	//无效区域

	if (!lResult) {
		return DefWindowProc(hwnd, uMsg, wParam, lParam);//默认窗口过程处理
	}
	return lResult;
}

//图形界面,窗口


int WINAPI _tWinMain(HINSTANCE hInstance,//应用程序示例句柄
	HINSTANCE hPrevInstance,//保留
	TCHAR* lpCmdline, //命令行参数,LPSTR可能会变成Unicode
	int nCmdShow) {
	//申请局部堆地址地址空间
	//HLOCAL hMem = LocalAlloc(LHND,100);//locallock localfree 系统会碎片整理
	//LPCVOID lpMemory = LocalLock(hMem);
	//LocalFree(hMem);
	//申请全局堆地址空间 历史遗留问题
	//GlobalAlloc();
	//申请堆地址空间
	ACCEL*aPFNs =(ACCEL*)HeapAlloc(GetProcessHeap(),0,sizeof(ACCEL)*2);//底层都是调用这个
	if (aPFNs == nullptr)
	{
		showerrormassage();
		return 0;
	}
	//申请堆空间,并且指定可读可写
	//VirtualAlloc();
	aPFNs[0].fVirt = FCONTROL | FVIRTKEY;
	aPFNs[0].key = 'O';
	aPFNs[0].cmd = IDM_OPEN;
	//创建快捷键表
	HACCEL hAccel =CreateAcceleratorTable(aPFNs,2);
	if (hAccel == NULL)
	{
		showerrormassage();
		return 0;
	}

	//1.注册窗口
	TCHAR  szWndclassName[] = { _T("chongmousyy") };

	WNDCLASSEX wc = { 0 };
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;//窗口类型
	wc.lpfnWndProc = WindowProc;
	wc.hInstance = hInstance;
	wc.hIcon = LoadIcon(NULL, IDC_HAND);//图标
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);//光标FDXX
	wc.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));//窗口背景颜色刷子
	wc.lpszClassName = szWndclassName;//窗口类名,窗口名字不可以为空
	wc.lpszMenuName = NULL;//窗口菜单
	if (RegisterClassEx(&wc) == 0)
	{
		showerrormassage();
		return 0;
	};
	//2.创建窗口
	TCHAR szWndName[] = { _T("翀某人") };
	HWND hwnd = CreateWindowEx(0,
		szWndclassName,
		szWndName,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL
	);
	if (hwnd == 0)
	{
		showerrormassage();
		return 0;
	}
	HMENU hMenu = CreateMenu();
	//弹出菜单
	AppendMenu(hMenu, MF_STRING|MF_POPUP,(UINT_PTR)hMenu,"文件(&f)");
	AppendMenu(hMenu, MF_STRING|MF_POPUP, (UINT_PTR)hMenu, "编辑(&E)");
	//添加子菜单
	HMENU hSubMenu = GetSubMenu(hMenu, 0);
	AppendMenu(hSubMenu, MF_STRING, IDM_OPEN, "打开(&O)");
	SetMenu(hwnd, hMenu);
	RECT rc;
	GetClientRect(hwnd, &rc);
	

	//3.显示跟新窗口
	ShowWindow(hwnd, SW_SHOWNORMAL);
	UpdateWindow(hwnd);
	//4.消息循环(消息队列)
	BOOL bRET;
	MSG msg;
	while ((bRET = GetMessage(&msg, NULL, 0, 0)) != 0) {
		if (bRET == -1) {
			break;
		}
		else
		{
			//转换快捷键消息
			if (!TranslateAccelerator(hwnd,hAccel,&msg))
				//转发消息
			{
				TranslateMessage(&msg);//转换键盘消息为字符消息
				DispatchMessage(&msg);
			}//派发消息
		}
	}
	//5.消息处理
	//删除快捷键表
	DestroyAcceleratorTable(hAccel);
	HeapFree(GetProcessHeap(),0,aPFNs);
	//资源
	return 0;
}



在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/893147.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣hot100--二叉树

目录 二叉树 1. 94. 二叉树的中序遍历 2. 98. 验证二叉搜索树 3. 101. 对称二叉树 4.102. 二叉树的层序遍历 5. 104. 二叉树的最大深度 6. 105. 从前序与中序遍历序列构造二叉树 7. 114. 二叉树展开为链表 8. 226. 翻转二叉树 9. 236. 二叉树的最近公共祖先 二叉树 …

操作符详解(C 语言)

目录 一、操作符的分类二、算数操作符1. 除法操作符2. 取余操作符 三、位移操作符1. 进制2. 原码、反码和补码3. 左移操作符&#xff08;<<&#xff09;和右移操作符&#xff08;>>&#xff09; 四、位操作符1. 按位与 &2. 按位或 |3. 按位异或 ^4. 按位取反 ~…

大衍数列——考研408考试科目之数据算法——未来之窗学习通

一、大衍数列 中国古代文献中&#xff0c;曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。 它的前几项是&#xff1a;0、2、4、8、12、18、24、32、40、50 … 其规律是&#xff1a;对偶数项&#xff0c;是序号平方再除2&#xff0c;奇数项&#xff0c;是…

有源滤波器(三)

这个连接方法很可以&#xff0c;正好解决了最近没有转接器的问题&#xff1a;

javaweb-xml映射文件编写sql语句

可以使用注解的方式&#xff0c;也可以使用xml映射的方式&#xff0c;一般简单sql语句使用注解&#xff0c;复杂的使用xml映射。

【PhpSpreadsheet】ThinkPHP5+PhpSpreadsheet实现批量导出数据

目录 前言 一、安装 二、API使用 三、完整实例 四、效果图 前言 为什么使用PhpSpreadsheet&#xff1f; 由于PHPExcel不再维护&#xff0c;所以建议使用PhpSpreadsheet来导出exlcel&#xff0c;但是PhpSpreadsheet由于是个新的类库&#xff0c;所以只支持PHP7.1及以上的版…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款购物类智能体的开发,来体验一下我的智能体『科技君Tom』

目录 1.1、智能体运行效果1.2、创作灵感来源智能体平台拥有个人化且人性化的大致框架&#xff0c;可以让小白也能搭建出一个智能体其次是拥有丰富的插件&#xff0c;可以更加快速的得到自己想要的效果~ 1.3、如何制作智能体常见问题与解决方案关于人设与回复逻辑插件使用模型的…

【黑马redis高级篇】持久化

//来源[01,05]分布式缓存 除了黑马&#xff0c;还参考了别的。 目录 1.单点redis问题及解决方案2.为什么需要持久化&#xff1f;3.Redis持久化有哪些方式呢&#xff1f;为什么我们需要重点学RDB和AOF&#xff1f;4.RDB4.1 定义4.2 触发方式4.2.1手动触发save4.2.2被动触发bgsa…

文件IO(Linux文件IO,目录操作函数)

前言 本文介绍Linux系统下自带的文件IO的函数。 Linux文件IO相关函数 open函数 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode)…

2024ideaUI切换和svn与git的切换

2024的UI实在很不舒服&#xff0c;隐藏了很多按键&#xff1b; 第一步&#xff1a; 视图 -》 外观 -》 工具栏选出来&#xff1b; 结果出来&#xff1a; 运行的按键和设置的按钮 第二步 点击设置的按钮&#xff0c;选择最后一个&#xff0c;重启就行 结果 舒服&#xff01; s…

双通道音频功率放大电路D2822M兼容TDA2822,全封装输出功率0.11W,用于音频产品

在某客户的便携式音频产品中&#xff0c;客户想在确保其产品的性能的前提下&#xff0c;为产品方案寻找一颗国产备份料。客户产品之前使用的是TDA2822&#xff0c;在了解客户的电路设计以及该产品的电气特性后&#xff0c;给客户寻找了一款可兼容相同电路设计使用的国产厂牌芯谷…

2010年国赛高教杯数学建模C题输油管的布置解题全过程文档及程序

2010年国赛高教杯数学建模 C题 输油管的布置 某油田计划在铁路线一侧建造两家炼油厂&#xff0c;同时在铁路线上增建一个车站&#xff0c;用来运送成品油。由于这种模式具有一定的普遍性&#xff0c;油田设计院希望建立管线建设费用最省的一般数学模型与方法。   1. 针对两炼…

Python零基础01——Python的由来,Python的特点、优缺点有哪些?

文章目录 Python的由来Python的特点Python的优缺点什么是编译器 Python的由来 1989年圣诞节期间&#xff0c;在阿姆斯特丹为打发圣诞节的无趣&#xff0c;决定开发一款新的脚本解释语言&#xff0c;作为ABC语言的一种继承&#xff0c;然后他就这么做了&#xff0c;并实现了&am…

Python中的help()函数:追踪错误并提供解决方案

引言 在Python编程中&#xff0c;help()函数是一个非常有用的内置工具&#xff0c;它能够提供关于模块、关键字、属性和方法等的详细信息。对于初学者来说&#xff0c;help()函数可以帮助他们理解代码的工作原理&#xff0c;快速查找文档&#xff0c;以及解决编程过程中遇到的…

<Linux> 线程安全

目录 文章目录 一、Linux线程互斥 1. 进程线程间的互斥相关背景概念 2. 互斥量mutex 3. 互斥量接口 初始化互斥量 动静态分配 销毁互斥量 互斥量加锁 互斥量解锁 4. 互斥量实现原理 5. 简单封装互斥量 二、可重入与线程安全 1. 概念 1.1 可重入 1.2 线程安全 2. 常见的线程不…

LLama 3.2 1B 和 3B:体型虽小,但威力强大!

MetaAI 刚刚推出了 Llama-3.2&#xff0c;这是一套新的模型&#xff0c;其中包括两个令人印象深刻的轻量级大型语言模型 (LLM)&#xff0c;分别具有 10 亿 (1B) 和 30 亿 (3B) 个参数&#xff0c;以及更大的视觉语言模型 (VLM)&#xff0c;分别具有 11B 和 90B 个参数。 取决于…

IT监控平台可视化:多维度展示助力运维效率提升

在信息化时代&#xff0c;IT设备的稳定性与业务的连续性紧密相连&#xff0c;任何细微的故障都可能给企业带来巨大的损失。因此&#xff0c;IT运维团队面临着前所未有的挑战&#xff0c;他们需要迅速、准确地识别和解决问题&#xff0c;以确保业务的平稳运行。而IT监控平台的可…

Django学习- ORM基础操作_创建数据

ORM操作&#xff1a; 管理器对象&#xff1a; 创建数据&#xff1a; Django shell 想要操作模型对象&#xff0c;首先我们需要把它引进Django shell中 >>> from bookstore.models import Book >>> b1 Book.objects.create(titleAI, pub清华大学出版社, pr…

Java | Leetcode Java题解之第478题在圆内随机生成点

题目&#xff1a; 题解&#xff1a; class Solution {Random random;double xc, yc, r;public Solution(double radius, double x_center, double y_center) {random new Random();xc x_center;yc y_center;r radius;}public double[] randPoint() {double u random.next…

基于机器学习与深度学习的贷款批准预测

1.项目背景 该数据集源自Kaggle的“Playground Series - Season 4, Episode 10”竞赛&#xff0c;是通过在贷款批准预测数据集上训练的深度学习模型生成的数据&#xff0c;旨在使用借款人信息预测贷款批准结果&#xff0c;它通过模拟真实贷款审批场景&#xff0c;帮助金融机构…