当前位置: 首页 > news >正文

QT第2课-GUI程序实例分析

GUI程序开发概述

  • 不同的操作系统GUI开发原理相同
  • 不同的操作系统GUI SDK 不同

GUI 程序开发原理

  • GUI程序在运行时会创建一个消息队列
  • 系统内核将用户的键盘鼠标操作翻译成对应的程序消息
  • 程序在运行过程中需要实时处理队列中的消息
  • 当队列中没有消息时,程序将处于停滞状态,等待用户操作
    在这里插入图片描述

经典的GUI程序

在这里插入图片描述

GUI程序开发的本质

  • 在代码中用程序创建窗口以及窗口元素
  • 在消息处理函数中根据程序消息做出不同的反应

在这里插入图片描述

GUI程序开发实例

以windows操作系统为例子

函数名功能
RegisterClass向系统注册GUI窗口式样
CreateWindow创建窗口或窗口元素
ShowWindow在屏幕上显示创建好的窗口
UpdateWindow刷新屏幕上的窗口
GetMessage获取程序消息队列中的消息
TranslateMessage翻译系统消息
DispatchMessage将消息发送到窗口处理函数

代码

#include <windows.h>#define STYLE_NAME    L"MainForm"
#define BUTTON_ID     919/* 主窗口定义函数 */
BOOL DefineMainWindow(HINSTANCE hInstance);
/* 主窗口创建函数 */
HWND CreateMainWindow(HINSTANCE hInstance, wchar_t* title);
/* 主窗口内部元素创建函数 */
HWND CreateButton(HWND parent, int id, wchar_t* text);
/* 主窗口显示函数 */
HWND DisplayMainWindow(HWND hWnd, int nCmdShow);
/* 主窗口消息处理函数 */
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);static HWND MainWindow = NULL; // 主窗口句柄标BOOL WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{MSG Msg = {0};/* 1.自定义主窗口样式 */if( !DefineMainWindow(hInstance) ){return FALSE;}/* 2.创建主窗口 */MainWindow = CreateMainWindow(hInstance, STYLE_NAME);if( MainWindow ){/* 3.创建主窗口中的控件元素 */CreateButton(MainWindow, BUTTON_ID, L"My Button");/* 4.在屏幕上显示主窗口 */DisplayMainWindow(MainWindow, nCmdShow);}else{return FALSE;}/* 5.进入消息循环 */while( GetMessage(&Msg, NULL, NULL, NULL) ){/* 6.翻译并转换系统消息 */TranslateMessage(&Msg);/* 7.分发消息到对应的消息处理函数 */DispatchMessage(&Msg);}return TRUE;
}BOOL DefineMainWindow(HINSTANCE hInstance)
{static WNDCLASS WndClass = {0}; // 系统结构体类型// 用于描述窗口样式WndClass.style         = 0;WndClass.cbClsExtra    = 0;WndClass.cbClsExtra    = 0;WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW);          // 定义窗口背景色WndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);     // 定义鼠标样式WndClass.hIcon         = LoadIcon(NULL, IDI_APPLICATION); // 定义窗口左上角图标WndClass.hInstance     = hInstance;                       // 定义窗口式样属于当前应用程序WndClass.lpfnWndProc   = WndProc;                         // 窗口消息处理函数WndClass.lpszClassName = STYLE_NAME;                      // 窗口样式名WndClass.lpszMenuName  = NULL;/* 将定义好的窗口式样注册到系统 */return RegisterClass(&WndClass);
}HWND CreateMainWindow(HINSTANCE hInstance, wchar_t* title)
{HWND hwnd = NULL;hwnd = CreateWindow(STYLE_NAME,            // 通过定义好的窗口式样创建主窗口title,                 // 主窗口标题WS_OVERLAPPEDWINDOW,   // 创建后主窗口的显示风格CW_USEDEFAULT,         // 主窗口左上角 x 坐标CW_USEDEFAULT,         // 主窗口左上角 y 坐标CW_USEDEFAULT,         // 主窗口宽度CW_USEDEFAULT,         // 主窗口高度NULL,                  // 父窗口NULL,                  // 窗口菜单栏hInstance,             // 主窗口属于当前应用程序NULL);                 // 窗口参数return hwnd;}HWND DisplayMainWindow(HWND hWnd, int nCmdShow)
{ShowWindow(hWnd,nCmdShow); // 显示窗口UpdateWindow(hWnd);        // 刷新窗口return hWnd;
}HWND CreateButton(HWND parent, int id, wchar_t* text)
{HINSTANCE hInstance = (HINSTANCE)GetWindowLong(parent, GWL_HINSTANCE);HWND hwnd = NULL;hwnd = CreateWindow(L"button",                               // 通过系统预定义式样创建窗口元素text,                                    // 窗口元素标题WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,   // 窗口元素的显示风格50,                                      // 窗口元素在窗口中的左上角 x 坐标50,                                      // 窗口元素在窗口中的左上角 y 坐标200,                                     // 窗口元素的宽度60,                                      // 窗口元素的高度parent,                                  // 窗口元素所在的父窗口(HMENU)id,                               // 窗口元素 ID 值hInstance,                               // 窗口元素属于当前应用程序NULL);                                   // 窗口元素参数return hwnd;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{/* 调用系统提供的默认消息处理函数 */return DefWindowProc(hWnd, message, wParam, lParam);
}

效果

在这里插入图片描述

相关文章:

  • 计算机毕设 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉
  • Elasticsearch 外部词库文件更新
  • rust_for_linux驱动完整版记录
  • 2311rust模式匹配
  • node插件MongoDB(三)—— 库mongoose 的使用和数据类型(一)
  • 头歌答案HTML——基础
  • 国际阿里云:Linux实例负载高问题排查和异常处理!!!
  • 【中间件篇-Redis缓存数据库02】Redis高级特性和应用(慢查询、Pipeline、事务、Lua)
  • 未来的拥塞控制与 Linux EEVDF 调度器
  • 在AutoDL云环境上训练Stable Diffusion Lora模型
  • 美国材料与试验协会ASTM发布新版玩具安全标准 ASTM F963-23
  • 免费博客搭建笔记
  • 基于springboot实现驾校管理系统项目【项目源码】计算机毕业设计
  • vuex中的 actions 中,是不能使用 this.$message.error() 的
  • Java学习_对象
  • 「面试题」如何实现一个圣杯布局?
  • css系列之关于字体的事
  • Flannel解读
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • nodejs实现webservice问题总结
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • SQLServer插入数据
  • Vue官网教程学习过程中值得记录的一些事情
  • windows下如何用phpstorm同步测试服务器
  • 每天10道Java面试题,跟我走,offer有!
  • 首页查询功能的一次实现过程
  • 探索 JS 中的模块化
  • 学习HTTP相关知识笔记
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • const的用法,特别是用在函数前面与后面的区别
  • Hibernate主键生成策略及选择
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • !!java web学习笔记(一到五)
  • #pragma pack(1)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (二)springcloud实战之config配置中心
  • (七)理解angular中的module和injector,即依赖注入
  • (十)c52学习之旅-定时器实验
  • (原)本想说脏话,奈何已放下
  • (转)shell调试方法
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net core使用ef 6
  • .Net Web项目创建比较不错的参考文章
  • .NET 使用配置文件
  • .NET和.COM和.CN域名区别
  • .NET命令行(CLI)常用命令
  • /etc/sudoer文件配置简析
  • @SuppressWarnings(unchecked)代码的作用
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [cogs2652]秘术「天文密葬法」