文章目录

  • 前言
  • 代码
  • 运行结果

前言

目标:创建的示例应用程序,使用 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桌面应用程序相关推荐

  1. 如何创建一个 Windows 桌面应用程序?

    工具:Visual Studio 2017 Community 在大学期间,不过学习 C/C++ 还是 Java,每次写的程序都是控制台黑框框,有时候想设计一个可视化的应用程序却不知从何下手,大学里面 ...

  2. windows桌面应用程序_如何将Windows桌面应用程序转换为通用Windows应用程序

    windows桌面应用程序 With Windows 10's Anniversary Update, Microsoft is making it possible for developers t ...

  3. 使用C++代码创建一个Windows桌面应用程序

    下面六星教育整理使用C++代码创建一个Windows桌面应用程序,供大家学习参考. WinMain函数 Windows应用程序的唯一程序入口. 函数原型 int WINAPI WinMain { HI ...

  4. windows桌面应用程序UI自动化工具(转载)

    原文地址:windows桌面应用程序UI自动化工具 - anobscureretreat - 博客园 最近在研究针对windows桌面应用程序的自动化工具,查找了网上相关资料,UI自动化工具很多,但是 ...

  5. 对Windows桌面应用程序进行UI自动化测试

    所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows桌面应用程序进行UI自动化测试,目前可选的技术主要是两种:VS自带的CodedUI ...

  6. python 桌面程序自动化测试_对Windows桌面应用程序进行UI自动化测试

    题记:本文简述如何利用appium对Windows桌面应用程序进行UI自动化测试. 所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows ...

  7. C#基于.Net框架的学生信息管理系统(Windows桌面应用程序)

    简介 自己用C#编写了一个学生信息管理系统的Windows桌面应用程序,第一次实践,某些地方可能还不够完善,但其中有些函数.方法等的使用可以参考. 工具 我用的集成开发环境是Visual Studio ...

  8. C#【自动化测试】对Windows桌面应用程序进行UI自动化测试

    文章目录 1.文章一: 题记 UI自动化测试 参考 2.文章二: 3.重要资源[实例]: 1)已验证可用[非常好的例子,便于理解] 关键代码 2)未验证 1.文章一: 题记 本文简述如何利用appiu ...

  9. Flutter教程之Windows桌面应用程序开发

    Flutter教程之Windows桌面应用程序开发 一.前言 二.环境安装 三.创建项目 四.已有项目添加其他平台支持 一.前言 Flutter 是 Google 开源的 UI 工具包,帮助开发者通过 ...

最新文章

  1. databinding 入门 知识 给TextView 赋值
  2. 牛客~~打篮球~~~模拟水题
  3. python可以做什么游戏-用python做游戏的细节详解
  4. [译]HTMLCSS Lesson2: 了解HTML
  5. OpenCV均值移位(Meanshift)和Camshift算法
  6. 用原生js封装get方法
  7. jq获取 html元素节点,jQuery 获取当前节点的html
  8. setsockopt设置套接口选项
  9. Android下Cocos2d创建HelloWorld工程
  10. Facebook 游戏开发更新文档 API 参考文档 v5.0
  11. Python实现坦克大战——源代码
  12. 建站系统创业项目综合测评:ePower、云优CMS、微加互联、微企点
  13. 【Redis】2. 入门篇
  14. Vue(狂神学习笔记)2021-10-8
  15. Python基础-19-魔法方法(常用)
  16. 基于Django实现Linux运维管理平台的整个实现过程和各种API接口调用以及Echarts绘图项目介绍(一)记录点滴生活
  17. gif一键抠图 在线_5个一键抠图高效率工具
  18. 洛谷P1489 猫狗大战
  19. brpc internal
  20. Java第三天笔记01——流程控制语句

热门文章

  1. 【源码分享下载】一款基于微客服的仿微信的聊天软件
  2. Python一看就懂系列(二)
  3. 如何成为有趣的人(转)
  4. 16、计时器方法2(setTimeout、clearTimeout、防抖、节流)
  5. 【深度学习实战—5】:基于AlexNet的CIFAR10数据集分类(附Keras实现)
  6. 采集工具有哪些-数据采集工具有哪些-网站采集工具
  7. 使用Qt的QPainter绘制阿基米德螺旋线
  8. 用JAVA定义两个结构体_c语言struct结构体的定义和使用
  9. c语言struct用法
  10. const int问题