第二课、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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值