第2課 GUI程序實例分析

1. GUI程序開發概述編程

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

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

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

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

2. GUI程序開發原理操作系統

(1)GUI程序在運行時會建立一個消息隊列翻譯

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

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

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

 

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

 

3. GUI程序開發的本質

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

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

經典GUI程序開發模式

 

4. GUI程序開發實例

(1)多數操做系統以C函數的方式提供GUI SDK

(2)以Windows操做系統爲例

函數名

功能

RegisterClass

向系統註冊GUI窗口樣式

CreateWindow

建立窗口或窗口元素

ShowWindow

在屏幕上顯示建立好的窗口

UpdateWindow

刷新屏幕上的窗口

GetMessage

獲取程序消息隊列中的消息

TranslateMessage

翻譯系統消息

DispatchMessage

將消息發送到窗口處理函數

【編程實驗】GUI程序開發初體驗

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

5. 小結

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

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

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

(4)GUI程序開發包括:

  ①在代碼中用程序建立窗口窗口元素

  ②在消息處理函數中根據程序消息作出不一樣響應

相關文章
相關標籤/搜索