运用Windows API进行编程

news/2025/1/17 21:32:39/文章来源:https://www.cnblogs.com/wa2211lq/p/18540536

目录
  • 运用Windows API进行编程
    • 实验环境
    • 窗口创建基本流程
    • 基本代码流程
      • 1、头文件和库
      • 2、全局变量和函数
      • 3、入口主函数
      • 4、注册窗口类函数
      • 5、创建和显示窗口函数
      • 6、窗口过程函数
    • 运行结果
    • 实验小结

运用Windows API进行编程

运行Windows应用程序在桌面显示Windows窗口。窗口内背景色为灰色,且窗口中居中显示“大家好,这是我的第一个Windows API程序!”同时播放背景音乐,并可通过程序改变窗口显示风格为只有标题栏,以及鼠标指针形状为手型。

实验环境

vs2022


窗口创建基本流程

1、注册窗口类,指定窗口类的名称和窗口回调函数
RegisterClassEx函数 : 注册一个扩展的窗口类,这个窗口类可以创建多个窗口实例
2、创建窗口,指定注册窗口类,窗口标题,窗口的大小
CreateWindow函数 : 创建窗口实例
3、显示窗口
ShowWindow函数:设置指定窗口的显示状态
4、开始消息循环
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);//转换消息
DispatchMessage(&msg);//消息分发
}
While退出,线程结束,否则循环的过程中系统自动回调窗口过程函数
5、窗口函数中处理窗口消息
WindowProc回调函数(窗口过程函数):处理窗口接收的消息,switch函数根据接收的消息的类别分类处理,如果都不符合,则调用DefWindowProc默认处理

基本代码流程

1、头文件和库

#include<Windows.h>
#include<mmsystem.h>
#include<tchar.h>
#include"resource.h"
#pragma comment(lib, "winmm.lib") // 链接winmm库  

#include<tchar.h>的宏“_T”:
_T支持 Unicode 和 ANSI 字符串的兼容性。根据项目的字符集设置,_T 宏会展开为 L 前缀(表示宽字符字符串)或普通字符字面量(表示 ANSI 字符串)。这意味着如果修改项目的编码模式我们不需要修改所有的字符串字面量。

2、全局变量和函数

HINSTANCE hInst;//存储实例句柄的全局变量
HWND hwnd;//窗口句柄的全局变量ATOM MyRegisterClass(HINSTANCE hInstance);//注册窗口类
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);//创建和显示窗口
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);//窗口函数中处理窗口消息

3、入口主函数

int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine,_In_ int nCmdShow)
{//1、注册窗口类if (!MyRegisterClass(hInstance)){MessageBox(NULL, _T("窗口类注册失败!"), _T("错误"), MB_OK | MB_ICONERROR);return FALSE;}//2、创建窗口;3、显示窗口if (!InitInstance(hInstance, nCmdShow)){MessageBox(NULL, _T("窗口创建失败!"), _T("错误"), MB_OK | MB_ICONERROR);return FALSE;}// 循环播放背景音乐PlaySound(_T("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC| SND_LOOP);//4、开始消息循环MSG msg;//消息while (GetMessage(&msg, (HWND)NULL, 0, 0))//从消息队列里取消息到msg{TranslateMessage(&msg);//翻译消息(鼠标、键盘之类的消息)DispatchMessage(&msg);//转发消息到5、窗口过程}return (int)msg.wParam;
}

4、注册窗口类函数

//注册窗口类
ATOM MyRegisterClass(HINSTANCE hInstance)
{/*窗口类typedef struct WNDCLASSEX {UINT        cbSize;             //结构体大小//Win 3.xUINT        style;              //窗口风格WNDPROC     lpfnWndProc;        //窗口过程函数指针int         cbClsExtra;int         cbWndExtra;HINSTANCE   hInstance;          //当前实例句柄HICON       hIcon;              //大图标HCURSOR     hCursor;            //鼠标HBRUSH      hbrBackground;      //背景LPCSTR      lpszMenuName;       //菜单LPCSTR      lpszClassName;      //窗口类名称指针,创建窗口时需要使用//Win 4.0HICON       hIconSm;            //小图标}*/WNDCLASSEX wcx;wcx.cbSize = sizeof(wcx);wcx.style = CS_HREDRAW | CS_VREDRAW;//窗口在发生水平或垂直方向上的变化时,重画窗口wcx.lpfnWndProc = MainWndProc;wcx.cbClsExtra = 0;wcx.cbWndExtra = 0;wcx.hInstance = hInstance;wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION);wcx.hCursor = LoadCursor(NULL, IDC_HAND);//手型鼠标//wcx.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//改成灰色背景wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wcx.lpszMenuName = NULL;//没有菜单wcx.lpszClassName =_T("MainWClass");wcx.hIconSm = (HICON)LoadImage(hInstance,MAKEINTRESOURCE(5), IMAGE_ICON,GetSystemMetrics(SM_CXSMICON),//标准小图标的宽度GetSystemMetrics(SM_CYSMICON),//标准小图标的高度LR_DEFAULTCOLOR);/*if (!RegisterClassEx(&wcx)){return 1;}*/return RegisterClassEx(&wcx);
}

5、创建和显示窗口函数

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{/*
HWND CreateWindowExW(DWORD dwExStyle,LPCWSTR lpClassName,        //窗口类名称 wcx.lpszClassNameLPCWSTR lpWindowName,       //窗口标题DWORD dwStyle,              //窗口样式int X,int Y,int nWidth,int nHeight,HWND hWndParent,           //父窗口HMENU hMenu,               //菜单HINSTANCE hInstance,       //当前实例句柄LPVOID lpParam);
*/hInst = hInstance;//存储实例句柄在全局变量hwnd = CreateWindow(_T("MainWClass"),_T("hello"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,//默认CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,(HWND)NULL,(HMENU)NULL,//没有菜单hInstance,(LPVOID)NULL);if (!hwnd){return FALSE;}ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);//立即显示return TRUE;
}

6、窗口过程函数

//窗口过程函数:处理窗口接收的消息
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{switch (uMsg){//关闭窗口case WM_DESTROY:        PostQuitMessage(0);break;//通知窗口需要重绘case WM_PAINT: {//存储绘画操作的信息。PAINTSTRUCT ps;//调用BeginPaint函数,它为窗口准备一个设备上下文(HDC),用于绘画。函数将绘画信息存储在ps中,并返回设备上下文的句柄。HDC hdc = BeginPaint(hwnd, &ps);// 设置文本背景为透明 如果创建窗口类时已经设定窗口背景色为灰色,则只要令文本背景为灰色即可。//SetBkMode(hdc, TRANSPARENT); // 设置文本背景色SetBkColor(hdc, RGB(200, 200, 200));// 清除窗口背景ExtTextOut(hdc, 0, 0, ETO_OPAQUE, &ps.rcPaint, NULL, 0, NULL);//ETO_OPAQUE标志表示用背景色填充矩形区域。//文本输出const TCHAR* text = _T("大家好,这是我的第一个Windows API程序!");int length = _tcslen(text);// 设置文本颜色SetTextColor(hdc, RGB(0, 0, 0));// 获取客户区矩形  RECT clientRect;GetClientRect(hwnd, &clientRect);// 计算文本的大小  SIZE textSize;GetTextExtentPoint32(hdc, text, length, &textSize);  //文本的位置是窗口客户区宽度和高度的一半int x = (clientRect.right - textSize.cx) / 2;int y = (clientRect.bottom - textSize.cy) / 2;// 绘制文本 TextOut(hdc,x ,y , text, length);//结束绘画操作,将绘画结果提交到屏幕上。EndPaint(hwnd, &ps);break;} default:return DefWindowProc(hwnd, uMsg, wParam, lParam);//转给windows处理,默认的窗口过程}return 0;
}

运行结果

实验小结

本次实验重点为窗口的创建流程,将注册窗口类和创建显示窗口的代码封装在函数中,主函数中只要调用即可。
在创建完窗口后,使用

PlaySound(_T("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC| SND_LOOP);

同步循环播放音乐。
绘制文本的内容在
https://www.cnblogs.com/wa2211lq/p/18540637
有详细说明

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

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

相关文章

Windows API窗口绘图程序设计

目录Windows API窗口绘图程序设计1、窗口过程函数2、WM_LBUTTONDOWN:处理鼠标左键按下的消息鼠标消息相关知识点基本鼠标消息双击消息附带信息滚轮消息附带信息:3、WM_PAINT:处理窗口重绘的消息窗口绘图相关知识点窗口绘图基本流程开始绘画绘制封闭图形(能使用画刷填充的图形…

Matlab常用的图像属性

线型、标记和颜色 线型、标记和颜色,指定为包含符号的字符串或字符向量。符号可以按任意顺序显示。不需要同时指定所有三个特征(线型、标记和颜色)。例如,如果忽略线型,只指定标记,则绘图只显示标记,不显示线条。以下是 MATLAB 在许多类型的绘图中使用的默认颜色的 RGB …

jvm Java虚拟机栈——栈内存溢出

----------- ---------------------- -----------------

学习笔记(三十五):ArkTs-@ohos.util.ArrayList (线性容器ArrayList)

概述: 一种线性数据结构,底层基于数组实现一、导入import { ArrayList } from @kit.ArkTS; 二、定义let arrayList: ArrayList<string | number> = new ArrayList(); 三、常用函数 1、 add,在ArrayList尾部插入元素 2、insert,在长度范围内任意位置插入指定元素3、…

Scrum冲刺-第一篇

这个作业属于哪个课程 广工计院计科34班这个作业要求在哪里 作业要求这个作业的目标 小队各成员的任务确认和项目期望一、团队简介: 队名:edg.gdut 成员:姓名 学号罗祖文 3121004537郑志涛 3122004547陈恺麟 3122004515许凌铎 3122004540邓茗骏 3122004517李晓彬 3122004531…

(1) Pytorch深度学习—数值处理

(1)Pytorch——数值处理参考于李沐“动手学深度学习”系列以及网上各路大佬的博客资料,感谢大家的分享,如错改,如侵删。torch中的数值处理 数值处理是深度学习中极其重要的一部分,张量(tensor)是后续进行处理和计算的基本单位。张量表示一个由数值组成的数组,这个数组…

904. 水果成蓝

题目 自己第一次写的,结果超时了 class Solution { public:int totalFruit(vector<int> &fruits){int r = 1;int res = 1;while (r < fruits.size()){int l = r - 1;int n = 1; // 代表不同的种类个数int second = -1;while (n <= 2 && l >= 0){i…

Lift, Splat, Shoot, LSS代码详尽分析与解读

LSS是英伟达在ECCV2020上发表的文章《Lift, Splat, Shoot: Encoding Images from Arbitrary Camera Rigs by Implicitly Unprojecting to 3D》中提出的一个BEV感知算法,后续很多BEV感知算法如CaDDN、BEVDet都是在LSS的基础上实现的。本文将结合论文和代码详细解读LSS的原理。鸟…

【Playwright + Python】系列(九)Playwright 调用 Chrome 插件,小白也能事半功倍

哈喽,大家好,我是六哥!今天我来给大家分享一下如何使用playwight调用chrome插件,面向对象为功能测试及零基础小白,我尽量用大白话的方式举例讲解,力求所有人都能看懂,建议大家先收藏,以免后面找不到。😎 什么是chrome插件? 就是辅助你工作生活的助手,会让你事半功倍…

基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现四

技术点:SpringBoot+SpringDataJPA+Mysql+Freemaker+Bootstrap+JS+CSS+HTML 部分功能:课程分类信息数据层Dao、课程信息数据层Dao、课程订单信息数据层Dao、课程评价信息数据层Dao、课程视频信息数据层Dao、课程小节信息数据层Dao、课程试题信息数据层Dao、课程试卷信息数据层…

极限limit

The Limit 两个重要极限\[\displaystyle\lim_{x\to 0}\frac{sinx}{x}=1 \]\[\displaystyle\lim_{x\to \infty}(1+x)^{\frac{1}{x}}=e \]间断点 1.第一类间断点 第一类间断点是指在该点附近的函数值存在,但在该点的极限不存在。具体来说,若 $ f(x) $ 在 $ x = c $ 附近的左极限…

基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现三

该系统总共24张表,代码整洁,每个功能、接口上都有注释说明。 运行环境:jdk1.8、mysql5.x、eclipse/idea、maven3.5/3.6 包远程运行的哦。 特色功能:发布课程、学习课程、分享资料、资料讨论等。 部分功能:关于我们信息实体类Entity、评论信息实体类Entity、课程资料信息实…