18、Windows API 圖形化使用者介面(2)

來源:互聯網
上載者:User

一、基本概念

1、Windows系統是訊息(Message)驅動的。當使用者操作輸入裝置,產生硬體中斷後,系統核心會得到這此硬體中斷,硬體在系統中經過複雜的運算和處理最終變成訊息。訊息被系統發送給指定視窗。

    所有的對使用者介面的操作都會產生訊息,包括按一下滑鼠、按鈕、菜單選擇、視窗建立、視窗移動等。

在建立視窗時,需指定視窗所屬的視窗類別,每一個視窗類別都對應一個訊息處理函數,因此每一個視窗都具有自己的訊息處理函數。訊息處理函數是一個回調(Call Back)函數,由系統調用。

應用程式向系統註冊了視窗類別,建立了視窗,系統在訊息產生後,需要視窗訊息處理函數來處理時,調用視窗所對應的訊息處理函數。

並不是只有使用者的輸入才會產生訊息。一些隨機發生的事件也會產生訊息,如系統關機、外設插入、計時器計時到達等。

2、常用控制項類型

◇文字框(Edit、Rich Edit等);

◇按鈕(Button,包括Check Boxes、Group Boxes、Push Buttons、Radio Buttons);

◇下拉式功能表(ComboBox);

◇列表框(List Box);

◇分組列表( List View);

◇分頁(Pager);

◇進度條(Process Bar);

◇屬性頁面(Property Sheet);

◇工作條(ToolBar);

◇樹(Tree View)

    控制項實際是一種特殊的視窗。每一種控制項有固定的樣式、訊息處理過程等,系統將這此屬性做了固定的模式化的處理,並提前註冊為視窗類別。

這些控制項在程式設計時不用再重新註冊,也不用再去定義其訊息處理函數、介面樣式、視窗大小等,可以直接使用。

在程式使用控制項前,最好先調用InitCommonControls以保證調用控制項所需使用的動態連結程式庫被載入。[1,P258]

3、資源是應用程式在運行中可能會使用到的一些資料。資源套件括表徵圖、位元影像、菜單等。在程式設計時,在資源指令碼(.rc)中配置資源,在程式構建時,資源編譯器會將資源編譯為資源檔(.res),然後由連結器將資源連結到可執行檔中。

4、對話方塊是一種臨時視窗,一般用來顯示資訊、擷取使用者的輸入等。但對話方塊又是一種特殊的視窗,可以通過資源來建立對話方塊,對話方塊及對話方塊上所顯有的控制項都可以在資源指令碼中配置,而視窗不可以。對話方塊具有所屬視窗,在對話方塊處理完成,關閉之前,擁有對話方塊的視窗不能進行操作。

二、視窗

1、常見的視窗訊息

2、DefWindowProc

    DefWindowProc是一個API函數。

    視窗會收到很多訊息,但是這些訊息訊息處理函數不一定需要處理,有些訊息可能直接讓系統來處理。DefWindowProc的作用是處理視窗訊息處理函數沒有處理完、或者不需要處理的函數。

實際上很多程式員沒有關注的訊息都是由DefWindowProc來處理的。如果在訊息處理函數中不把訊息交給DefWindowProc處理,那麼對視窗的動作幾乎不會有響應,包括移動視窗、關閉視窗等,甚至有很多視窗樣式不能顯示。

一般情況下,除非程式員確定一個訊息不再需要DefWindowProc來處理,那麼最好將不需要的訊息統一交由DefWindowProc函數來處理。

3、訊息迴圈

GetMessage是從其所在的線程的訊息佇列中得到一條訊息。在TranslateMessage函數對訊息進行轉換後,DispatchMessage將訊息發送到訊息處理函數,通常用於分配GetMessage函數獲得的訊息。

Windows系統為每一個線程建立訊息佇列,從訊息佇列中擷取訊息使用GetMessage函數;也可以調用API函數將訊息添加到訊息佇列中。PostMessage與SendMessage不同的是,PostMessage只是將訊息放置線上程的訊息佇列之後便立即返回,而SendMessage是直接將訊息交給視窗訊息處理函數。PostQuitMessage函數將WM_QUIT訊息放置在訊息佇列中,GetMessage函數在獲得了WM_QUIT訊息後,會返回0,退出訊息迴圈。

注意的是,GetMessage只是擷取了其所在的線程的訊息池中的訊息。在開發多線程的圖形化使用者介面程式時,將所有的視窗建立設定在同一個線程中,子視窗的建立最好在主視窗的訊息處理函數中,這樣能保證訊息都集中在同一個線程,如果在其他線程中需要操作介面,可以直接使用PostThreadMessage,SendMessage等函數向視窗發送自訂的訊息,然後再在視窗訊息處理函數中處理這些自訂的視窗訊息時進行視窗操作。

4、資源及其檔案的編寫[1,P269]

►關於視窗的講解,可以參見[1~3]等系列文章。

Windows[4]

Menus[5]

Dialog Boxes[6]

[1] 精通Windows API 函數、介面、編程執行個體

[2] http://blog.163.com/zhoumhan_0351/blog/static/3995422720103129131208/

[3] http://blog.163.com/zhoumhan_0351/blog/static/3995422720103401415721/

[4] http://msdn.microsoft.com/en-us/library/ms632595%28VS.85%29.aspx

[5] http://msdn.microsoft.com/en-us/library/ms647553%28VS.85%29.aspx

[6] http://msdn.microsoft.com/en-us/library/ms632588%28VS.85%29.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.