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

第二课、GUI程序实例分析------------------狄泰软件学院

一、GUI应用程序的概述

1、现代操作系统支持GUI界面

(1)、现代操作系统提供原生SDK支持GUI程序开发

(2)、GUI程序开发是现代操作系统上的主流技术

(3)、不同操作系统上的GUI开发原理相同

(4)、不同操作系统上的GUI SDK不同

2、GUI应用程序开发原理

(1)、GUI应用程序在运行时会创建一个消息队列

(2)、系统内核将用户的操作翻译成对应的程序消息

(3)、程序运行过程中需要实时处理队列中的消息

(4)、当队列中没有消息时,程序将处于停滞状态

(5)、不同的操作系统支持相同的GUI开发原理

3、GUI程序开发的本质

1、GUI程序开发

(1)、在代码中用程序创建窗口及窗口元素

(2)、在消息处理函数中根据程序消息作出不同的相应

 (3)、经典GUI开发模式(可视化界面开发+消息映射

4、GUI程序开发实例

(1)、多数操作系统以c 函数的方式提供GUI SDK

(2)、以Windows操作系统为例

程序分析:

#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, int 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,0,0))
    {
        //6.翻释并转换系统消息
        TranslateMessage(&Msg);
        //7.分发消息到对应的消息处理函数
        DispatchMessage(&Msg);
    }

    return Msg.wParam;
}

BOOL DefineMainWindow(HINSTANCE hInstance)
{
    static WNDCLASS WndClass = { 0 };//系统结构类型,用于描述窗口样式

    WndClass.style         = 0;
    WndClass.cbClsExtra    = 0;
    WndClass.cbWndExtra    = 0;
    WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW);          //定义窗口背景色
    WndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);     //定义鼠标样式
    WndClass.hIcon         = LoadIcon(NULL, IDI_APPLICATION); //定义窗口左上角图标
    WndClass.hInstance     = hInstance;                       //定义窗口样式属于当前应用程序
    WndClass.lpfnWndProc   =(WNDPROC)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, int message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        //调用系统提供的默认消息处理函数
        return DefWindowProc(hWnd, message, wParam, lParam);
    }

    return 0;
}

二、小结

(1)、现代操作系统提供原生的SDK支持GUI程序开发

(2)、不同操作系统上的GUI SDK不同

(3)、不同操作系统上的GUI开发原理相同

(4)、GUI程序开发包括

A、在代码中用程序创建窗口及窗口元素

B、在消息处理函数中根据程序消息作出不同响应

 

转载于:https://www.cnblogs.com/gui-lin/p/6384916.html

相关文章:

  • 第五课、Qt Creator 工程介绍------------------狄泰软件学院
  • PL/pgSQL RETURNS TABLE 例子
  • 贝塞尔曲线学习
  • 2007浙大复试上机考试题目2--统计字符
  • static作用(修饰函数、局部变量、全局变量)
  • 18 Issues in Current Deep Reinforcement Learning from ZhiHu
  • PC 微信扫码登陆
  • 创建表空间、新增用户、给用户赋予DBA权限 、删除用户下的上有数据表
  • 欢迎大家关注民工哥个人微信公众号
  • 我这样减少了26.5M Java内存!
  • JAVA 命令行参数解析,org.apache.commons.cli的使用
  • 几款网络测试工具总结
  • CentOS7 添加路由命令
  • IDEA web项目部署运行Tomcat
  • Maven国内高速镜像
  • Android单元测试 - 几个重要问题
  • HTTP中的ETag在移动客户端的应用
  • javascript 总结(常用工具类的封装)
  • JavaScript设计模式与开发实践系列之策略模式
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Less 日常用法
  • select2 取值 遍历 设置默认值
  • Vue官网教程学习过程中值得记录的一些事情
  • 百度小程序遇到的问题
  • 后端_ThinkPHP5
  • 记一次删除Git记录中的大文件的过程
  • 力扣(LeetCode)56
  • 聊一聊前端的监控
  • 使用 QuickBI 搭建酷炫可视化分析
  • 一个完整Java Web项目背后的密码
  • ​2021半年盘点,不想你错过的重磅新书
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #Java第九次作业--输入输出流和文件操作
  • #pragam once 和 #ifndef 预编译头
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)3D模板阴影原理
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)项目管理杂谈-我所期望的新人
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 解决重复提交问题
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • @staticmethod和@classmethod的作用与区别
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • @我的前任是个极品 微博分析
  • [145] 二叉树的后序遍历 js
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [BZOJ4016][FJOI2014]最短路径树问题
  • [codevs 1515]跳 【解题报告】
  • [C语言]一维数组二维数组的大小
  • [git] windows系统安装git教程和配置