一、GUI用戶界面元素
(1)、GUI應用程序是由固定的窗口元素所構成
(2)、操作系統提供了創建用戶界面元素所需要的函數
(3)、各自功能不同的函數依次調用,從而創建出界面元素
(4)、操作系統提供的元素函數無法直接映射到界面元素
二、面向對象的GUI應用程序設計
1、GUI應用程序的應用
(1)、GUI應用程序是為了解決非科學計算問題而誕生的
(2)、GUI應用程序適用于非專業的日常生活領域
(3)、面向過程程序設計方法學不適合GUI程序設計
(4)、面向對象程序設計方法學更適合GUI程序設計
2、用面向對象的方法看待GUI程序設計
(1)、用面向對象的方法看待GUI界面元素
(2)、所有的界面元素都可以看做實際的對象
(3)、GUI用戶界面是由各不相同的對象組成的
(4)、如主窗口對象
A、菜單對象
B、按鈕對象
C、文本框對象
3、GUI應用程序非常適合采用面向對象的方法學
(1)、將界面元素定義成對應的類
(2)、通過抽象和封裝可以隱藏界面元素的細節
(3)、程序的創建過程就是組合不同元素對象的過程
//main.cpp


#include <windows.h> #include "Application.h" #include "MainWindow.h" #include "PushButton.h"BOOL WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {Application a(hInstance, lpCmdLine);MainWindow w(hInstance, L"Main Window");PushButton b(&w, L"My Button");w.show();return a.exec(); }
//Application.h


#pragma once#include <windows.h>class Application { public:Application(HINSTANCE hInstance, LPSTR lpCmdLine);bool exec(); };
//Application.cpp


#include "Application.h"Application::Application(HINSTANCE hInstance, LPSTR lpCmdLine) {}bool Application::exec() {MSG msg = { 0 };//進入消息循環while ( GetMessage(&msg, NULL, 0, 0)){//翻譯并轉換系統消息TranslateMessage(&msg);//分發消息到對應的消息處理函數DispatchMessage(&msg);}return TRUE; }
//Widget.h


#pragma once#include <windows.h>class Widget { protected:Widget* m_parent;HWND m_hwnd; public:Widget();Widget(Widget* parent);HWND hwnd();Widget* parent(); };
//Widget.cpp


#include "Widget.h"Widget::Widget() {m_parent = NULL; }Widget::Widget(Widget* parent) {m_parent = parent; }HWND Widget::hwnd() {return m_hwnd; }Widget* Widget::parent() {return m_parent; }
//MainWidow.h


#pragma once#include "Widget.h"class MainWindow : public Widget { protected:static const wchar_t STYLE_NAME[];//主窗口定義 BOOL DefineMainWindow(HINSTANCE hInstance);//主窗口創建void CreateMainWindow(HINSTANCE hInstance, const wchar_t* title);//主窗口消息處理函數static LRESULT CALLBACK WndProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam);public:MainWindow(HINSTANCE hInstance, const wchar_t* title);void show(); };
//MainWidow.cpp


#include "MainWindow.h"const wchar_t MainWindow::STYLE_NAME[] = L"MainForm";//主窗口定義 BOOL MainWindow::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); }//主窗口創建 void MainWindow::CreateMainWindow(HINSTANCE hInstance, const wchar_t* title) {m_hwnd = CreateWindow(STYLE_NAME, //通過定義好的窗口樣式創建主窗口title, //主窗口標題WS_OVERLAPPEDWINDOW,//創建后主窗口的顯示風格CW_USEDEFAULT, //主窗口左上角x坐標CW_USEDEFAULT, //主窗口左上角y坐標CW_USEDEFAULT, //主窗口寬度CW_USEDEFAULT, //主窗口高度NULL, //父窗口NULL, //主窗口菜單hInstance, //主窗口屬于當前應用程序 NULL); }//主窗口消息處理函數 LRESULT CALLBACK MainWindow::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; }MainWindow::MainWindow(HINSTANCE hInstance, const wchar_t* title) :Widget(NULL) {DefineMainWindow(hInstance);CreateMainWindow(hInstance, title); }void MainWindow::show() {ShowWindow(m_hwnd, SW_SHOWNORMAL); //顯示窗口UpdateWindow(m_hwnd); //刷新窗口 }
//PushButton.h


#pragma once#include "Widget.h"class PushButton : public Widget { public:PushButton(Widget* win, const wchar_t* text); };
//PushButton.cpp


#include "PushButton.h"PushButton::PushButton(Widget* win, const wchar_t* text) {HINSTANCE hInstance = (HINSTANCE)GetWindowLong(win->hwnd(), GWL_HINSTANCE);m_hwnd = CreateWindow(L"button", //通過系統預定義的窗口樣式創建元素text, //窗口元素標題WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,//創建后窗口元素的顯示風格50, //窗口元素在主窗口左上角x坐標50, //窗口元素在主窗口左上角y坐標200, //窗口元素寬度60, //窗口元素高度win->hwnd(), //父窗口(HMENU)this, //窗口元素ID值hInstance, //窗口元素屬于當前應用程序 NULL); }
三、QT的本質
(1)、QT是利用面向對象方法學開發的一套GUI組件庫
(2)、QT將不同操作系統的GUI細節封裝于類的內部
(3)、QT提供一套跨平臺的類用于開發GUI程序
(4)、QT遵循經典的GUI應用程序開發模式
四、小結
(1)、GUI程序開發更適合采用面向對象方法學
(2)、所有的界面元素都可以看做是實際的對象
(3)、GUI用戶界面是由各不相同的對象組成的
(4)、QT是利用面向對象方法學開發的一套GUI組件庫
(5)、QT將GUI細節封裝于類的內部,具有跨平臺的特性