• 第二课、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、在消息处理函数中根据程序消息作出不同响应

  • 相关阅读:
    将行政区域导入SQL SERVER
    wpf 使用Font-Awesome图标字体
    Visual Studio Code用户设置文件
    vue2+webpack 开发环境配置
    Bootstrap datepicker 在弹出窗体modal中不工作
    English Training Material
    FIJ Jobs – 2013/8/12
    English Training Material
    English Training Material
    位操作(求[a, b] 中二进制位为1的个数最多的数)
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6384916.html
Copyright © 2020-2023  润新知