MiniGUI概要設(shè)計.doc_第1頁
MiniGUI概要設(shè)計.doc_第2頁
MiniGUI概要設(shè)計.doc_第3頁
MiniGUI概要設(shè)計.doc_第4頁
MiniGUI概要設(shè)計.doc_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

MiniGUI 特性說明書本文檔說明 MiniGUI 所支持的功能特性。一、概述MiniGUI 是 Linux 控制臺上運行的,基于 SVGALib 和 LinuxThread 庫的多窗口圖形用戶界面支持系統(tǒng)。MiniGUI 采用了類 Win32 的 API 接口,實現(xiàn)了簡化的類 Windows 98 風(fēng)格的圖形用戶界面。圖形用戶界面在許多情況下都優(yōu)于字符界面,其最大的優(yōu)點是使應(yīng)用程序的操作簡單易學(xué)。在 MiniGUI 中,圖形用戶界面包括如下基本元素:圖 1.1 圖形用戶界面的基本元素1.1 窗口MiniGUI 中的窗口基本分四類,分別為主窗口、對話框、控件和主窗口中的窗片。MiniGUI 中的主窗口和 Windows 應(yīng)用程序的主窗口概念類似,但略微有些不同,MiniGUI 中的每個主窗口對應(yīng)于一個單獨的線程,通過函數(shù)調(diào)用可建立主窗口以及對應(yīng)的線程。每個線程有一個消息隊列,主窗口從這一消息隊列中獲取消息并由窗口過程(回調(diào)函數(shù))進行處理。MiniGUI 中的對話框是一種特殊的窗口,對話框一般和控件一起使用,這兩個概念和 Windows 的相關(guān)概念是類似的。MiniGUI 支持的控件類型有: 靜態(tài)框:文本、圖標(biāo)或矩形框等。這種控件的屬性一般不會在運行時發(fā)生變化。 文本框:單行或多行的文本編輯框。 按鈕:單選鈕、復(fù)選框和一般按鈕等。 其他特殊控件。窗片是 MiniGUI 所特有的,窗片實際是主窗口的子窗口,只存在于主窗口中。為了處理上的方便,主窗口的子窗口只以平鋪的形式出現(xiàn),因此我們將這種子窗口稱為“窗片”或“窗格”。窗片可以是私有的控件類型,也可以是標(biāo)準(zhǔn)的控件類型。1.2 消息和消息循環(huán)在Windows系列操作系統(tǒng)中,廣泛使用了消息驅(qū)動的概念。在MiniGUI中,我們也使用了消息驅(qū)動作為應(yīng)用程序的創(chuàng)建構(gòu)架。在消息驅(qū)動的應(yīng)用程序中,計算機外設(shè)發(fā)生的事件,例如鍵盤鍵的敲擊、鼠標(biāo)鍵的按擊等,都由支持系統(tǒng)收集,將其以事先的約定格式翻譯為特定的消息。應(yīng)用程序一般包含有自己的消息隊列,系統(tǒng)將消息發(fā)送到應(yīng)用程序的消息隊列中。應(yīng)用程序可以建立一個循環(huán),在這個循環(huán)中讀取消息并處理消息,一直處理到特定的消息傳來為止。這樣的循環(huán)稱為消息循環(huán)。一般地,消息由代表消息的一個整型數(shù)和消息的附加參數(shù)組成。例如,鼠標(biāo)左鍵的按下消息,可能由133這個數(shù)來表示,其附加參數(shù)可能包含按下時的鼠標(biāo)所在位置信息。例如,MiniGUI中如下定義消息:typedef struct HWND hwnd; int message; WPARAM wParam; LPARAM lParam; .MSG;message 指定了特定的消息類型,wParam 是以unsigned int類型定義的消息的短參數(shù),lParam 是以 long 類型定義的消息長參數(shù)。應(yīng)用程序一般要提供一個處理消息的標(biāo)準(zhǔn)函數(shù)。在消息循環(huán)中,系統(tǒng)可以調(diào)用此函數(shù),應(yīng)用程序在此函數(shù)中處理相應(yīng)消息。圖 1.2是一個消息驅(qū)動的應(yīng)用程序的簡單構(gòu)架示意。圖 1.2 消息驅(qū)動的應(yīng)用程序的簡單構(gòu)架在 MiniGUI 中,消息分為如下幾種類型: 系統(tǒng)消息,為系統(tǒng)內(nèi)部管理使用。 鼠標(biāo)消息,鼠標(biāo)的點擊、移動等產(chǎn)生的消息。 鍵盤消息,鍵盤的按鍵消息。 窗口消息,窗口管理消息。 菜單消息,菜單管理消息。 命令消息等。1.3 窗口過程和窗口類窗口過程是用來處理窗口消息的函數(shù)過程。對于同一類型的控件,其窗口過程一般是一樣的。因此,系統(tǒng)一般利用窗口的窗口類名來區(qū)分不同的窗口類并調(diào)用不同的窗口過程。由于幾乎每一個主窗口均和其他窗口有著不同的窗口過程,因此,在 MiniGUI 中,窗口類的概念只存在于控件和窗片中。對于主窗口來說,其窗口過程在建立主窗口時指定,而對控件和窗片來說,則在注冊窗口類時指定,而在建立窗片或控件時指定所屬窗口類。1.4 句柄句柄是 MiniGUI 用來標(biāo)識對象的標(biāo)識符。句柄和指針概念類似,但它不一定是指針值。利用句柄,MiniGUI 將系統(tǒng)變量從應(yīng)用項目中分離了出來,因為程序員只能通過句柄訪問對象,因而就沒有利用指針是可能發(fā)生的因非法訪問而導(dǎo)致的數(shù)據(jù)不一致問題。在 MiniGUI 中,窗口、控件、設(shè)備環(huán)境、菜單、圖標(biāo)等均使用句柄訪問。二、窗口2.1 應(yīng)用程序和主窗口我們將基于 MiniGUI 的一個會話(session)稱為一個應(yīng)用項目,而其中每個單獨的線程或線程組稱為應(yīng)用。每個應(yīng)用項目可建立多個應(yīng)用。主窗口是建立在 MiniGUI 基礎(chǔ)上的應(yīng)用的主界面。MiniGUI 為每個主窗口建立單獨的消息隊列,在該主窗口基礎(chǔ)上派生出的窗片、對話框及其控件均使用同一消息隊列。在 MiniGUI 中,每個應(yīng)用對應(yīng)于一個線程。理論上講,每個應(yīng)用可以具備多個主窗口,但在 MiniGUI 中,主窗口均以單獨的線程實現(xiàn)。但多個主窗口對應(yīng)單一線程的情況也是可以在 MiniGUI 中實現(xiàn)的。每個應(yīng)用項目有一個 MiniGUIMain 函數(shù),在這個函數(shù)中,可建立初始的應(yīng)用線程。在調(diào)用 MiniGUIMain 之前,MiniGUI 啟動自己的桌面窗口(Desktop)。桌面窗口作為 MiniGUI 的窗口管理器而存在。下面的代碼段在 MiniGUIMain 中啟動了三個主窗口線程:int MiniGUIMain(int args, char* arg) pthread_t thread, thread2, thread3; CreateThreadForMainWindow(&thread, NULL, TestWindowMain, 0); CreateThreadForMainWindow(&thread2, NULL, TestWindowMain2, 0); CreateThreadForMainWindow(&thread3, NULL, TestWindowMain3, 0); return 0;CreateThreadForMainWindow 函數(shù)為主窗口建立線程,并返回線程標(biāo)識符。其中的第三個參數(shù)是線程的入口函數(shù)地址。如下的代碼段定義了上述代碼中第一個主窗口線程的入口函數(shù):void InitCreateInfo(PMAINWINCREATE pCreateInfo) pCreateInfo-dwStyle = WS_THICKFRAME; pCreateInfo-spCaption = The first main window ; pCreateInfo-hMenu = 0; pCreateInfo-hCursor = GetSystemCursor(2); pCreateInfo-hIcon = LoadIconFromFile(res/table.ico); pCreateInfo-MainWindowProc = TestMainWinProc; pCreateInfo-lx = 50; pCreateInfo-ty = 50; pCreateInfo-rx = 300; pCreateInfo-by = 480; pCreateInfo-iBkColor = COLOR_lightwhite; pCreateInfo-dwAddData1 = 0; pCreateInfo-dwAddData2 = 0;void* TestWindowMain(void* data) MSG Msg; MAINWINCREATE CreateInfo; HWND hMainWnd; InitCreateInfo(&CreateInfo); if( !(hMainWnd = CreateMainWindow(&CreateInfo) ) return NULL; ShowWindow(hMainWnd, SW_SHOWNORMAL); while( GetMessage(&Msg, hMainWnd) ) DispatchMessage(&Msg); MainWindowThreadCleanup(hMainWnd); return NULL;在上面的代碼段中,該線程首先調(diào)用 CreateMainWindow建立了主窗口,然后調(diào)用 ShowWindow顯示了主窗口,最后啟動了消息循環(huán)。當(dāng)消息循環(huán)因為接收到 MSG_QUIT 消息而終止時,該函數(shù)調(diào)用了 MainWindowThreadCleanup 清除了相關(guān)的線程數(shù)據(jù)。從上述代碼中可看出主函數(shù)不支持窗口類,在調(diào)用 CreateMainWindow 函數(shù)時直接指定主窗口的窗口過程地址。我們也可以從中看到主窗口所支持的其他屬性:1窗口風(fēng)格。表 2.1 給出了所支持的窗口風(fēng)格表 2.1 MiniGUI 支持的主窗口風(fēng)格風(fēng)格描述WS_BORDER創(chuàng)建一個具有單線邊框的窗口WS_THICKFRAME創(chuàng)建一個具有寬邊框的窗口WS_THINFRAME創(chuàng)建一個具有細(xì)邊框的窗口WS_CAPTION創(chuàng)建一個具有標(biāo)題欄的窗口WS_HSCROLL創(chuàng)建一個具有水平滾動條的窗口WS_MAXMIZEBOX創(chuàng)建一個具有最大化框的窗口WS_MINIMIZEBOX創(chuàng)建一個具有最小化框的窗口WS_SYSMENU創(chuàng)建一個具有系統(tǒng)菜單的窗口WS_VSCROLL創(chuàng)建一個具有垂直滾動條的窗口WS_DISABLED創(chuàng)建一個初始為禁止的窗口WS_MAXIMIZE創(chuàng)建一個初始最大化的窗口WS_MINIMIZE創(chuàng)建一個初始最小化的窗口WS_VISIBLE創(chuàng)建一個初始可見的窗口WS_EX_TOPMOST創(chuàng)建一個頂層窗口,這是一個 Win32 的擴展風(fēng)格2窗口標(biāo)題。3窗口菜單。4窗口圖標(biāo)。5窗口背景色。2.2 主窗口過程主窗口過程實際是一個回調(diào)函數(shù),一般由 DispatchMessage 函數(shù)調(diào)用,用來處理應(yīng)用的消息。主窗口過程一般如下定義:int TestMainWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) HDC hdc; int x, y; RECT client; static BITMAP bitmap; static BOOL fValid = FALSE; static int paintCount = 0; switch (message) case MSG_CREATE: SetTimer (hWnd, 100, 20); if(LoadBitmap(&bitmap, res/mnls.bmp) 0) fprintf (stderr, Test Main Win: Loading bitmap failure!n); else fValid = TRUE; break; case MSG_PAINT: hdc = BeginPaint (hWnd); testdc (hdc, fValid?&bitmap:NULL); EndPaint (hWnd, hdc); break; case MSG_LBUTTONDBLCLK: hdc = GetClientDC (hWnd); TextOut(hdc, 0, 0, Left button double clicked); ReleaseDC (hdc); PostMessage (hWnd, MSG_CLOSE, 0, 0); return 0; case MSG_TIMER: if (ISINBACKGROUND) break; paintCount+; if (paintCount % 10 != 0) hdc = GetClientDC (hWnd); GetClientRect (hWnd, &client); x = random() % (RECTW (client); y = random() % (RECTH (client); SetBrushColor(hdc, RGB2Index (hdc, random() % 256, random() % 256, random() % 256); FillBox(hdc, x, y, random() % RECTW (client), random() % RECTH (client); ReleaseDC (hdc); else InvalidateRect (hWnd, NULL, FALSE); break; case MSG_CLOSE: KillTimer (hWnd, 100); UnloadBitmap (&bitmap); DestroyMainWindow (hWnd); PostQuitMessage (hWnd); return 0; return DefaultMainWinProc(hWnd, message, wParam, lParam);主窗口有四個入口參數(shù),分別是消息的目標(biāo)窗口句柄、消息、消息的 WPARAM (即unsigned int) 型參數(shù)和 LPARAM (即long int) 型參數(shù)。在 32 位系統(tǒng)中,消息的兩個參數(shù)實際是等長度的。主窗口的窗口過程處理應(yīng)用感興趣的消息,將其他消息傳遞給 DefaultMainWindProc 函數(shù)處理。2.3 桌面的應(yīng)用項目接口當(dāng)用戶在桌面上單擊鼠標(biāo)右鍵時可彈出浮動式菜單,應(yīng)用項目可通過桌面提供的接口在該菜單中添加菜單項,從而提供一定的靈活性。要利用桌面的應(yīng)用項目接口,應(yīng)用項目要實施兩個函數(shù):void CustomizeDesktopMenu (HMENU hmnu, int iPos);int CustomDesktopCommand (int id);通過 CustomizeDesktopMenu 函數(shù),應(yīng)用項目可在桌面的浮動式菜單中添加菜單及菜單項。當(dāng)用戶選擇了定制的菜單項時,MiniGUI 將調(diào)用 CustomDesktopCommand 函數(shù),這時,應(yīng)用項目就可以處理該菜單命令。2.4 對話框和控件對話框?qū)嶋H是一種特殊的主窗口。一般而言,對話框中包含有許多系統(tǒng)提供的控件。對話框和控件的設(shè)計目標(biāo)是提供和 Win32 在源代碼級上的完全兼容。但某些復(fù)雜的控件不打算支持,對話框頁也不支持。MiniGUI 支持的控件有: 靜態(tài)控件。 按鈕控件。 編輯控件。 列表控件。 滾動條控件。 組合框控件。同時,MiniGUI 將提供標(biāo)準(zhǔn)的公共對話框: 文件打開對話框。 文件保存對話框。2.6 消息框MiniGUI 將提供和 Win32 完全兼容的消息框調(diào)用接口。2.6 窗片窗片是主窗口中子窗口的簡化支持,為了避免子窗口之間的互相剪切,而采用了平鋪式的子窗口實現(xiàn),不考慮子窗口的互相剪切,因而也就不提供多文檔接口。也因為這個原因,我們將這種子窗口稱為窗片或窗格。窗片的建立和控件的建立方法一致。2.7 滾動支持將提供和 Win32 完全兼容的主窗口或子窗口的滾動支持。三、對話框、窗片和控件該部分功能尚未實現(xiàn),其目標(biāo)是提供和 WIN32 的80% 兼容。需要提供的接口分為如下幾類(注,我們將窗片和控件統(tǒng)稱為窗口,并嚴(yán)格區(qū)分“主窗口”和“窗口”這兩個名詞): 窗口類的注冊和注銷。 窗口的創(chuàng)建和銷毀。 對話框和控件管理。 常見控件消息、操作接口等的實現(xiàn)。四、消息及消息隊列在 MiniGUI 中,基本實現(xiàn)了 Win32 的消息處理函數(shù)。消息可通過如下函數(shù)發(fā)送: 通過 PostMessage 發(fā)送。消息發(fā)送到消息隊列后立即返回。這種發(fā)送方式稱為“郵寄”消息。如果消息隊列中的郵寄消息緩沖區(qū)滿,則該函數(shù)返回錯誤值。 通過 PostSyncMessage 發(fā)送。該函數(shù)用來向不同于調(diào)用該函數(shù)的線程消息隊列郵寄消息,并且只有該消息被處理之后,該函數(shù)才能返回,因此這種消息稱為“同步消息”。 通過 SendMessage 發(fā)送。該函數(shù)可以向任意一個窗口發(fā)送消息,消息處理完成之后,該函數(shù)返回。如果目標(biāo)窗口所在線程和調(diào)用線程是同一個線程,該函數(shù)直接調(diào)用窗口過程,如果處于不同的線程,則利用 PostSyncMessage 函數(shù)發(fā)送同步消息。 通過 SendNotifyMessage 發(fā)送。該函數(shù)向指定的窗口發(fā)送通知消息,將消息放入消息隊列后立即返回。由于這種消息和郵寄消息不同,是不允許丟失的,因此,系統(tǒng)以鏈表的形式處理這種消息。 通過 SendAsyncMessage 發(fā)送。利用該函數(shù)發(fā)送的消息稱為“異步消息”,系統(tǒng)直接調(diào)用目標(biāo)窗口的窗口過程。五、圖形設(shè)備接口圖形設(shè)備接口,即GDI, MiniGUI 中用來實現(xiàn)圖形輸出的模塊。5.1 基本概念5.1.1 圖形設(shè)備在 MiniGUI 中,采用了在 Windows 和 X Window 中普遍采用的圖形設(shè)備概念。每個圖形設(shè)備定義了計算機顯示屏幕上的一個矩形輸出區(qū)域。在調(diào)用圖形輸出函數(shù)時,均要求指定經(jīng)初始化,或經(jīng)建立的圖形設(shè)備上下文,或設(shè)備環(huán)境(DC)。每個圖形輸出均局限在圖形設(shè)備指定的矩形區(qū)域內(nèi)。在多窗口系統(tǒng)中,各個圖形設(shè)備之間的輸出互相剪切,以避免圖形輸出之間互相影響。5.1.2 剪切域 剪切域就是在圖形設(shè)備上定義的一個區(qū)域,所有在該圖形設(shè)備上進行的圖形輸出,超過剪切域的部分,均被裁剪。只有在剪切域上的圖形輸出才是可見的輸出。 MiniGUI 中的剪切域,定義為矩形剪切域的集合。5.1.3 映射模式映射模式指定了特定圖形輸出的坐標(biāo)值如何映射到圖形設(shè)備的坐標(biāo)值。圖形設(shè)備的坐標(biāo)系原點定義為圖形設(shè)備矩形區(qū)域的左上角。向右為正 X 坐標(biāo)軸方向;向下為正 Y 坐標(biāo)軸方向。這一坐標(biāo)系稱為設(shè)備坐標(biāo)系。 通過 GDI 模塊的映射模式操作函數(shù),可定義自己的邏輯坐標(biāo)系。邏輯坐標(biāo)系可以是設(shè)備坐標(biāo)系的水平或垂直反轉(zhuǎn),縮放,或者偏移。 多數(shù) GDI 輸出函數(shù)指定的是邏輯坐標(biāo)系。默認(rèn)情況下,邏輯坐標(biāo)系和設(shè)備坐標(biāo)系是重合的。5.2 GDI 功能特性的分類說明5.2.1 圖形設(shè)備能力通過調(diào)用函數(shù)GetGDCapability,可獲得圖形設(shè)備的如下能力: 顏色數(shù)目; 水平和豎直方向的象素點數(shù); 設(shè)備坐標(biāo)系中可見點的最大 x 和 y 坐標(biāo)值。5.2.2 創(chuàng)建、銷毀或獲取、釋放圖形設(shè)備接口和 Win32 類似,MiniGUI 中也有一個 DC 的緩沖區(qū),應(yīng)用可調(diào)用 GetDC 或 GetClientDC 函數(shù)從 DC 緩沖區(qū)中獲取圖形設(shè)備環(huán)境,在結(jié)束使用 DC 之后,應(yīng)當(dāng)調(diào)用 ReleaseDC 函數(shù)釋放 DC。應(yīng)用也可以建立自己私有的 DC,這種 DC 可以是全局有效的 DC,由于免除了獲取和釋放以及初始化等工作,因此,利用這種 DC 可加速圖形顯示。當(dāng)應(yīng)用不再使用私有 DC 時,應(yīng)當(dāng)利用 DeletePrivateDC 刪除私有 DC。下面的代碼即利用了這種 DC:int TestMainWinProc2(HWND hWnd, int message, WPARAM wParam, LPARAM lParam) static HDC hdc; HDC hPaintDC; int x, y; RECT client; static int count = 0; static BITMAP bitmap; static BOOL fValid = FALSE; static int paintCount = 0; switch (message) case MSG_CREATE: SetTimer (hWnd, 100, 20); SetTimer (hWnd, 200, 5); if(LoadBitmap(&bitmap, res/j11b.BMP) 0) fprintf (stderr, Test Main Win: Loading bitmap failure!n); else fValid = TRUE; break; case MSG_SHOWWINDOW: if (wParam = SW_SHOWNORMAL) hdc = CreatePrivateClientDC (hWnd); break; case MSG_PAINT: hPaintDC = BeginPaint (hWnd); testdc (hPaintDC, fValid?&bitmap:NULL); EndPaint (hWnd, hPaintDC); break; case MSG_LBUTTONDBLCLK: return 0; case MSG_TIMER: if (ISINBACKGROUND) break; if (wParam = 100) paintCount +; if (paintCount % 10 != 0) GetClientRect (hWnd, &client); x = random() % (RECTW (client); y = random() % (RECTH (client); SetPenColor(hdc, RGB2Index (hdc, random() % 256, random() % 256, random() % 256); LineTo(hdc, x, y); else InvalidateRect (hWnd, NULL, TRUE); else if (wParam = 200) if (count 5) Ping (); count +; else KillTimer (hWnd, 200); break; case MSG_CLOSE: KillTimer (hWnd, 100); KillTimer (hWnd, 200); UnloadBitmap (&bitmap); DeletePrivateDC (hdc); DestroyMainWindow (hWnd); PostQuitMessage (hWnd); return 0; return DefaultMainWinProc(hWnd, message, wParam, lParam);上述代碼在應(yīng)用主窗口建立時創(chuàng)建了私有 DC,然后在定時器消息中利用私有 DC 進行繪制,最后在關(guān)閉窗口時刪除了私有 DC。MiniGUI 也支持內(nèi)存中的虛擬 DC,可通過CreateCompatibleDC 建立內(nèi)存 DC,利用這種 DC,可加速繪制過程,并減少繪制過程中閃爍現(xiàn)象。應(yīng)用可使用DeleteCompatibleDC 函數(shù)刪除內(nèi)存 DC。上述 DC 的創(chuàng)建或獲取與 Win32 API 有較明顯的不同。5.2.3 一般繪制屬性這類功能用來設(shè)置 DC 的繪制屬性,這些屬性及其影響的繪圖操作在表 5.1 中列出。表 5.1 一般繪圖屬性繪制屬性所影響的繪圖操作備注背景色文本輸出GetBkColor, SetBkColor背景模式文本輸出GetBkMode, SetBkMode文本顏色文本輸出GetTextColor, SetTextColor畫筆類型線條輸出只支持實型畫筆GetPenType, SetPenType畫筆顏色線條輸出GetPenColor, SetPenColor畫刷類型填充操作只支持實型畫刷GetBrushType, SetBrushType畫刷顏色填充操作GetBrushColor, SetBrushColor5.2.4 一般繪圖支持這類功能用來完成基本的繪圖功能,這些功能包括:畫點、直線、圓、矩形等。另外還有一些顏色轉(zhuǎn)換方面的功能,可以將特定的 RGB 轉(zhuǎn)換為最接近的 256 色調(diào)色板中的顏色索引值。接口函數(shù)由表 5.2 給出。表 5.2 一般繪圖支持函數(shù)功能說明SetPixel設(shè)置指定的象素顏色,顏色值以調(diào)色板索引給出。SetPixelRGB設(shè)置指定的象素顏色,顏色值以 RGB 值給出。GetPixel獲取指定點的象素顏色,以調(diào)色板索引給出。GetPixelRGB獲取指定點的象素顏色,以 RGB 值給出。RGB2Index完成 RGB 值到調(diào)色板索引值的轉(zhuǎn)換。MoveTo, LineTo繪制直線。Circle繪制圓。Rectangle繪制矩形。5.2.5 文本輸出支持這類功能用來利用系統(tǒng)字體輸出文本??蓪崿F(xiàn)無格式文本(TextOut)和有格式文本(TabbedTextOut)的輸出。作為輔助函數(shù),應(yīng)用還可以利用GetTabbedTextExtent 函數(shù)來獲得格式化文本字符串的輸出尺寸。由于系統(tǒng)字體是等寬字體,無格式文本的輸出長度就等于單字節(jié)字符串個數(shù)乘以單個字符的寬度。利用 GetCharWidth 以及 GetCCharWidth 可獲取單字節(jié)字符以及雙字節(jié)字符(漢字)的寬度;利用 GetCharHeight 可獲取字符的高度。5.2.6 映射函數(shù)支持MiniGUI 支持的映射方式有兩種,一種和 Win32 的 MM_TEXT 映射方式一樣,即設(shè)備坐標(biāo)系和邏輯坐標(biāo)系是一致的;一種和 Win32 的MM_ANISOTROPIC 映射方式一樣,邏輯 x 和 y 軸可以以任意的比例映射到對應(yīng)的坐標(biāo)軸上。其他的 Win32 映射方式不被支持。通過函數(shù) SetMapMode 設(shè)定映射方式。利用 SetWindowExt和 SetViewportExt 可設(shè)置 MM_ANISOTROPIC 映射方式的坐標(biāo)軸方向、比例等。利用SetWindowOrg 和 SetViewPortOrg 可以設(shè)定原點位置。和上述函數(shù)的對應(yīng)的 Get 函數(shù)組可用來獲取設(shè)定值。5.2.7 坐標(biāo)轉(zhuǎn)換這類函數(shù)用來實現(xiàn)設(shè)備坐標(biāo)到邏輯坐標(biāo)的轉(zhuǎn)換。DPtoLP 將設(shè)備坐標(biāo)轉(zhuǎn)換為邏輯坐標(biāo),LPtoDP 將邏輯坐標(biāo)轉(zhuǎn)換為設(shè)備坐標(biāo)。 5.2.8 剪切支持這類函數(shù)用來實現(xiàn)對 DC 剪切域的操作。和 Win32 不同的是,MiniGUI 的剪切域只支持矩形剪切域。ExcludeClipRect 可用來在當(dāng)前剪切域中排除指定的矩形區(qū)域。IncludeClipRect 可用來在當(dāng)前剪切域中包含指定的矩形區(qū)域。 CliprectIntersect 可用來將當(dāng)前剪切域和指定矩形相交。SelectClipRect 將剪切域設(shè)置為指定矩形。GetBoundsRect 獲取包含當(dāng)前剪切域的最大矩形。PtVisible 可判斷給定點是否處于剪切域。RectVisible 可判斷給定矩形是否和剪切域相交。5.2.9 位圖支持這類函數(shù)用來實現(xiàn)填充操作。利用 FillBox 可以以當(dāng)前的畫刷類型和顏色填充指定矩形。利用 FillBoxWithBitmap 可以用指定的位圖填充指定矩形,如果有需要,該函數(shù)可進行位圖的縮放。利用 BitBlt 函數(shù)可在兩個 DC 之間復(fù)制圖象。利用 StretchBlt 函數(shù)可兩個 DC 之間復(fù)制圖象,并完成縮放。利用函數(shù) LoadBitmap 可從Windows BMP文件中裝入位圖信息。UnloadBitmap 則卸載位圖信息。5.2.10 圖標(biāo)支持MiniGUI 的圖標(biāo)支持和 Win32 API 大致相同,包含如下幾種操作:創(chuàng)建和銷毀圖標(biāo):LoadIconFromFile、CreateIcon、DestroyIcon。圖標(biāo)繪制支持:DrawIcon。根據(jù)需要 MiniGUI 將提供系統(tǒng)圖標(biāo)集,及相應(yīng)的操作函數(shù)。5.2.11 矩形支持這類函數(shù)提供了實現(xiàn)矩形相交,合并等一般性的操作,達到 Win32 的 95% 兼容。下面是這些函數(shù)的說明。1) SetRectvoid GUIAPI SetRect(RECT* prc, int left, int top, int right, int bottom);該函數(shù)將矩形 prc 設(shè)定為參數(shù) left, top, right, bottom 指定的大小。2) SetRectEmptyvoid GUIAPI SetRectEmpty(RECT* prc);該函數(shù)將矩形 prc 設(shè)置為空矩形. 空矩形就是面積為 0 的矩形. 該函數(shù)將矩形的 left, top, right, bottom 值均設(shè)置為 0。3) CopyRectvoid GUIAPI CopyRect(RECT* pdrc, const RECT* psrc);該函數(shù)將矩形 psrc 復(fù)制到 pdrc 中。4) IsRectEmptyBOOL GUIAPI IsRectEmpty(const RECT* PRC);該函數(shù)判斷指定矩形是否為空矩形。若為空矩形,則函數(shù)返回 TRUE,否則返回 FALSE。5) EqualRectBOOL GUIAPI EqualRect(const RECT* prc1, const RECT* prc2);該函數(shù)判斷指定的兩個矩形是否是相等的矩形。相等的矩形其 left, top, right, bottom 值均相等。6) NormalizeRectvoid GUIAPI NormalizeRect(RECT* pRect);該函數(shù)將指定的矩形 pRect 進行正規(guī)化處理。矩形的正規(guī)化指滿足如下條件的矩形:left = right 并且 top = bottom。7) IntersectRectBOOL GUIAPI IntersectRect(RECT* pdrc, const RECT* psrc1, const RECT* psrc2);該函數(shù)求兩個矩形 psrc1 和 psrc2 的相交區(qū)域, 并在 pdrc 中返回相交矩形。如果 psrc1 和 psrc2 相交,函數(shù)返回為 TRUE。如果 psrc1 和 psrc2 不相交,函數(shù)返回為 FALSE,pdrc 為空矩形8) DoesIntersectBOOL GUIAPI DoesIntersect(const RECT* psrc1, const RECT* psrc2);該函數(shù)判斷兩個矩形是否相交。如果 psrc1 和 psrc2 相交,函數(shù)返回為 TRUE。如果 psrc1 和 psrc2 不相交,函數(shù)返回為 FALSE。9) UnionRectBOOL GUIAPI UnionRect(RECT* pdrc, const RECT* psrc1, const RECT* psrc2);該函數(shù)求兩個矩形 psrc1 和 psrc2 相并矩形,并在 pdrc 中返回相并矩形。如果 psrc1 和 psrc2 能夠進行相并操作,函數(shù)返回 TRUE。如果 psrc1 和 psrc2 不能進行相并操作,函數(shù)返回 FALSE,pdrc 為空矩形。10) SubtractRectBOOL GUIAPI SubtractREct(RECT* pdrc, const RECT* psrc1, const RECT* psrc2);該函數(shù)求兩個矩形 psrc1 和 psrc2 相減的矩形, 并在 pdrc 中返回結(jié)果矩形。如果 psrc1 和 psrc2 能夠進行相減操作, 函數(shù)返回 TRUE。如果 psrc1 和 psrc2 不能進行相減操作,函數(shù)返回 FALSE,pdrc 為空矩形。11) OffsetRectvoid GUIAPI OffsetRect(RECT* prc, int x, int y);該函數(shù)將矩形 prc 偏移指定的偏移量 x, y。12) InflateRectvoid GUIAPI InflateRect(RECT* prc, int cx, int cy);該函數(shù)將矩形 prc 的長和寬分別增加 cx 和 cy。13) PtInRectBOOL GUIAPI PtInRect(const RECT* prc, int x, int y);該函數(shù)判斷指定點(x, y)是否處于矩形 prc 中。如果指定點在矩形中,函數(shù)返回 TRUE;否則返回 FALSE。六、菜單MiniGUI 中的菜單接口和 Win32 90% 兼容,但有少許差別。在外觀上,MiniGUI 可為彈出式菜單定義一個菜單標(biāo)題,可支持空的彈出式菜單;在內(nèi)部結(jié)構(gòu)和概念上也有一些小的差別。主要區(qū)別在于子菜單的定義上,子菜單即可以是一個完整的彈出式菜單,也可以是一個沒有彈出式菜單標(biāo)題的子菜單。從另一個角度講,彈出式菜單是由標(biāo)題以及一系列子菜單項組成的。MiniGUI 提供用來操作菜單的函數(shù)有:HMENU GUIAPI CreateMenu ();HMENU GUIAPI CreatePopupMenu ( PMENUITEMINFO pmii);HMENU GUIAPI CreateSystemMenu ();int GUIAPI InsertMenuItem (HMENU hmnu, int item, BOOL flag, PMENUITEMINFO pmii);int GUIAPI RemoveMenu (HMENU hmnu, int item, UINT flags);int GUIAPI DeleteMenu (HMENU hmnu, int item, UINT flags);int GUIAPI DestroyMenu (HMENU hmnu);上述這些函數(shù)用來操作菜單數(shù)據(jù),可實現(xiàn)菜單的創(chuàng)建、銷毀,菜單項的添加、刪除等功能。int GUIAPI IsMenu (HMENU hmnu);該函數(shù)可用來判斷給定句柄是否為菜單句柄。HMENU GUIAPI SetMenu (HWND hwnd, HMENU hmnu);HMENU GUIAPI GetMenu (HWND hwnd);上述函數(shù)用于獲取或設(shè)置主窗口的菜單。void GUIAPI DrawMenuBar (HWND hwnd);int GUIAPI TrackMenuBar (HWND hwnd, int pos);int GUIAPI TrackPopupMenu (HMENU hmnu, UINT uFlags, int x, int y, HWND hwnd;HMENU GUIAPI GetMenuBarItemRect (HWND hwnd, int pos, RECT* prc);BOOL GUIAPI HiliteMenuBarItem (HWND hwnd, int pos, UINT flag);上述函數(shù)用于顯示并跟蹤菜單。int GUIAPI GetMenuItemCount (HMENU hmnu);int GUIAPI GetMenuItemID (HMENU hmnu, int pos); int GUIAPI GetMenuItemInfo (HMENU hmnu, int item, BOOL flag, PMENUITEMINFO pmii);int GUIAPI GetMenuItemRect (HWND hwnd, HMENU hmnu, int item, PRECT prc);HMENU GUIAPI GetPopupSubMenu (HMENU hpppmnu);HMENU GUIAPI GetSubMenu (HMENU hmnu, int pos);int GUIAPI GetSystemMenu (HWND hwnd, BOOL flag);UINT GUIAPI EnableMenuItem (HMENU hmnu, int item, UINT flags);int GUIAPI CheckMenuRadioItem (HMENU hmnu, int first, int last, int checkitem, UINT flags);int GUIAPI SetMenuItemBitmaps (HMENU hmnu, int item, UINT flags, PBITMAP hBmpUnchecked, PBITMAP hBmpChecked);int GUIAPI SetMenuItemInfo (HMENU hmnu, int item, BOOL flag, PMENUITEMINFO pmii);上述這些函數(shù)用于獲取或設(shè)置菜單屬性。七、定時器在 MiniGUI 中應(yīng)用項目可用的定時器總共可有 16 個,而每個應(yīng)用最多只能定義 8 個定時器。MiniGUI 中的定時器和 Win32 中使用定時器的方法是一樣的,但不支持定時器回調(diào)函數(shù)。MiniGUI 提供來操

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論