首页 > 编程语言 >QT第2课-GUI程序实例分析

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

时间:2023-11-28 10:05:30浏览次数:50  
标签:窗口 QT WndClass HWND GUI 实例 hInstance NULL


GUI程序开发概述

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

GUI 程序开发原理

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

经典的GUI程序

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

GUI程序开发的本质

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

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

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);
}

效果

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


标签:窗口,QT,WndClass,HWND,GUI,实例,hInstance,NULL
From: https://blog.51cto.com/wangpaifeixingy/8595236

相关文章

  • Qt之QSS的使用
    一、QSS介绍QSS(QuickStyleSheet)是一种用于定义Qt应用程序样式的机制。Qt是一个跨平台的C++应用程序开发框架,而QSS则允许开发者使用类似于CSS(层叠样式表)的语法来定义Qt应用程序的外观和风格。1.QSS的基本语法QSS的语法类似于CSS,通过设置属性和值的方式定义样式。例如:QPushBu......
  • 遇到Qt使用UI文件无法连接信号问题
    1.手动加载UI文件代码如下: 以上代码pushButton按钮在状态切换时,无法接收到信号,经过调试发现调用"connect"时变量“lineWidget”各个成员都是空指针,但是"connect"函数并没有报异常。2.查看"setupUI"函数,其片段如下: 可以发现,其实创建对象都是在"setupUi"中完成。3......
  • JavaWeb实现文件上传下载功能实例解析
    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择......
  • MQTT断开连接((32109) - java.io.EOFException)
    现象:首先代码没问题,一台设备测试正常,当多台设备同时使用时,会出现连接成功后,立刻断开连接。client=newMqttClient(①,②,③)①:主机名②:客户端ID,客户的唯一标识③:设置clientid保存形式,默认以内存保存例如:newMqttClient(tcp://139.196.34.00,34:20:03:0b:b9:00,newMemoryPersisten......
  • C语言调用C++类成员函数讲解和实例
    原文:https://blog.csdn.net/LxXlc468hW35lZn5/article/details/1257010071、问题成因C语言与C++调用问题原因主要在于C编译器和C++编译器的不同。C是过程式语言,C编译器编译后,函数在符号库中就是函数名,没有其他任何附加信息。而C++是对象式语言,支持函数重载,C++编译器编译后,在符号......
  • Qt导出与加载dll
    先开篇,后期更新整理 1、Qt插件开发-夕西行-博客园(cnblogs.com)2、Qt插件开发方式-夕西行-博客园(cnblogs.com)2、Qt插件开发-夕西行-博客园(cnblogs.com) ......
  • 《实例化需求》阅读笔记三
    这本书给出了做到实例化需求的关键过程模式: 从目标中获取范围——协作定制需求说明——举例说明——提炼需求说明——不需要修改需求说明的自动化验证——频繁验证——演化出一个文档系统。从目标中获取范围:交付团队不应该指望用户直接给出范围或者解决方案,因为客户大部分时候并......
  • Java之线程实例(重要)
    接上一章没讲完的线程知识点中关于“死锁”的概念。当线程进入不可运行状态时,其他线程无法访问那个加锁对象,所以一个线程会一直处于等待另一个线程的状态,而另一个线程又会处于等待下一个线程的状态,此时,所有的线程都陷入无休止的等待状态中,无法继续运行,这种情况就被称为线程的“死锁......
  • Python GUI 开发过程中踩过的坑总结
    1、在使用pycharm开发运行时,ide会默认添加python文件和资源文件到python路径中去,所以通常不会报错,但是默写情况则会出现报错,如模块加载不到其他模块的问题。在手动创建项目工程目录结构时,需要将指定的python文件存放目录设定为【sourcesroot】,然后在该目录下在创建目录时要创建......
  • asp.net core webapi项目实例源代码锦集下载(72个)
    下载地址:http://www.80cxy.com/Blog/ResourceView?arId=202311251726127234f6oAkh所有代码实例(Chinese)物业收费系统,使用ASP.NETCoreMVC框架.netcorewebapi配合swagger以及其他常用功能的单层项目.NETCore实战项目之CMS系列教程的源码Asp.NetCore项目中,以服务......