第二課、GUI程序實例分析------------------狄泰軟件學院

1、GUI應用程序的概述

一、現代操做系統支持GUI界面windows

(1)、現代操做系統提供原生SDK支持GUI程序開發函數

(2)、GUI程序開發是現代操做系統上的主流技術ui

(3)、不一樣操做系統上的GUI開發原理相同spa

(4)、不一樣操做系統上的GUI SDK不一樣操作系統

二、GUI應用程序開發原理翻譯

(1)、GUI應用程序在運行時會建立一個消息隊列code

(2)、系統內核將用戶的操做翻譯成對應的程序消息orm

(3)、程序運行過程當中須要實時處理隊列中的消息blog

(4)、當隊列中沒有消息時,程序將處於停滯狀態隊列

(5)、不一樣的操做系統支持相同的GUI開發原理

三、GUI程序開發的本質

一、GUI程序開發

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

(2)、在消息處理函數中根據程序消息做出不一樣的相應

 (3)、經典GUI開發模式(可視化界面開發+消息映射)

四、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;
}

2、小結

(1)、現代操做系統提供原生的SDK支持GUI程序開發

(2)、不一樣操做系統上的GUI SDK不一樣

(3)、不一樣操做系統上的GUI開發原理相同

(4)、GUI程序開發包括

A、在代碼中用程序建立窗口及窗口元素

B、在消息處理函數中根據程序消息做出不一樣響應

相關文章
相關標籤/搜索