SDK4(note下)

news2024/11/18 10:22:58

以下代码涉及到了很多消息的处理,有些部分注释掉了,主要看代码

#include <windows.h>
#include<tchar.h>
#include <stdio.h>
#include <strsafe.h>
#include <string>
#define IDM_OPEN 102
/*鼠标消息
* 键盘消息
* Onkeydown
* Onkeyup
* //键盘扫描码
* /lParam>>16&0ff
快捷键消息
菜单消息
控件消息
自定义消息
窗口消息
客户区域的概念(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);
}

//热键消息
//热键消息需要注册
//RegisterHotKey()
//软件卸载的时候还要卸载这个注册
//所以ip号就是这么回事
//
//UnregisterHotKey注销的函数

//LRESULT OnHotkey(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
//	return TRUE;
//}

LRESULT Onchar(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	TCHAR szBuf[MAXBYTE];
	if ((char)wParam == '\r')
	{
		g_Text += (char)wParam;
		g_Text += '\n';
	}
	else if ((char)wParam == '\b')
	{
		if (!g_Text.empty()) {
			g_Text.pop_back();
		}
	}
	else
	{
		g_Text += (char)wParam;
	}
	wsprintf(szBuf, _T("Onchar %s\n"), g_Text.data());
	OutputDebugString(szBuf);
	//获取窗口HDC,非客户区GetWindowDC
	/*HDC hdc = GetDC(hwnd);*/
	/*TextOut(hdc, 0, 0, g_Text.data(), g_Text.length());*///这个API不支持回车
	//释放DC
	//RECT rc;
	//GetClientRect(hwnd, &rc);

	创建白色的刷子
	//HGDIOBJ hBrushOld;
	//HBRUSH hBrush= CreateSolidBrush(RGB(255,255,255));

	选择刷子
	//hBrushOld= SelectObject(hdc, hBrush);
	绘制背景
	//FillRect(hdc, &rc, hBrush);
	绘制文本
	//DrawText(hdc, g_Text.data(), g_Text.length(), &rc, DT_LEFT);
	还原默认刷子
	//SelectObject(hdc, hBrushOld);
	释放刷子
	//DeleteObject(hBrush);
	释放DC
	//ReleaseDC(hwnd, hdc);
	//ShowCaret(hwnd);
	//SetCaretPos(g_tm.tmAveCharWidth * g_Text.length(), 0);
	RECT rc;
	GetClientRect(hwnd, &rc);
	InvalidateRect(hwnd, NULL, TRUE);//产生WM_PAINT 
	return TRUE;
}
LRESULT OnCreate(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	//初始化
   /* MessageBox(NULL,_T("onCrate"), _T("asm"), MB_OK);*/
	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) {
	/*MessageBox(NULL, _T("onClose"), _T("asm"), MB_OK);*/
	OutputDebugString(_T("[11syy]WM_ClOSE\n"));
	DestroyWindow(hwnd);
	return TRUE;
}
//LRESULT OnKeydown(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//{
//	//获取键盘状态
//	BYTE KeyState[256];
//	if (!GetKeyboardState(KeyState))
//	{
//		return TRUE;
//	}
//
//	//键盘扫描码
//	BYTE SanCode = (UINT)lParam >> 16 & 0xff;
//	WORD ch;
//	ToAscii(wParam, SanCode, KeyState, &ch, 0);
//	TCHAR szBuf[MAXBYTE];
//	wsprintf(szBuf, _T("[asm] OnKeydown) % c\n"), ch);
//	OutputDebugString(szBuf);
//	return TRUE;
//}


//消息处理

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

LRESULT OnSetFocus(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	  OutputDebugString(_T("[11syy]WM_SETFOCUS\n"));

	  //创建插入符
	  CreateCaret(hwnd, (HBITMAP)NULL,1,g_tm.tmHeight);
	  SetCaretPos(0, 0);
	  ShowCaret(hwnd);


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

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

LRESULT OnPaint(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	OutputDebugString(_T("[11syy]OnPaint \n"));
	//HDC hdc=GetDC(hwnd);不受无效区域的影响
	PAINTSTRUCT ps;
	HDC hdc = BeginPaint(hwnd, &ps);
	RECT rc;
	GetClientRect(hwnd, &rc);
	DrawText(hdc, g_Text.data(), g_Text.length(), &rc, DT_LEFT);
	/*ReleaseDC(hwnd, hdc);*/

	//wpaint消息一直会来,因为操作系统会一直认为他是无效区域
	//所以你得告诉操作系统,我们画过的地方应该为有效区域
	//ValidateRect(hwnd,&rc);
	EndPaint(hwnd, &ps);//自动将无效区域设置为有效区域
	return TRUE;
}
LRESULT OnCommand(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	OutputDebugString(_T("[11syy]Oncommnd \n"));
	WORD WID = LOWORD(wParam);
	switch (WID)
	{
	case 102://这里定义宏IDM_OPEN
		MessageBox(NULL, "打开", "asm", MB_OK);
		break;
	}
	return TRUE;
}

//LRESULT OnMove(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//{
//	TCHAR szBuf[MAXBYTE];
//	int xpos = (int)(short)LOWORD(lParam);
//	int ypos = (int)(short)HIWORD(lParam);
//	wsprintf(szBuf, _T("[11syy]xpos:%d ypos:%d"), xpos, ypos);
//	PostMessage(hwnd, WM_QUIT, 0, NULL);
//	return TRUE;
//}
//LRESULT OnLButtonnDown(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//{
//	int xpos = LOWORD(lParam);
//	int ypos = HIWORD(lParam);
//	TCHAR szBuf[MAXBYTE];
//	wsprintf(szBuf, _T("[11syy]xpos:%d ypos:%d\n"), xpos, ypos);
//	OutputDebugString(szBuf);
//	/*MessageBox(NULL, szBuf, _T("asm"), MB_OK);*/
//	return FALSE;
//}
//LRESULT OnLButtonnup(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//{
//	int xpos = LOWORD(lParam);
//	int ypos = HIWORD(lParam);
//	TCHAR szBuf[MAXBYTE];
//	wsprintf(szBuf, _T("[11syy]xpos:%d ypos:%d\n"), xpos, ypos);
//	OutputDebugString(szBuf);
//	//MessageBox(NULL, szBuf, _T("asm"), MB_OK);
//	return FALSE;
//}

//LRESULT onMouse(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
//{
//	LRESULT lResult = FALSE;
//	switch (uMsg)
//	{
//	case WM_LBUTTONDOWN:
//	 lResult= OnLButtonnDown(hwnd, uMsg, wParam, lParam);
//		break;
//	}
//	return FALSE;
//}
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_CHAR:
		lResult= Onchar(hwnd, uMsg, wParam, lParam);
		break;
	case WM_SETFOCUS:
		lResult = OnSetFocus(hwnd, uMsg, wParam, lParam);
		break;
	case WM_KILLFOCUS:
		lResult = OnKillFocus(hwnd, uMsg, wParam, lParam);
		break;
	case WM_ERASEBKGND://刷背景
		lResult = OnEraseBackgroud(hwnd, uMsg, wParam, lParam);
		break;
	case WM_PAINT://绘制消息
	   lResult = OnPaint(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) {
	//发送消息
	//SendMessage();//直接调用窗口过程函数同步
	//PostMessage();//投递消息到消息队列去
	//HWND hNotepad = FindWindow("Notepad", NULL);
	//if (hNotepad == NULL)
	//{
	//	return FALSE;
	//}
	//HWND hEdit = GetWindow(hNotepad, GW_CHILD);
	//HWND hEditchild = GetWindow(hEdit, GW_CHILD);
	//PostMessage(hEditchild, WM_KEYDOWN, 'A', 0);
	//HDC hdc = GetDC(hEditchild);
	//while (true)
	//{
	//	TextOut(hdc, 0, 0, "SB", 2);
	//}
	//ReleaseDC(hEdit, hdc);
	//
	
	
	
	
	//窗口显示方式
	//比如我们启动这个窗口,最大化,最小化
	/*MessageBoxA(NULL, "hell word ", "asm", MB_YESNO);*/\
		//int res = MessageBoxW(NULL, L"hell unicode", L"asm", MB_YESNO);
		//
		//if (res == 0) {
		///*	MessageBoxW(NULL, L"错误", L"asm", MB_OK);*/
		//	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);
	//空键 按钮
	//HWND hEdit = CreateWindowEx(0,
	//	"EDIT",
	//	NULL,
	//	WS_CHILD | WS_VISIBLE|WS_VSCROLL|ES_MULTILINE,
	//	0,
	//	0,
	//	rc.right - rc.left,
	//	rc.bottom - rc.top,
	//	hwnd,
	//	NULL,
	//	hInstance,
	//	NULL
	//);

	//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
		{
			//转发消息
			TranslateMessage(&msg);//转换键盘消息为字符消息
			DispatchMessage(&msg);//派发消息
		}
	}
	//5.消息处理



	//资源
	return 0;
}



在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

76.【C语言】perror函数介绍

1.cplusplus的官网介绍 cplusplus的介绍 点我跳转 2.翻译 函数 perror void perror ( const char * str ); 打印错误信息 将errno(最后一个错误数字)的值解释为错误信息,之后把它打印到stderr中(标准错误输出流,通常是控制台)(备注有关"流"的概念在75.【C语言】文件…

k8s-pod的管理及优化设置

Pod是Kubernetes&#xff08;k8s&#xff09;中最小的资源管理组件&#xff0c;也是最小化运行容器化应用的资源对象。以下是对Pod的详细介绍&#xff1a; 一、Pod的基本概念 定义&#xff1a;Pod是Kubernetes中可以创建和管理的最小单元&#xff0c;是资源对象模型中由用户创…

网站排名,让网站快速有排名的几个方法

要让网站快速获得并提升排名&#xff0c;需要综合运用一系列专业策略和技术&#xff0c;这些策略涵盖了内容优化、技术调整、外链建设、用户体验提升等多个方面。以下是让网站快速有排名的几个方法&#xff1a; 1.内容为王&#xff1a;创造高质量、有价值的内容 -深入…

geolocator插件的用法

文章目录 1. 概念介绍2. 使用方法3. 示例代码4 体验分享我们在上一章回中介绍了如何实现滑动菜单相关的内容,本章回中将介绍如何获取位置信息.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的获取位置信息本质上是获取当前手机所在位置的gps坐标,就是我们…

【Chrome浏览器插件--资源嗅探猫抓】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、资源嗅探插件---猫抓二、使用步骤总结 一、资源嗅探插件—猫抓 猫抓是一个浏览器插件&#xff0c;可以检测当前网页中的一些资源文件&#xff0c;可设置嗅探的…

NVIDIA机密计算文档

NVIDIA 可信计算解决方案 文章目录 前言一、指南1. Intel TDX - 机密计算部署指南2. AMD SNP - 机密计算部署指南3. NVIDIA Hopper 机密计算证明文档4. nvtrust GitHub二、发行说明1. 550TRD3 - NVIDIA 可信计算解决方案发行说明2. 550TRD1 - NVIDIA 可信计算解决方案发行说明三…

The Android SDK location cannot be at the filesystem root

win11&#xff0c; 安装启动完Android Studio后&#xff0c;一直显示 The Android SDK location cannot be at the filesystem root因此需要下载SDK包&#xff0c;必须开启代理。 开启代理后&#xff0c;在System下开启自动检测代理&#xff0c;如图 重启Android Studio&a…

任务【浦语提示词工程实践】

0.1 环境配置 首先点击左上角图标&#xff0c;打开Terminal&#xff0c;运行如下脚本创建虚拟环境&#xff1a; # 创建虚拟环境 conda create -n langgpt python3.10 -y 运行下面的命令&#xff0c;激活虚拟环境&#xff1a; conda activate langgpt 之后的操作都要在这个环境…

基于LORA的一主多从监测系统_0.96OLED

关联&#xff1a;0.96OLED hal硬件I2C LORA 在本项目中每个节点都使用oled来显示采集到的数据以及节点状态&#xff0c;OLED使用I2C接口与STM32连接&#xff0c;这个屏幕内部驱动IC为SSD1306&#xff0c;SSD1306作为从机地址为0x78 发送数据&#xff1a;起始…

Windows环境安装CentOS7

【注意】安装CentOS需要先安装Vmware虚拟机 【下载前准备】 一、下载CentOS 7镜像文件阿里云镜像开源&#xff0c;点击跳转 二、安装VMware&#xff08;17&#xff09;&#xff1a; a. 官网&#xff0c;点击跳转 b. 许可证&#xff1a;JU090-6039P-08409-8J0QH-2YR7F 安装V…

Aegisub字幕自动化及函数篇(图文教程附有gif动图展示)(二)

目录 template行 template pre-line template line template syl template syl noblank template char template notext template pre-line notext template syl noblank notext template keeptags ​编辑 template loop number 内联变量 ​编辑 remeber函数 re…

提示工程、微调和 RAG

自众多大型语言模型&#xff08;LLM&#xff09;和高级对话模型发布以来&#xff0c;人们已经运用了各种技术来从这些 AI 系统中提取所需的输出。其中一些方法会改变模型的行为来更好地贴近我们的期望&#xff0c;而另一些方法则侧重于增强我们查询 LLM 的方式&#xff0c;以提…

【华为OD机试真题】95、最少面试官数

package mainimport ("fmt""sort" )type s struct {start intend intworkCount int }type duration struct {start intend int }// 查询时间段内是否有可用的面试官 func getFreeS(sList []*s, d *duration, workCountLimit int) (sIndex int)…

CanOpen转Profinet网关与钢成型机等机械集成时发挥的作用

在现代工业自动化领域&#xff0c;不同设备和系统之间的通信至关重要。CanOpen和Profinet是两种广泛应用于工业控制系统的通讯协议。CanOpen通常用于设备级别的通信&#xff0c;而Profinet则更常见于工业以太网&#xff0c;适用于更大范围的系统级控制。当型钢成型机等复杂机械…

@Service代替@Controller注解来标注到控制层的场景?

在SpringBoot开发中&#xff0c;Controller和Service基本上是日常开发中使用的最频繁的两个注解。但你有没考虑过Service代替Controller注解来标注到控制层的场景&#xff1f;换言之&#xff0c;经过Service标注的控制层能否实现将用户请求分发到服务层的功能&#xff1f; 前言…

视频智能分析/AI智能分析网关V4客流统计算法介绍及其在多领域多场景中的应用

随着人工智能技术的快速发展&#xff0c;AI智能分析网关V4作为一种集高性能、低功耗于一体的软硬一体AI边缘计算硬件设备&#xff0c;在工地、工厂、园区、消防、社区、校园等领域展现出强大的应用潜力。本文将详细介绍AI智能分析网关V4的客流统计算法原理及其在多个场景中的应…

[Python] 函数入参中的 *args和**kwargs 是什么意思

Python函数中*args和**kwargs的用法&#xff0c;它们允许接收任意数量的位置参数和关键字参数。*args用于非关键字的可变参数&#xff0c;而**kwargs则用于接受键值对的可变参数。在调用函数时&#xff0c;字典参数需置于单实例参数之后。示例代码展示了如何定义和使用这些可变…

上海马拉松2024年:城市律动,跑者狂欢

随着2024年的脚步日益临近&#xff0c;上海这座国际化大都市即将迎来一场体育盛事——上海马拉松。作为城市律动与跑者狂欢的完美结合&#xff0c;上海马拉松不仅吸引了来自世界各地的跑者&#xff0c;更成为了展现上海城市魅力和体育精神的重要窗口。 本次上海马拉松将于2024年…

每日OJ题_牛客_AB13【模板】拓扑排序_C++_Java

目录 牛客_AB13【模板】拓扑排序 题目解析 C代码 Java代码 牛客_AB13【模板】拓扑排序 【模板】拓扑排序_牛客题霸_牛客网 (nowcoder.com) 描述&#xff1a; 给定一个包含nn个点mm条边的有向无环图&#xff0c;求出该图的拓扑序。若图的拓扑序不唯一&#xff0c;输出任意合法…

The Sandbox 全新游戏赛季 Alpha 第 4 季完整攻略

欢迎来到 Alpha 第 4 季攻略&#xff01; 准备好投入 The Sandbox 有史以来最令人兴奋的游戏赛季吧&#xff01;我们诚邀你于 10 月 9 日晚上 10 点&#xff08;北京时间&#xff09;&#xff0c;加入我们为期 10 周的精彩平台活动&#xff0c;其中包含超过 100 个独特游戏体验…