1. 程式人生 > >Win32視窗機制和訊息機制整體流程

Win32視窗機制和訊息機制整體流程

    Windows系統,是視窗作為基礎的系統,以訊息機制作為運轉機制的系統。我們學習Windows程式設計(Win32程式設計)也就必須先掌握這兩個根本機制即視窗機制和訊息機制。
    本節課結合一張Win32程式內部運作機制的整體流程圖,來講述整體的流程。

Windows視窗機制和Windows訊息機制

    我們本節課就是把這張圖講清楚。
    我們在WinMain函式中寫這個程式碼,也就是入口函式寫這個程式碼。在上一節課《Windows零基礎入門:2.6 Win32第一個程式和計時文字閃爍》有完整程式碼。我們的程式碼要完成的功能就是建立一個視窗,然後完成計時和閃爍的功能。
    Windows中視窗如何創建出來,可不是一個CreateWindow函式就簡單創建出來的。它經歷了很多。我們應該深入學習,而不只是用一個函式,去記這個函式那些引數。這樣學習是沒用的,會讓你始終不知所以然,總是摸不透。我們

C++技術網推出的這個課程,會深入淺出的帶你領略這般精彩。我相信,當你學完這些深入的背景知識後,即使你不用記住這些背景知識,有個印象,就足以讓你在日後使用這些函式時胸有成竹,而不是雲裡霧裡。我們的課程要讓你知道,是什麼,怎麼用,更重要的是為什麼!!
    Windows程式設計中,視窗機制部分和訊息機制,是最為根本的兩個技術點。我們這裡就來整體上都串通來介紹,讓你一開始就知道是怎麼一回事。
    以上那張圖,請仔細看幾遍,然後對照下面的介紹來理解。這個圖,沒有太多的標註,需要文章來解釋,一開始看不懂是正常的。
    我們以程式碼為主線來講解。我們的程式碼,就是WinMain中的程式碼,這些程式碼建立了一個視窗,同時有一些功能。這些程式碼在入口函式中。我們啟動一個程式,系統就建立一個程序。我們的exe沒有執行的時候,就是一個檔案而已。執行起來,系統給他在記憶體分配一些空間,這些記憶體就是程序的記憶體空間。這個程序就是在記憶體中執行的程式了。我們就把程序理解為我們的程式。而程序只是提供一個程式執行需要的記憶體空間以及相關的資源場所。這些記憶體空間和資源場所都是提供給程序的執行緒來使用的。
    打個比方,程序就像我們的家,執行緒就像家裡的成員。程式碼是線上程中執行的,因為執行緒的東西才會跑到CPU裡,程序就是一個場所,不會動的。而每一個程序至少有一個執行緒,就是主執行緒了。那麼我們的WinMain函式就是在主執行緒裡了。在上圖中,就顯示為主執行緒程式碼。途中只是一部分,實際上,視窗過程也在主執行緒中,我們這個程式就是一個執行緒的程式。這些程序執行緒的理論知識,請學習作業系統課程的程序部分。
    我們程式有了這個主執行緒,就可以執行程式碼了。
    1.註冊視窗類
,執行RegisterClass。必須要註冊視窗類,我們才能建立我們自己的視窗。實際上,視窗類有三種:系統視窗類、應用程式全域性視窗類和應用程式區域性視窗類
    系統視窗類中一部分是系統內部使用的,而另一部分是可以供系統所有程序使用的,這些視窗類就是基本的控制元件視窗類。後面會詳細介紹。
    應用程式全域性視窗類,就是註冊視窗類時以CS_GLOBALCLASS標誌註冊的視窗類,這個視窗類在這個程序中,所有模組都可以使用。模組一般是dll模組。我們知道的程式的面板庫,很多都是以這種形式實現的,dll中註冊的應用程式全域性視窗類,我們程式就可以直接使用這些漂亮的面板庫提供的控制元件了。
    應用程式區域性視窗類
則是沒有CS_GLOBALCLASS標誌註冊的視窗類,這個視窗類只在模組範圍內使用。我們的EXE如果載入了其他的dll模組,此時EXE的主執行緒註冊的應用程式區域性視窗類對於dll來說,是看不見的,也就不能使用這個區域性視窗類來建立視窗。
    如果你對dll這些不懂,也不要緊,只要知道它就是被載入到程序中的一個部件而已。就像你把冰箱放在了你的房子一樣。冰箱只能看到它冰箱內的東西和房子全域性的東西。
    RegisterClass函式在圖中的三個箭頭分支,表示他可以註冊應用程式全域性和區域性的視窗類,系統視窗類由系統來處理,不要我們來建立和銷燬。註冊視窗類其實就是在對應的視窗類表填寫一個視窗類的資訊而已,供建立視窗時查詢使用。
    2.建立視窗,執行CreateWindow。這個函式就是根據指定的視窗類來建立一個視窗。你可以指定為系統視窗類來建立標準的控制元件,比如按鈕控制元件,此時就不需要執行註冊,因為系統會自動幫我們註冊。只有我們要根據我們自己定製的視窗類建立視窗時,才需要先註冊視窗類。不管是建立標準控制元件還是你定製的視窗類,都是要去視窗類表查詢對應的視窗類資訊的。執行的順序就是:應用程式區域性視窗類 -> 應用程式全域性視窗類 -> 系統視窗類。也就是說,建立視窗就需要去按照這個順序查詢你指定的視窗類名稱,找到就不再往後查詢,否則就一直往後,如果最後都找不到,那麼建立視窗就會失敗。這個就是圖中標註了1,2,3箭頭的意思。
    3-4.顯示視窗。建立好視窗後,就要顯示它。執行的是ShowWindow和UpdateWindow函式。這個就是將視窗顯示出來。
    以上就是視窗的建立過程。視窗顯示後,我們要操作視窗,這就是訊息機制完成的。
    5.獲取訊息。一個視窗對應一個視窗的訊息佇列,佇列裡的訊息都是視窗的,視窗都要處理這些訊息的。處理了這些訊息,就實現了互動,實現了功能。在主執行緒函式中,GetMessage函式迴圈不斷地從訊息佇列不斷的獲取訊息,如果獲取到的訊息是WM_QUIT,迴圈就停止,也就意味著程式結束了。如果訊息佇列中沒有訊息了,系統會將這個程式掛起來,直到有訊息了,才喚醒它來處理訊息。
    6.獲取了訊息之後,要對訊息進行處理,有些訊息是原始訊息,直接無法處理,需要轉換一下。
    7.轉換成正確格式的訊息後,就要把訊息發給合適的地方來處理了。分發了這個訊息之後,就進入下一輪的獲取訊息,不斷迴圈。分發的路線就是先根據訊息裡的視窗控制代碼,找到視窗,然後去查詢這個視窗由哪個視窗類建立,找到視窗類後,就找到這個視窗類指定的視窗過程函式,這樣這個訊息就分發給這個視窗過程了。5-7三步構成的迴圈就是我們聽說的訊息迴圈了。
    而視窗過程中,就是通過switch來分類處理訊息,完成一些功能的。Win32程式的功能,都在這個視窗過程中完成。
    那麼最後一個問題,視窗訊息如何來的?
    我們視窗顯示之後,我們的單擊視窗、拖動視窗等,系統都會捕捉到我們的游標在視窗上面有動作,系統就識別出來了,然後就處理成標準的訊息,投遞到這個視窗的訊息佇列中。還有一種就是視窗過程處理訊息的過程中,為了完成一個複雜的功能,要做一系列的基本動作,只要有一個動作功能,就要產生一個新的訊息,這個訊息也會投遞到視窗訊息佇列中。其他的程序也可以向我們的視窗傳送訊息,進而實現程序間的通訊。
    以上就是整個視窗視窗機制和訊息機制的一個整體過程。更詳細的講解,請繼續學習後面的課程內容,這裡只是一個大概的流程結果,重在整體的流程邏輯,一些細節,可能有所忽略,也是讓整體流程更加的清晰。

相關推薦

Win32視窗機制訊息機制整體流程

    Windows系統,是視窗作為基礎的系統,以訊息機制作為運轉機制的系統。我們學習Windows程式設計(Win32程式設計)也就必須先掌握這兩個根本機制即視窗機制和訊息機制。     本節課結合一張Win32程式內部運作機制的整體流程圖,來講述整體的流程。     我們本節課就是把這張圖講清

Windows程式訊息機制(一):視窗程式的建立

Windows視窗程式的實現 上面介紹了Windows下的訊息機制,系統傳送訊息到程式,程式接收到訊息後的處理統稱為視窗過程。 要實現視窗過程當然需要先建立一個視窗程式了。視窗程式的建立很簡單,主要分為以下幾個步驟: 註冊視窗類建立視窗及顯示視窗建立訊

淺談Windows SDK視窗程式的訊息機制

Windows系統的訊息機制 一個庫函式(比如fopen),最終會呼叫作業系統的API來實現其功能,在Windows中,不僅庫函式最終會呼叫系統函式,系統函式反過來也會呼叫使用者函式,這種機制就是通過訊息來實現的。 我們假設程式發生了一項滑鼠點選“關閉”按鈕的操作,系統會發現這次操作,並將這次操作包裝成訊息

Windows程式訊息機制(三):訊息與程序間通訊

自定義訊息與程序間通訊 視窗程式可以接收自定義的訊息型別,前提是通訊的程序聲明瞭這種訊息型別,宣告的方法很簡單,WM_USER加一個值就可以了,一般加的值從0x400開始,其他的值已經被系統使用了。 實現一個完整的自定義訊息需要進行以下步驟:

Windows程式訊息機制(二):訊息有關的函式

不同視窗程式可以通過訊息進行互動,主要用到的函式如下: FindWindow 獲取一個視窗的控制代碼。 HWND FindWindow( LPCTSTR lpClassName,// 類名 LPCTSTR lpWindowName//

事件驅動機制訊息驅動機制

事件:按下滑鼠,按下鍵盤,按下游戲手柄,將U盤插入USB介面,都將產生事件。比如說按下滑鼠左鍵,將產生滑鼠左鍵被按下的事件。 訊息:當滑鼠被按下,產生了滑鼠按下事件,windows偵測到這一事件的發生,隨即發出滑鼠被按下的訊息到訊息佇列中,這訊息附帶了一系列相關的事件資訊,比如滑鼠哪個鍵被按

事件驅動機制訊息迴圈

http://www.qudong.com/soft/program/C/rumenjiaocheng/20080317/1362.html       Windows系統是一個訊息驅動的OS,什麼是訊息呢?我很難說得清楚,也很難下一個定義(誰在噓我),我下面從不同的幾個方面

理解訊息傳遞機制訊息轉發機制

訊息傳遞機制 在物件上傳遞方法叫做“傳遞訊息”(pass a message)。訊息有“名稱”(name)或“選擇子”(selector),可以接受引數,而且可能還有返回值。 在Object-c中,如果向物件傳遞訊息,那就會使用動態繫結機制來決定需要呼叫的方

RocketMQ重試機制訊息冪等

一、重試機制   由於MQ經常處於複雜的分散式系統中,考慮網路波動,服務宕機,程式異常因素,很有可能出現訊息傳送或者消費失敗的問題。因此,訊息的重試就是所有MQ中介軟體必須考慮到的一個關鍵點。如果沒有訊息重試,就可能產生訊息丟失的問題,可能對系統產生很大的影響。所以,秉承寧可多發訊息,也不可丟失訊息的原則,大

java 類加載機制反射機制

lis 多線程 ati 加鎖 margin 對數 父類 p s list 1.類的加載機制jvm把class文件加載到內存,並對數據進行校驗、解析和初始化,最終形成jvm可以直接使用的java類型的過程。(1)加載 將class文件字節碼內容加載到內存中,並

Objective-C runtime機制(2)——訊息機制

當我們用中括號[]呼叫OC函式的時候,實際上會進入訊息傳送和訊息轉發流程: 訊息傳送(Messaging),runtime系統會根據SEL查詢對用的IMP,查詢到,則呼叫函式指標進行方法呼叫;若查詢不到,則進入訊息轉發流程,如果訊息轉發失敗,則程式crash並記錄日誌。

圖解 Android 事件分發機制 handler 機制

在Android開發中,事件分發機制是一塊Android比較重要的知識體系,瞭解並熟悉整套的分發機制有助於更好的分析各種點選滑動失效問題,更好去擴充套件控制元件的事件功能和開發自定義控制元件,同時事件分發機制也是Android面試必問考點之一,如果你能把下面的一些事件分發圖當場畫出來肯定加分不少。廢

【JavaScript高階】11、執行緒機制事件機制

一、程序與執行緒 1. 程序:程式的一次執行, 它佔有一片獨有的記憶體空間 2. 執行緒: CPU的基本排程單位, 是程式執行的一個完整流程 3. 程序與執行緒 * 一個程序中一般至少有一個執行的執行緒: 主執行緒 * 一個程序中也可以同時執行多個執行緒, 我們會說程式是多執行

Memcached的刪除機制過期機制

做實驗 為什麼呢? Memcached的過期刪除機制 1.當某個值過期後,並沒有記憶體刪除,因此stats統計時curr_item有其資訊。 2.當取值時,判斷是否過期,如果過期,返回空,並且清空,curr_item就減少了。 3.如果之前沒有get過,將不會自動刪除

session機制cookie機制

一、術語session session的工作原理   (1)當一個session第一次被啟用時,一個唯一的標識被儲存於本地的cookie中。   (2)首先使用session_start()函式,PHP從session倉庫中載入已經儲存的session變數。   (3)當執

RabbitMQ的架構、交換機機制ACK機制

RabbitMQ  RabbitMQ是一個由erlang開發的AMQP(Advanced Message Queue )的開源實現。 RabbitMQ 即一個訊息佇列,_主要是用來實現應用程式的非同步和解耦,同時也能起到訊息緩衝,訊息分發的作用。_ RabbitMQ使用

Storm學習記錄(四、併發機制通訊機制

一、併發機制 Worker – 程序:一個Topology拓撲會包含一個或多個Worker(每個Worker程序只能從屬於一個特定的Topology) 這些Worker程序會並行跑在叢集中不同的伺服器上,即一個Topology拓撲其實是由並行執行在Storm叢集中多臺伺服器上的程序所組成

【WebRTC】NAT機制傳輸機制

1.NAT機制 WebRTC對內網上的主機建立連線需要NAT,即網路地址轉換。 WebRTC直接採用了Libjingle中關於傳輸部分的元件。 Libjingle是Google公司開發的實現P2P傳輸的C++開源庫,Google Talk就是基於這個庫開發的。通過Libji

windows保護模式段機制機制簡介

今天看書看到了windows的分頁和分段機制,之前學習作業系統的時候老師講過,而且還作為期中考試題目出過, 只可惜自己不努力,現在重新看一下,算是簡單瞭解了windows的段頁機制。 開始之前我們需要知道windows執行的幾種模式,包括真實模式、保護模式以及虛擬8086

WPF的訊息機制(三)- WPF內部的5個視窗之處理啟用關閉的訊息視窗以及系統資源通知視窗

原文: WPF的訊息機制(三)- WPF內部的5個視窗之處理啟用和關閉的訊息視窗以及系統資源通知視窗 目錄 WPF的訊息機制(一)-讓應用程式動起來 WPF的訊息機制(二)-WPF內部的5個視窗 (1)隱藏訊息視窗 (2)處理啟用和關閉的訊息視窗和系統資源通知視窗