创建传统的Windows桌面应用程序
文章目录
- 前言
- 代码
- 运行结果
前言
目标:创建的示例应用程序,使用 Windows API 显示 “Hello,Windows desktop!” 应用程序。
教学资料:【SDK开发】《Windows程序设计》 – 小甲鱼 – p4~p8 | 视频中的代码
下面代码来源:演练:创建传统的 Windows 桌面应用程序 (c + +) – windows官网
代码
代码内容可以分为两部分:
填充窗口的有关信息(WNDCLASSEX) -> 注册窗口类(RegisterClassEx) -> 创建窗口(CreateWindow) -> 显示窗口(ShowWindow) -> 更新窗口(UpdateWindow)
消息循环(GetMessage -> TranslateMessage ->DispatchMessage)
/*** 保存为windows.c* 编译的时候,链接gdi32库:gcc .\windows.c -o window -lgdi32* kernel32.dll:主要处理内存管理和进程调度;user32.dll:主要控制用户界面;gdi32.dll:负责图形方面的操作* */
#include <windows.h>// 主窗口的名称
static TCHAR szWindowClass[] = TEXT("DesktopApp");
// 出现在应用的title bar
static TCHAR szTitle[] = TEXT("Windows Desktop Guided Tour Application");// 声明消息处理函数
LRESULT CALLBACK WndPRoc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nShowCmd){// 填充窗口的有关信息。填充类型为WNDCLASSEX结构// 该WNDCLASSEX结构是类似于WNDCLASS结构。有两个区别。WNDCLASSEX包括cbSize成员和hIconSm成员,该成员指定结构的大小,而hIconSm成员包含与窗口类关联的小图标的句柄。WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); //此结构的大小(以字节为单位)。将此成员设置为sizeof(WNDCLASSEX)。在调用GetClassInfoEx函数之前,请确保设置此成员。wcex.style = CS_HREDRAW | CS_VREDRAW; //只要窗口更改大小,就可以让应用程序重绘工作区的全部内容wcex.lpfnWndProc = WndPRoc; //指向窗口过程的指针。您必须使用CallWindowProc函数来调用窗口过程。有关更多信息,请参见WindowProc。wcex.cbClsExtra = 0; // 根据窗口类结构分配的额外字节数。系统将字节初始化为零。wcex.cbWndExtra = 0; // 窗口实例后要分配的额外字节数。系统将字节初始化为零。如果应用程序使用WNDCLASSEX在资源文件中注册使用CLASS指令创建的对话框 ,则必须将此成员设置为DLGWINDOWEXTRA。wcex.hInstance = hInstance; // 包含类的窗口过程的实例的句柄。wcex.hIcon = LoadIcon(hInstance,IDI_APPLICATION); // 类图标的句柄。该成员必须是图标资源的句柄。如果此成员为NULL,则系统提供默认图标。[IDI_APPLICATION:默认应用程序图标]wcex.hCursor = LoadCursor(NULL, IDC_ARROW); // IDC_ARROW:标准箭头wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // 类背景画笔的句柄;颜色值必须是以下标准系统颜色之一(必须将值1添加到所选颜色中)。如果指定了颜色值,则必须将其转换为以下 HBRUSH类型之一wcex.lpszMenuName = NULL; // 该字符串指定类菜单的资源名称;如果此成员为NULL,则属于此类的Windows没有默认菜单。wcex.lpszClassName = szWindowClass; // 如果lpszClassName是一个字符串,则它指定窗口类名称wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION); // 与窗口类关联的小图标的句柄// 向 Windows 注册, WNDCLASSEX 使其了解你的窗口以及如何向其发送消息if(!RegisterClassEx(&wcex)){MessageBox(NULL,TEXT("Call to RegisterClassEx failed!"),TEXT("Windows Desktop Guided Tour"),0);return 1;}// 创建窗口HWND hWnd = CreateWindow(szWindowClass, //如果lpClassName是一个字符串,则它指定窗口类名称szTitle, // 窗口名称WS_OVERLAPPEDWINDOW, // 正在创建的窗口的样式,该窗口是一个重叠的窗口[是个组合]CW_USEDEFAULT, CW_USEDEFAULT, // 窗口的初始水平位置,窗口的初始垂直位置CW_USEDEFAULT, CW_USEDEFAULT, // 窗口的宽度,窗口的高度NULL, // 要创建的窗口的父窗口或所有者窗口的句柄NULL, // 菜单的句柄hInstance, // 与窗口关联的模块实例的句柄NULL // 如果不需要其他数据,则lpParam可以为NULL。);if(!hWnd){MessageBox(NULL,TEXT("Call to CreateWindow failed!"),TEXT("Windows Desktop Guided Tour"),0);return 1;}//此时,已创建了窗口,但我们仍需要告知 Windows 使其可见ShowWindow(hWnd,nShowCmd);UpdateWindow(hWnd);// 为了处理 Windows 现在正在向其发送的消息,我们首先添加一个消息循环来侦听 Windows 发送的消息。 // 当应用程序收到消息时,此循环会将它调度到要 WndProc 处理的函数MSG msg;// 从调用线程的消息队列中检索消息// 参数含义:// 第一个参数:指向MSG结构的指针,该结构从线程的消息队列接收消息信息;// 第二个参数:要获取其消息的窗口的句柄。为NULL,则GetMessage检索属于当前线程的任何窗口的消息// 第三和第四个参数,均为零,则GetMessage返回所有可用消息(即,不执行范围过滤)。while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg); // 将虚拟键消息转换为字符消息。字符消息将发布到调用线程的消息队列中,以在线程下次调用GetMessage或PeekMessage函数时读取。DispatchMessage(&msg); // 将消息调度到窗口过程。它通常用于调度由GetMessage函数检索的消息。}return (int) msg.wParam;
}// 启用 WndProc 函数以处理应用程序收到的消息
// 函数的参数分别为:窗口的句柄,消息,附加消息信息,附加消息信息
LRESULT CALLBACK WndPRoc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){PAINTSTRUCT ps;HDC hdc;TCHAR greeting[] = TEXT("Hello, Windows destop!");switch (message){case WM_PAINT: //显示窗口消息(当对窗口进行更新的时候)// BeginPaint函数向指定的窗口绘画,将绘画的信息填充到PAINTSTRUCT结构中// hWnd:处理要重绘的窗口;ps:指向将接收绘画信息的PAINTSTRUCT结构的指针// 如果函数成功,则返回值是指定窗口的显示设备上下文的句柄// 如果函数失败,则返回值为NULL,指示没有显示设备上下文可用hdc = BeginPaint(hWnd,&ps);// 所述的TextOut函数在指定位置写入的字符串,利用当前选择的字体,背景颜色和文本颜色。// 参数分别是:设备上下文的句柄、系统用来对齐字符串的参考点的x坐标、系统用来对齐字符串的参考点的y坐标、指向要绘制的字符串的指针、指向的字符串的长度,以字符为单位// 如果函数成功,则返回值为非零。如果函数失败,则返回值为零。TextOut(hdc,TA_CENTER,TA_CENTER,greeting,lstrlen(greeting));//调用EndPaint函数标记指定窗口画的结束。每次调用BeginPaint函数都需要此函数,但是仅在绘制完成之后才需要。// 参数分别是:处理已重新粉刷的窗口,由BeginPaint检索的绘画信息的PAINTSTRUCT结构的指针// 返回值始终为非零EndPaint(hWnd,&ps);break;case WM_DESTROY: // 销毁窗口消息// 向系统指示线程已请求终止(退出)。通常用于响应WM_DESTROY消息// 参数为应用程序退出代码。此值用作WM_QUIT消息的wParam参数PostQuitMessage(0);break;default:// 继续执行默认处理return DefWindowProc(hWnd,message,wParam,lParam);break;}return 0;
}
运行结果
比较讨厌的是,我不知道如何使用vscode 创建桌面程序。[vs可以创建桌面程序,但是我不想下载TA]
这里编译生成的是命令台程序,所以它总是出现命令台。
创建传统的Windows桌面应用程序相关推荐
- 如何创建一个 Windows 桌面应用程序?
工具:Visual Studio 2017 Community 在大学期间,不过学习 C/C++ 还是 Java,每次写的程序都是控制台黑框框,有时候想设计一个可视化的应用程序却不知从何下手,大学里面 ...
- windows桌面应用程序_如何将Windows桌面应用程序转换为通用Windows应用程序
windows桌面应用程序 With Windows 10's Anniversary Update, Microsoft is making it possible for developers t ...
- 使用C++代码创建一个Windows桌面应用程序
下面六星教育整理使用C++代码创建一个Windows桌面应用程序,供大家学习参考. WinMain函数 Windows应用程序的唯一程序入口. 函数原型 int WINAPI WinMain { HI ...
- windows桌面应用程序UI自动化工具(转载)
原文地址:windows桌面应用程序UI自动化工具 - anobscureretreat - 博客园 最近在研究针对windows桌面应用程序的自动化工具,查找了网上相关资料,UI自动化工具很多,但是 ...
- 对Windows桌面应用程序进行UI自动化测试
所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows桌面应用程序进行UI自动化测试,目前可选的技术主要是两种:VS自带的CodedUI ...
- python 桌面程序自动化测试_对Windows桌面应用程序进行UI自动化测试
题记:本文简述如何利用appium对Windows桌面应用程序进行UI自动化测试. 所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows ...
- C#基于.Net框架的学生信息管理系统(Windows桌面应用程序)
简介 自己用C#编写了一个学生信息管理系统的Windows桌面应用程序,第一次实践,某些地方可能还不够完善,但其中有些函数.方法等的使用可以参考. 工具 我用的集成开发环境是Visual Studio ...
- C#【自动化测试】对Windows桌面应用程序进行UI自动化测试
文章目录 1.文章一: 题记 UI自动化测试 参考 2.文章二: 3.重要资源[实例]: 1)已验证可用[非常好的例子,便于理解] 关键代码 2)未验证 1.文章一: 题记 本文简述如何利用appiu ...
- Flutter教程之Windows桌面应用程序开发
Flutter教程之Windows桌面应用程序开发 一.前言 二.环境安装 三.创建项目 四.已有项目添加其他平台支持 一.前言 Flutter 是 Google 开源的 UI 工具包,帮助开发者通过 ...
最新文章
- databinding 入门 知识 给TextView 赋值
- 牛客~~打篮球~~~模拟水题
- python可以做什么游戏-用python做游戏的细节详解
- [译]HTMLCSS Lesson2: 了解HTML
- OpenCV均值移位(Meanshift)和Camshift算法
- 用原生js封装get方法
- jq获取 html元素节点,jQuery 获取当前节点的html
- setsockopt设置套接口选项
- Android下Cocos2d创建HelloWorld工程
- Facebook 游戏开发更新文档 API 参考文档 v5.0
- Python实现坦克大战——源代码
- 建站系统创业项目综合测评:ePower、云优CMS、微加互联、微企点
- 【Redis】2. 入门篇
- Vue(狂神学习笔记)2021-10-8
- Python基础-19-魔法方法(常用)
- 基于Django实现Linux运维管理平台的整个实现过程和各种API接口调用以及Echarts绘图项目介绍(一)记录点滴生活
- gif一键抠图 在线_5个一键抠图高效率工具
- 洛谷P1489 猫狗大战
- brpc internal
- Java第三天笔记01——流程控制语句