创建你的第一个Windows程序

第一个 Windows 程序

* 纯净版

#include<Windows.h>int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iShowCmd
)
{MessageBox(NULL, TEXT("Hello, Windows!"), TEXT("HelloMsg"), 1);return 0;
}

* 注释版

#include<Windows.h>int WINAPI WinMain(HINSTANCE hInstance,		// 当前实例的句柄,唯一标识了我们这个程序(在Windows程序中,句柄就是一个数值,用来标识某个东西)HINSTANCE hPrevInstance,	// 前一个实例的句柄(在Win32中,此概念已弃用,因此该参数总是NULL)LPSTR lpCmdLine,			// 命令行参数int iShowCmd				// 指明程序最初如何显示(正常显示、最大化到全屏、最小化到任务栏)
)
{MessageBox(					// 函数作用:弹出一个小窗口,主要用来显示一些短消息NULL,					// 窗口句柄,唯一标识这个窗口TEXT("Hello, Windows!"),// 要在信息框里面出现的文本字符串TEXT("HelloMsg"),		// 要在标题栏上显示的文本字符串1						// 选择按钮的类型);return 0;
}/*
Windows API 中"类型"的命名规则:HINSTANCE: H + INSTANCE == handle + instance == 实例句柄LPSTR: L + P + STR == long + pointer + str == 长字符指针i == intsz == 以零结尾的字符串c == const == 常量s == static == 静态*/

编码问题

  • 早期 Windows 使用 ASCII 进行编码,对于美国自己来用,基本上足够了

  • 随着计算机的发展,世界各国都想要自己的文字能够在计算机上表示

  • 为了统一世界各国的字符编码问题,Unicode 诞生了

  • 它是通过增加位的方式来扩充,由原来的7位,变成现在的16位(方案不同,会有所出入,但只会更多,不会更少)

  • 可容纳的符号,由原来的27=128,变成现在的216=65536(方案不同,会有所出入,但只会更多,不会更少)

  • 使用 Unicode 也有缺点:就是用 Unicode 写的字符占用的空间,会比用 ASCII 写的字符所占用的空间大2倍

  • 为此,人们希望最好能够创建两个版本的程序,让不同需求的人,拿最适合自己的那一个版本即可

  • 于是,有了以下的设计:

使用 TCHAR.H 头文件,这个头文件提供了一系列的类型或函数的替代名称

一个命名为 _UNICODE 的标识符被定义了,在生成代码时

TCHAR 就自动变成 wchar_t_tprintf 就自动变成 wprintf(w:width)

一个名为 _UNICODE 的标识符没有被定义,在生成代码时

TCHAR 就自动变成 char_tprintf 就自动变成 printf

同样的道理,对于字符串而言,使用 _T("hello world")_TEXT("hello world") 也能自动变化

#include<Windows.h>
#include<tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{MessageBox(NULL, _T("你好,窗口!"), _T("信息窗口"), 0);return 0;
}

创建窗口

运行代码的时候:

  • 打开项目属性。
  • 导航到“链接器”>“输入”>“附加依赖项”。
  • 在“附加依赖项”字段中添加 winmm.lib(如果列表中还没有的话)

* 纯净版

#include<Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow
)
{static TCHAR szAppName[] = TEXT("HelloWin");HWND		hwnd;MSG			msg;WNDCLASS	wndclass;wndclass.style			= CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc	= WndProc;wndclass.cbClsExtra		= 0;wndclass.cbWndExtra		= 0;wndclass.hInstance		= hInstance;wndclass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor		= LoadCursor(NULL, IDC_APPSTARTING);wndclass.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName	= NULL;wndclass.lpszClassName	= szAppName;if (!RegisterClass(&wndclass)){MessageBox(NULL, TEXT("This program requires Windwos!"), szAppName, MB_ICONERROR);return 0;}hwnd = CreateWindow(szAppName,TEXT("The Hello Program"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC hdc;PAINTSTRUCT ps;RECT rect;switch (message){case WM_CREATE:PlaySound(TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC);return 0;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);GetClientRect(hwnd, &rect);DrawText(hdc, TEXT("Hello, Windows!"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);EndPaint(hwnd, &ps);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}

* 注释版

#include<Windows.h>/* ------------------------------------------------------------------要创建窗口,首先需要注册一个窗口类,而窗口类又需要"窗口过程"来处理窗口消息名词解释:窗口过程,是一个函数,用于处理发送到类的所有窗口或发布到所有窗口的所有消息窗口过程是给 Windows 回调用的,它必须遵循规定的格式对窗口过程的子程序名并没有规定,对 Windows 来说,窗口过程的地址才是惟一需要的
------------------------------------------------------------------ */// 声明"窗口过程"(窗口处理函数),用于处理窗口消息
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  // 窗口过程的名字,是可以自定义命名的// Windows 程序的入口点
int WINAPI WinMain(HINSTANCE hInstance,		// 当前实例的句柄HINSTANCE hPrevInstance,	// 前一个实例的句柄(在Win32中,此参数总是NULL)PSTR szCmdLine,				// 命令行参数int iCmdShow				// 控制窗口如何显示
)
{static TCHAR szAppName[] = TEXT("HelloWin");	// 窗口类名HWND		hwnd;								// 窗口句柄MSG			msg;								// 消息结构体WNDCLASS	wndclass;							// 窗口类结构体// 设置窗口类的属性wndclass.style			= CS_HREDRAW | CS_VREDRAW;				// 窗口重绘风格wndclass.lpfnWndProc	= WndProc;								// 窗口过程(窗口处理函数)wndclass.cbClsExtra		= 0;									// 窗口类额外内存大小wndclass.cbWndExtra		= 0;									// 窗口实例额外内存大小wndclass.hInstance		= hInstance;							// 应用实例句柄wndclass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);		// 加载默认图标wndclass.hCursor		= LoadCursor(NULL, IDC_APPSTARTING);	// 加载默认光标wndclass.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);	// 背景画刷wndclass.lpszMenuName	= NULL;									// 菜单名(这里没有使用)wndclass.lpszClassName	= szAppName;							// 窗口类名// 注册窗口类if (!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("This program requires Windwos!"),szAppName,MB_ICONERROR);return 0;}// 创建窗口hwnd = CreateWindow(szAppName,					// 窗口类名TEXT("The Hello Program"),	// 窗口标题WS_OVERLAPPEDWINDOW,		// 窗口风格CW_USEDEFAULT,				// x坐标(使用默认值)CW_USEDEFAULT,				// y坐标(使用默认值)CW_USEDEFAULT,				// 宽度(使用默认值)CW_USEDEFAULT,				// 高度(使用默认值)NULL,						// 父窗口句柄(无父窗口)NULL,						// 菜单句柄(无菜单)hInstance,					// 应用实例句柄NULL						// 创建参数(这里不使用));// 显示并更新窗口ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);// 消息循环while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);		// 翻译消息(如键盘消息到字符消息)DispatchMessage(&msg);		// 分发消息到窗口过程(窗口处理函数)}return msg.wParam;
}// 实现窗口过程(窗口处理函数)
LRESULT CALLBACK WndProc(HWND hwnd,			// 窗口句柄UINT message,		// 消息IDWPARAM wParam,		// 消息参数(对于某些消息,它表示特定的信息)LPARAM lParam		// 消息参数(对于某些消息,它通常是一个指向结构体的指针)
)
{HDC hdc;			// 设备上下文句柄,用于绘图操作PAINTSTRUCT ps;		// 绘图结构体,用于 BeginPaint 和 EndPaint 函数RECT rect;			// 矩形区域,用于描述窗口的绘图区域switch (message){case WM_CREATE:						// 窗口创建消息PlaySound(						// 播放声音文件TEXT("hellowin.wav"),		// 声音文件的路径NULL,SND_FILENAME | SND_ASYNC	// SND_FILENAME表示通过文件名播放声音,SND_ASYNC表示异步播放(不阻塞程序));return 0;case WM_PAINT:						// 窗口绘图消息hdc = BeginPaint(hwnd, &ps);	// 开始绘图GetClientRect(hwnd, &rect);		// 获取窗口客户区大小DrawText(hdc,TEXT("Hello, Windows!"),	// TEXT("Hello, Windows!"): 要绘制的文本字符串-1,							// -1: 字符串中的字符数。如果为-1,则函数会自动计算字符串长度 &rect,						// &rect: RECT结构体的指针,指定文本绘制的区域。文本将在这个矩形区域内被格式化DT_SINGLELINE | DT_CENTER | DT_VCENTER// DT_SINGLELINE | DT_CENTER | DT_VCENTER: 文本绘制选项// DT_SINGLELINE 表示文本将被格式化为单行// DT_CENTER 表示文本将在指定的矩形区域内水平居中// DT_VCENTER 表示文本将在指定的矩形区域内垂直居中);EndPaint(hwnd, &ps);			// 结束绘图return 0;case WM_DESTROY:					// 窗口销毁消息PostQuitMessage(0);				// 发出退出消息到消息队列return 0;}// 如果消息没有被窗口过程(WndProc)显式处理,则调用默认的窗口处理函数(DefWindowProc)来处理它return DefWindowProc(hwnd,		// hwnd: 窗口句柄,表示哪个窗口接收到了消息message,	// message: 消息ID,标识了要处理的消息类型wParam,		// wParam: 消息的参数之一,它的具体含义取决于消息类型lParam		// lParam: 消息的参数之二,它的具体含义也取决于消息类型);
}

常见的标识符前缀

前缀常量
CS类风格选项
CW创建窗口选项
DT文本绘制选项
IDI图标的 ID 号
IDC光标的 ID 号
MB消息框选项
SND声音选项
WM窗口消息
WS窗口风格

常用的变量名前缀

前缀数据类型
cchar 或 WCHAR 或 TCHAR
byBYTE(无符号字符)
nshort
iint
x, yint, 表示 x 坐标和 y 坐标
cx, cyint, 表示 x 或 y 的长度,c 表示 count (计数)
B 或 fBOOL(int); f 表示 flag
wWORD(无符号短整型)
lLONG(长整型)
dwDWORD(无符号长整型)
fn函数
s字符串
sz以零结束的字符串
h句柄
p指针

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

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

相关文章

困惑度作为nlp指标的理解示例

为了更清晰地说明困惑度的计算过程以及如何通过困惑度判断模型的优劣&#xff0c;我们可以通过一个简单的例子来演示。假设我们有一个非常简单的文本语料库和两个基础的语言模型进行比较。 示例文本 假设我们的文本数据包括以下两个句子&#xff1a; “cat sits on the mat”…

计算机网络:网络层 - 路由选择协议

计算机网络&#xff1a;网络层 - 路由选择协议 路由器的结构路由选择协议概述自治系统 AS内部网关协议路由信息协议 RIP距离向量算法RIP报文格式收敛问题 开放最短路径优先 OSPF基本工作原理自治系统分区 外部网关协议BGP-4 路由器的结构 如图所示&#xff0c;路由器被分为路由…

形参被引用修饰导致实参传递没有发生拷贝的原理是什么,return一个变量的引用要返回拷贝的数据的原理是什么

在C中&#xff0c;当我们谈论形参&#xff08;函数参数&#xff09;被引用修饰以及返回引用时&#xff0c;我们需要理解引用和拷贝之间的区别&#xff0c;以及它们是如何影响内存和数据传递的。 形参被引用修饰导致实参传递没有发生拷贝的原理&#xff1a; 当函数参数是引用类…

【项目实战】如何写一个操作系统?

【项目实战】如何写一个操作系统? 目录 【项目实战】如何写一个操作系统?前言下载32位的lucid系统解决旧版系统下载源失效的问题利用共享文件夹将下载的.deb文件上传系统中如何解决下载了g但是不能使用的问题&#xff1f;编译系统源文件配置grub和qemu项目拓展 作者&#xff…

证照之星 XE版软件怎么下载安装? 【详细安装图文教程】

软件简介&#xff1a; 证照之星是国内顶级的证件照片制作软件&#xff0c;具有一键裁剪&#xff0c; 智能背景替换&#xff0c;批量制作、内置证照规格的四大优势。同时两大独创技术&#xff1a;智能去除皮肤油光、证照服装替换。同时支持联机拍摄&#xff1a;支持网络摄像头及…

【软件工程】【23.04】p2

关键字&#xff1a; 计算机软件定义、需求基本性质、创建系统类图所涉及的工作、RUP创建系统用况模型活动、软件生存周期模型、能力等级和成熟度等级区别联系&#xff1b; 模块结构图&#xff1a;深度宽度、扇入扇出、作用域、控制域&#xff1b; 程序流程图&#xff1a;语句…

2024年6月四六级考试复盘

一、考试情况 1.1四级考试情况 听力&#xff1a;一开始没有进入状态。总共对了9道。7.1*37.1*314.2*3 8.2 新闻听力&#xff1a;3/7 长对话&#xff1a;3/8 讲座/讲话&#xff1a;3/10 阅读&#xff1a;3.55*7 7.1*8 14.2 * 7 181.05 选词填空&#xff1a;保守估计7/1…

吉他谱反复记号有哪些 Guitar Pro如何加吩咐标记 吉他初学者入门教程

吉他谱中的反复记号是指用来指示音乐重复部分的符号&#xff0c;对于吉他演奏者来说&#xff0c;了解这些符号的含义和使用方法非常重要。下面我们来看看吉他谱反复记号有哪些&#xff0c;Guitar Pro 如何加吩咐标记的相关内容。 一、吉他谱反复记号有哪些 1.双线反复记号&am…

大数据与人工智能在保险行业数字化转型中的应用

随着科技的快速发展&#xff0c;大数据和人工智能&#xff08;AI&#xff09;技术在保险行业中扮演着越来越重要的角色&#xff0c;推动了保险行业的数字化转型。通过收集和分析海量的用户数据&#xff0c;利用先进的人工智能算法&#xff0c;保险公司能够更准确地评估风险&…

C++ 迷宫问题

描述 定义一个二维数组 N*M &#xff0c;如 5 5 数组下所示&#xff1a; int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只能横着走…

数据交换平台_10_activatemq 中间件容错性测试

目录概要 3. 容错测试: - 模拟ActiveMQ在异常情况下的表现,如网络中断、节点故障等。 - 观察ActiveMQ的容错机制是否能够正确处理异常情况,保证消息的可靠传输。 - 根据容错测试结果,优化ActiveMQ的容错机制,确保系统在面对异常情况时能够正确处理并恢复。 设计: 容错测…

操作系统—页表(实验)

文章目录 页表1.实验目标2.实验过程记录(1).增加打印页表函数(2).独立内核页表(3).简化软件模拟地址翻译 3.实验问题及相应解答问题1问题2问题3问题4 实验小结 页表 1.实验目标 了解xv6内核当中页表的实现原理&#xff0c;修改页表&#xff0c;使内核更方便地进行用户虚拟地址…

异常处理与IO

2.1 (Y. Daniel Liang英文版第11版P492&#xff1a;12.2*) (NumberFormatException) Write a program that prompts the user to read two integers and displays their sum. Your program should prompt the user to read the number again if the input is incorrect. …

[leetcode] 2269. 找到一个数字的 K 美丽值

一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目&#xff1a; 子字符串长度为 k 。 子字符串能整除 num 。 给你整数 num 和 k &#xff0c;请你返回 num 的 k 美丽值。 注意&#xff1a; 允许有 前缀 0 。 0 不能整除任何值。 一个 子字符串 是一个字符…

华媒舍:明星祝福视频,为你送上最真挚的祝福!

引言&#xff1a;嗨&#xff0c;亲爱哒书友&#xff01;在这样一个科谱详细介绍文中&#xff0c;我们将带你领略一份尤其的独家合辑——十部明星祝愿视频。这种视频汇聚了诸多明星为你送上的最真挚的祝福。让我们一起来探寻这种电影中蕴含的情绪和价值吧&#xff01; 1.共享温暖…

【JS重点16】对象原型

目录 一&#xff1a;对象原型是什么 二&#xff1a;对象原型作用 三&#xff1a;constructor属性 四&#xff1a;如何赚钱 一&#xff1a;对象原型是什么 每个对象都有一个属性__proto__(称为原型对象),该属性是一个对象 __proto__是JS非标准属性在实例对象中&#xff0c;…

概率论与数理统计 -- 大数定理及切比雪夫不等式整理

大数定理、切比雪夫不等式及其推导 大数定律 弱大数定律&#xff08;Weak Law of Large Numbers, WLLN&#xff09; 弱大数定律指出&#xff0c;当试验次数 (n) 趋向无穷大时&#xff0c;样本平均值 (\bar{X_n}) 与期望值 (\mu) 之间的差异以概率收敛于0。数学上表示为&…

【LeetCode最详尽解答】15-三数之和 3sum

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 链接: 15-三数之和 直觉 示例: 输入: nums [-1, 0, 1, 2, -1, -4] 输出: [[-1, -1, 2], [-1, 0, 1…

MongoDB~高可用集群介绍:复制集群(副本集)、分片集群

背景 MongoDB 的集群主要包括副本集&#xff08;Replica Set&#xff09;和分片集群&#xff08;Sharded Cluster&#xff09;两种类型。 副本集 组成&#xff1a;通常由一个主节点&#xff08;Primary&#xff09;和多个从节点&#xff08;Secondary&#xff09;构成。 功…

Linux 按键输入实验

Linux 按键输入实验 1、添加 pinctrl 节点 首先修改在设备树里面添加关于按键的节点。I.MX6U-ALPHA 开发板上的 KEY 使用了 UART1_CTS_B 这个 PIN&#xff0c;打开 imx6ull-alientekemmc.dts&#xff0c;在 iomuxc 节点的 imx6ul-evk 子节点下创建一个名为“pinctrl_key”的子…