MFC开发第二天 Windows计算器的开发,常用消息解析与处理

news2024/11/14 21:57:08

文章目录

  • 相关概念陈述
  • 一、初始API汇总
    • 消息汇总
  • 二、Windows计算器的开发
  • 三、常见的消息解析与处理
  • 附录


相关概念陈述

INT PTR是一个指向整数类型数据的指针。PTR是指针的缩写,INT是表示整数类型。因此,INT PTR表示指向整数类型的指针。

1、对话框弹出的函数:
INT_PTR WINAPI DialogBox(
  _In_opt_  HINSTANCE hInstance,//必须从WinMain的第一个参数获取
  _In_      LPCTSTR lpTemplate,
  _In_opt_  HWND hWndParent,
  _In_opt_  DLGPROC lpDialogFunc
);

这个函数是Windows API中用于创建模态对话框的函数。它有四个参数:

hInstance:可选参数,指定包含对话框模板资源的模块实例句柄;一般可以传入NULL。
lpTemplate:必需参数,指定对话框模板的名称或标识符。
hWndParent:可选参数,指定父窗口的句柄,也就是将要显示在哪个窗口上面,如果没有指定,则对话框将居中显示在屏幕上。
lpDialogFunc:可选参数,指向对话框处理函数的指针,当用户操作对话框时,会调用该函数来完成相应的操作。
该函数的返回值是一个整型指针,表示对话框结束时的退出代码。如果函数失败,则返回值为0typedef INT_PTR (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM); 加上typedef这个就是个类型
INT_PTR (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM); 不加的话就是一个函数指针  指针变量

2、Windows 消息处理的回调函数
INT_PTR CALLBACK theProc(HWND, UINT, WPARAM, LPARAM) 
是一个 ,通常用于在 Windows 程序中处理特定的消息。

该函数的参数如下:windows消息类似于网络通讯:消息类型+附带数据

HWND: 表示与消息相关联的窗口的句柄。
UINT: 表示收到的消息的 ID。消息类型
WPARAM: 表示消息所传递的第一个参数。编号
LPARAM: 表示消息所传递的第二个参数。 控件
程序员可以根据不同的消息 ID 来编写不同的响应代码。这个函数的返回值为整型指针(INT_PTR),表示处理结果,一般是 0 或者 1。

在 Windows GUI 应用程序中,通常会在 WinMain 函数中创建并显示主窗口,并在消息循环中调用该函数来处理窗口消息,例如用户点击按钮、鼠标移动等。

一、初始API汇总

代码如下(示例):

1、弹出消息:图标和文字
int WINAPI MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);
2、查找主窗口:根据标题或者窗口类型
HWND WINAPI FindWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName);

3、设置标题文字:
BOOL WINAPI SetWindowText(HWND hWnd,LPCTSTR lpString);

4、获取窗口标题文字:
int WINAPI GetWindowText(HWND hWnd,LPTSTR lpString, int nMaxCount);

5、改变窗口位置和大小:
BOOL WINAPI MoveWindow(
 HWND hWnd,
 int X,
  int Y,
  int nWidth,
 int nHeight,
 BOOL bRepaint
);

6、关闭对话框
BOOL WINAPI EndDialog(HWND hDlg,INT_PTR nResult);

7、获取控件句柄:
HWND WINAPI GetDlgItem(HWND hDlg,  int nIDDlgItem);

8、获取控件文字:
UINT WINAPI GetDlgItemText(HWND hDlg,int nIDDlgItem,LPTSTR lpString,int nMaxCount);

9、设置控件文字:
BOOL WINAPI SetDlgItemText(HWND hDlg,int nIDDlgItem,LPCTSTR lpString);

10、获取窗口位置:
BOOL WINAPI GetWindowRect(HWND hWnd,LPRECT lpRect);
11、禁用和激活窗口:
BOOL WINAPI EnableWindow(HWND hWnd,BOOL bEnable);

12、显示窗口:不止用于隐藏和显示,还有最大化,最小化和恢复等功能。
BOOL WINAPI ShowWindow(HWND hWnd,int nCmdShow);

13、判断窗口是否存在或者已摧毁:
BOOL WINAPI IsWindow(HWND hWnd);

14、判断窗口是否激活或者禁用:
BOOL IsWindowEnabled(HWND hWnd );

15、判断窗口是否显示或隐藏:
BOOL WINAPI IsWindowVisible( HWND hWnd);

对11-15API示例如下:

#include<windows.h>
#include"resource.h"
INT_PTR CALLBACK theProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_COMMAND:
	{
		switch (LOWORD(wParam))
		{
		case IDC_TEST_ENABLE:
		{
			HWND h = GetDlgItem(hwndDlg, IDC_TEST_OK);
			if (h)
			{
				EnableWindow(h, !IsWindowEnabled(h));
				/*if (IsWindowEnabled(h))
					EnableWindow(h, FALSE);
				else
					EnableWindow(h, TRUE);*/
			}
		}
		break;
		case IDC_TEST_SHOW:
		{
			HWND h = GetDlgItem(hwndDlg, IDC_TEST_OK);
			if (h)
			{
				if (IsWindowVisible(h))
					ShowWindow(h, SW_HIDE);
				else
					ShowWindow(h, SW_SHOW);
			}
		}
		break;
		case IDC_TEST_SHOW2:
		{
			HWND h = FindWindow("Notepad", NULL);
			if (h)
			{
				ShowWindow(h, SW_MAXIMIZE);
			}
		}
		break;
		}
	}
	default:
		break;
	}
    return 0;
}
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    DialogBox(hInstance, (LPCSTR)IDD_TEST_DLG, NULL, theProc);
    return 0;
}

消息汇总

代码如下(示例):

Win32是Windows操作系统的一种API,其中包含了许多不同类型的消息,以下是其中一些常见的消息:

WM_INITDIALOG : 对话框初始化消息,只会发送一次(在对话框显示出来之前)
WM_CREATE:在一个窗口被创建时发送。
WM_DESTROY:在一个窗口被销毁前发送。
WM_PAINT:当一个窗口需要重绘时发送。通常在窗口第一次出现、被移动或重绘时发送。
WM_COMMAND:当用户选择菜单项、按钮、工具栏按钮等发送此消息。
WM_KEYDOWN和WM_KEYUP:发送给窗口以指示按下和释放一个键。
WM_LBUTTONDOWN、WM_MBUTTONDOWN和WM_RBUTTONDOWN:分别表示鼠标左键、中键和右键按下的消息。
WM_MOUSEMOVE:当鼠标移动时发送,可以用于捕获鼠标坐标并实现拖拽等功能。
WM_SIZE:当一个窗口改变大小后发送。
WM_SETTEXT:设置窗口标题文本。

二、Windows计算器的开发

对应的图形界面如下:
在这里插入图片描述

#include<windows.h>
#include"resource.h"
#include<stdio.h>
//消息回调函数 typedef INT_PTR (CALLBACK* DLGPROC)(HWND, UINT, WPARAM, LPARAM);
double GetDlgItemDouble(HWND hwndDlg, int nID)
{
	char s[32];
	GetDlgItemText(hwndDlg, nID, s, sizeof(s));
	return atof(s);
}
BOOL SetDlgItemDouble(HWND hwndDlg, int nID, double fValue)
{
	char str[32];
	snprintf(str, sizeof(str), "%g",fValue);
	return SetDlgItemText(hwndDlg, nID, str);
}
INT_PTR CALLBACK theProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
//wParam是编号lParam是控件的句柄  可以通过编号来获取句柄也可以通过句柄来获取编号
{
	switch (uMsg)
	{
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDC_ADD:
		{
			double fLeft = GetDlgItemDouble(hwndDlg, IDC_LEFT1);
			double fRight = GetDlgItemDouble(hwndDlg, IDC_RIGHT1);
			SetDlgItemDouble(hwndDlg, IDC_RES1,fLeft + fRight);
		}
			break;
		case IDC_SUB:
		{
			double fLeft = GetDlgItemDouble(hwndDlg, IDC_LEFT2);
			double fRight = GetDlgItemDouble(hwndDlg, IDC_RIGHT2);
			SetDlgItemDouble(hwndDlg, IDC_RES2, fLeft - fRight);
			
			HWND h = GetDlgItem(hwndDlg, IDC_SUB);
			//wParam是编号lParam是控件的句柄  可以通过编号来获取句柄也可以通过句柄来获取编号
			SetWindowText(HWND(lParam), "哈哈哈");
			if (h==(HWND)lParam)
			{
				MessageBox(hwndDlg, "相同", "结果", 0);
			}
		}
			break;
		case IDC_MULT:
		{
			double fLeft = GetDlgItemDouble(hwndDlg, IDC_LEFT3);
			double fRight = GetDlgItemDouble(hwndDlg, IDC_RIGHT3);
			SetDlgItemDouble(hwndDlg, 1013, fLeft * fRight);
		}
			break;
		case IDC_DIV:
		{
			double fLeft = GetDlgItemDouble(hwndDlg, IDC_LEFT4);
			double fRight = GetDlgItemDouble(hwndDlg, IDC_RIGHT4);
			SetDlgItemDouble(hwndDlg, IDC_RES4, fLeft / fRight);
		}
			break;
		case IDOK:
			MessageBox(NULL, "你点击了ok", "提示", 0);
			break;
		case IDCANCEL:
			if (IDYES == MessageBox(hwndDlg, "你确定要退出吗?", "提示", MB_YESNO | MB_ICONQUESTION))
			{
				EndDialog(hwndDlg, 88);
			}
			break;
		}	
	}
    return 0;
}


int WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) 
{
    UINT_PTR n = DialogBox(hInstance, (LPCSTR)IDD_CALC_DLG, NULL, theProc);

	//位运算
	DWORD dw = MAKELONG(0x5678, 0x1234); //合并成8个字节
	WORD w = MAKEWORD(0x56, 0x34);	//合并成4个字节
	WORD x = LOWORD(dw);	//拆分成低4位
	WORD y = HIWORD(dw);	//拆分成高4位
	BYTE a = LOBYTE(w);
	BYTE b = HIBYTE(w);

    return 0;
}

三、常见的消息解析与处理

如何计算使图片居中的算法
在这里插如何入图片描述

#include<windows.h>
#include"resource.h"
#include<stdio.h>
INT_PTR onInitDialog(HWND hwndDlg) //初始化屏幕让其居中
{
    RECT rect;
    GetWindowRect(hwndDlg, &rect);
    int nwidth = rect.right - rect.left;
    int nheight = rect.bottom - rect.top; 
    int cx = GetSystemMetrics(SM_CXSCREEN);
    int cy = GetSystemMetrics(SM_CYSCREEN);
    int x = (cx - nwidth) / 2;
    int y = (cy - nheight) / 2;
    MoveWindow(hwndDlg, x, y, nwidth, nheight, false);
    return 0;
}
INT_PTR CALLBACK theProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   /* char s[32];
    snprintf(s, sizeof(s), "uMsg = 0x%x\n", uMsg);
    OutputDebugString(s); //当函数被调用了就会进行打印输出*/

    switch (uMsg)
    {
    case WM_INITDIALOG:
    {
        //MessageBox(hwndDlg, "初始化对话框", "提示", 0);
        return onInitDialog(hwndDlg);
    }
    break;
    case WM_COMMAND:
    {
        if (LOWORD(wParam) == IDCANCEL) //编号对编号
        {
            EndDialog(hwndDlg, 88);
        }
    }
    break;
    case WM_MOUSEMOVE:
    {
        char s[32];
        snprintf(s, sizeof(s), "x=%d,y=%d", LOWORD(lParam), HIWORD(lParam));
        if (MK_CONTROL&wParam)
        {
            strcat_s(s, sizeof(s), "按下了ctrl键");
        }
        if (MK_SHIFT& wParam)
        {
            strcat_s(s, sizeof(s), "按下了shift键");
        }
        SetWindowText(hwndDlg, s);
    }
    break;
    }
    return 0;
}
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    DialogBox(hInstance, (LPCSTR)IDD_MAIN_DLG, NULL, theProc);
    return 0;
}

附录

Windows位运算
#define MAKEWORD(a, b)      ((WORD)(((BYTE)(((DWORD_PTR)(a)) & 0xff)) | ((WORD)((BYTE)(((DWORD_PTR)(b)) & 0xff))) << 8))
#define MAKELONG(a, b)      ((LONG)(((WORD)(((DWORD_PTR)(a)) & 0xffff)) | ((DWORD)((WORD)(((DWORD_PTR)(b)) & 0xffff))) << 16))
#define LOWORD(l)           ((WORD)(((DWORD_PTR)(l)) & 0xffff))
#define HIWORD(l)           ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))
#define LOBYTE(w)           ((BYTE)(((DWORD_PTR)(w)) & 0xff))
#define HIBYTE(w)           ((BYTE)((((DWORD_PTR)(w)) >> 8) & 0xff))

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

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

相关文章

Ambari自动部署hadoop

1、Ambari介绍 Apache Ambari项目旨在通过开发用于配置&#xff0c;管理和监控Apache Hadoop集群的软件来简化Hadoop管理. Ambari提供了一个由RESTful API支持的直观&#xff0c;易用的Hadoop管理Web Ul。 Ambari使系统管理员能够: 提供Hadoop集群 Ambari提供了跨任意数量的主…

戴尔游匣笔记本Dell G16 7630原厂Win11系统重装,安装原装出厂OEM预装系统镜像,恢复出厂状态

DELL戴尔游匣笔记本电脑&#xff0c;Dell G16 7630原厂Windows11系统原装OEM预装系统镜像&#xff0c;恢复出厂状态 系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件、戴尔外星人控制中心等预装程序 链接&#xff1a;https://pan.baidu.com/s/10s7dFd1yHhUsgkKVS-No2A?…

数据库管理-第八十五期 19c OCM之路-准备与环境篇(20230626)

数据库管理 2023-06-26 第八十五期 19c OCM之路-准备与环境篇1 计划2 考试环境3 技巧和注意事项总结 第八十五期 19c OCM之路-准备与环境篇 从去年就有消息传出&#xff0c;OCM将从12c升级到19c&#xff0c;今年12c OCM停考&#xff0c;从业内大佬和OU处了解到其实今年3月30日…

JSP自定义标签【下】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于自定义标签的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 导读&#xff1a; &#x1f4a1;辉辉…

linux-2.6.22.6内核信号量、阻塞和费阻塞

信号量 1.所谓信号量也是资源共享条件下保护资源的一种手段&#xff0c;当定义一个信号量时&#xff0c;这个信号量就相当于一个互斥锁&#xff0c;只能属于一个进程&#xff0c;我们把之前同一设备同一时刻只能由一个进程打开的原子变量操作改成信号量。 代码如下&#xff1…

黑河学院ASP.NET程序设计大作业(1)--搭建页面

一、作业简介&#xff1a; 说明&#xff1a;我分到的是上海交通大学-生命科学技术学院 网址&#xff1a;https://life.sjtu.edu.cn/ 二、作业流程: 前台&#xff1a; 1.确定技术点&#xff08;是自己搭建&#xff0c;还是用框架&#xff09; 2.搭建首页、所有的静态页面&#x…

NET Core添加 Sqlite 数据库

文章目录 相关文章回顾Sqlite安装环境说明Nuget安装测试程序 结尾 相关文章回顾 .net framework 命令行项目使用 sqlite,DbContext C# .NET EF框架 webapi 安装使用sqlite visual studio 2022&#xff0c;ADO.NET 实体数据模型添加 sqlite数据库对象 Sqlite安装 环境说明 …

周赛351(模拟、枚举答案、乘法原理+双指针(隔板问题)、栈的应用)

文章目录 周赛351[2748. 美丽下标对的数目](https://leetcode.cn/problems/number-of-beautiful-pairs/)模拟O(10n)做法 [2749. 得到整数零需要执行的最少操作数](https://leetcode.cn/problems/minimum-operations-to-make-the-integer-zero/)枚举答案 [2750. 将数组划分成若干…

ElementUI Table 表格动态添加行和列

一、效果 懒得发什么动态图&#xff0c;直接静态就好了。 二、代码 本文参考代码&#xff1a;https://blog.csdn.net/qq_33791597/article/details/125605873 有需求的可以去看下原文&#xff0c;我是参考后又改造了一番 <template> <div style"padding:10px&q…

磁盘 - 内存 - 中央处理器缓存 / 用户缓存区 - 内核缓存区 / 零拷贝

文章目录 磁盘 - 内存 - 中央处理器缓存用户缓存区 - 内核缓存区零拷贝意义 这些概念比较常用&#xff0c;涉及到物理设备 - 操作系统概念&#xff0c;操作系统概念 - 数据结构的区分。记录一下以供后人取笑。 磁盘 - 内存 - 中央处理器缓存 这些是计算机中比较常用的物理设备…

stable-diffusion-webui 安装问题记录

安装完成后&#xff0c;浏览器打开&#xff1a;http://127.0.0.1:7860/&#xff0c;无论点哪里&#xff0c;只要触发交互&#xff0c;都提示&#xff1a; 解决办法&#xff1a; 1、关闭&#xff08;墙外魔法工具&#xff09;软件&#xff08;不一定有效&#xff09; 2、需要不…

将 Layui 日历框,一周开始由星期日改为星期一

Layui 的日历框控件中&#xff0c;一周的开始是星期日。 但是我更习惯一周开始为星期一。在 ISO8601:2000 中&#xff0c;其中也是规定了&#xff1a;每个日历星期从星期一开始&#xff0c;星期日为第 7 天。 所以改一下。 改 layui.all.js 或 laydate.js&#xff08;取决于…

今日分享:如何文本转语音

嘿&#xff0c;各位小伙伴们&#xff01;你们有没有遇到过想看文章但是又赶时间的情况呢&#xff1f;这时候&#xff0c;文本转语音工具就可以帮助你啦&#xff01;通过使用文本转语音工具&#xff0c;你就可以实现听取文章内容而不必亲自看它们了&#xff0c;真是省时又省力。…

node对应的npm版本

官网地址&#xff1a;node对应的npm版本地址

HTML5+CSS3+JS小实例:Tab选项卡动画切换效果

实例:Tab选项卡动画切换效果 技术栈:HTML+CSS+JS 字体图标库:font-awesome 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name=&q…

eclipse中maven项目pom.xml文件报错:Missing artifact com.sun:tools:jar:1.8.0解决

背景&#xff1a;在引入新的jar包后&#xff0c;突然pom.xml文件就飘红了&#xff0c;提示Missing artifact xxx 原因&#xff1a;新导入的jar包依赖别的jar包&#xff0c;别的jar包因为比较旧&#xff0c;缺失相关文件 处理&#xff1a; 1、找到本地的repository地址&#…

openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域

本示例的目的是介绍演示如何在vue+openlayers中模拟圆孔相机的拍摄场景,根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他来练习 文章目录 示…

[算法前沿]--021-baichuan-7B的测试教程

1.百川模型介绍 baichuan-7B不仅在C-Eval、AGIEval和Gaokao中文权威评测榜单上,以显著优势全面超过了ChatGLM-6B等其他大模型,并且在MMLU英文权威评测榜单上,大幅领先LLaMA-7B。baichuan-7B是由百川智能开发的一个开源的大规模预训练模型。基于Transformer结构,在大约1.2万…

推或拉? rabbitMQ 消费模式该如何选择

系列文章目录 消息队列选型——为什么选择RabbitMQ RabbitMQ 五种消息模型 RabbitMQ 能保证消息可靠性吗 文章目录 系列文章目录前言一、推拉两种模式的概念二、推模式的使用及优势1. 使用2. 优劣 三、拉模式的使用及优势1. 使用2. 优劣 四、消费端Ack模式与Qos1. Ack模式2. Q…

Linux——1初识linux

目录 1.1 硬件和软件 1.2 初识Linux 1.2.1 Linux的诞生 1.2.2 LInux内核 1.2.3 Linux发行版 1.3 虚拟机介绍 1.4 VMware WorkStation 安装 1.5 在VMware上安装Linux 1.6 远程连接Linux系统 1.6.1 图形化、命令行 1.6.2 FinalShell 1.1 硬件和软件 我们所熟知的计算…