程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> windows新聞和新聞隊列實例詳解

windows新聞和新聞隊列實例詳解

編輯:關於C++

windows新聞和新聞隊列實例詳解。本站提示廣大學習愛好者:(windows新聞和新聞隊列實例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是windows新聞和新聞隊列實例詳解正文


本文具體講述了windows新聞和新聞隊列的道理與運用辦法。分享給年夜家供年夜家參考。詳細剖析以下:

與基於MS - DOS的運用法式分歧,Windows的運用法式是事宜(新聞)驅動的。它們不會顯式地挪用函數(如C運轉時庫挪用)來獲得輸出,而是期待windows向它們傳遞輸出。 windows體系把運用法式的輸出事宜傳遞給各個窗口,每一個窗口有一個函數,稱為窗口新聞處置函數。窗口新聞處置函數處置各類用戶輸出,處置完成後再將掌握權交還給體系。窗口新聞處置函數普通是在注冊一個窗口的時刻指定的。你可以從典范的SDK法式中窗口新聞處置函數是怎樣聲明和完成的。

關於Windows XP體系:假如頂層窗口停滯呼應新聞跨越幾秒鐘,體系會以為窗口無回應。在這類情形下,體系將隱蔽這個窗口,然後生成一個影子(ghost)窗口籠罩在它下面。這個影子窗口具有著雷同的Z軸次序,地位,年夜小,顯示屬性。影子窗口許可用戶將其挪動,調劑年夜小,乃至封閉(封閉的是停滯呼應的window)。此時只要這幾個舉措是被許可的,在調試形式下,體系不會生成影子窗口。

本節評論辯論以下主題:

Windows新聞

 1.  新聞類型

 2.  新聞傳遞

 3.  新聞處置

 4.  新聞過濾

 5.  post message和send message

 6.  新聞逝世鎖

 7.  播送新聞

 8.  查詢新聞

現分述以下:

1. Windows新聞

windows經由過程新聞的情勢向窗口授遞用戶輸出。新聞可以由體系和運用法式生成。該體系會為每一個輸出事宜發生響應的新聞,

例如,用戶點擊鼠標,挪動鼠標或轉動條,或是運用法式轉變了體系的某些屬性,好比說體系更改了字體資本,轉變了某個窗口的

年夜小。 不只如斯,運用法式可以生成新聞,公告發送新聞指定它的窗體去履行某些義務或許是與其他的運用法式交互。

windows體系將新聞發送到一個窗口新聞處置函數時傳遞四個參數:窗口句柄,新聞標識符,兩個DWORD值(新聞參數)。

窗口句柄標識了該新聞的目標窗口。windows應用它來肯定是哪一個窗口的的窗口新聞處置函數收到該新聞。

一個新聞標識符是一個著名字的常量,用來注解新聞的意義。當一個窗口處置函數收到一條新聞,它依據斷定新聞標識符來決議若何處置該新聞,例如,新聞標識符WM_PAINT新聞告知窗口法式窗口的客戶區已產生變更,必需重繪。 新聞參數(DWORD值)指定傳遞的數據或是數據的地址。新聞參數可所以一個整型值,一個指針值。也能夠為NULL。

一個窗口進程必需依據新聞標識符來肯定若何說明新聞參數。

2. windows 新聞類型

本節描寫新聞的兩品種型:

(1) 體系界說的新聞

(2) 運用法式界說的新聞

體系界說的新聞

操作體系向運用法式發送新聞來和運用法式通信。操作體系經由過程新聞掌握運用法式的運轉,向運用法式傳遞用戶輸出和一些其他有效的信息。

運用法式也能夠發送體系界說的新聞,運用法式經由過程這些新聞去掌握應用注冊窗口類創立的控件的窗口的運轉。

每一個體系界說的新聞都有一個獨一的新聞標識符和響應的符號常量(在windows SDK的頭文件裡界說)。符號常量平日會注解體系界說的新聞所屬的種別。分歧的前綴注解分歧的種別。一下是罕見的分類:

    Prefix Message category

    WM        General window(普通的窗口)

    ABM        Application desktop toolbar (運用法式桌面對象條)

    BM        Button control (按鈕控件)

    CB        Combo box control (組合框控件)

    CBEM Extended combo box control(擴大的組合框控件)

    CDM        Common dialog box (通俗的對話框)

    DBT        Device (裝備)

    DL        Drag list box (下拉列表)

    DM        Default push button control (默許按鈕控件)

    DTM        Date and time picker control(日期和時光選擇控件)

    EM        Edit control (編纂控件)

    HDM        Header control (表頭控件)

    HKM        Hot key control (熱鍵控件)

    IPM        IP address control (IP地址控件)

    LB        List box control  (列表框控件)

    LVM        List view control (列表視圖控件)

    MCM        Month calendar control (數學日歷控件)

    PBM        Progress bar (進度條控件)

    PGM        Pager control ()

    PSM        Property sheet (屬性頁)

    RB        Rebar control (分隔條控件)

    SB        Status bar window (狀況條控件)

    SBM        Scroll bar control (轉動條控件)

    STM        Static control (靜態控件)

    TB        Toolbar (對象條)

    TBM        Trackbar (跟蹤欄)

    TCM        Tab control (選項卡控件)

    TTM        Tooltip control ()

    TVM        Tree-view control ()

    UDM        Up-down control ()

運用法式可以經由過程創立自界說的新聞,用來和本身的窗口和其他過程通信。假如運用法式創立了本身的新聞,窗口處置函數可以解析這些信息,並作出響應的處置。

新聞標識符值的取值規模:

該體系保存了一個新聞規模,從0x0000到0x03FF(0x03FF等於WM_USER -1)規模. 這個規模內的值為體系界說的新聞。運用法式不克不及應用這些值作為本身的自界說新聞。

從0x0400(數值WM_USER)到0x7FFF的值是為運用法式保存的。運用法式可使用這個規模內的值來界說本身的新聞。

假如你的操作系用的版本(windows version)主版本為4.0版,你還可使用0x8000(WM_APP)到0xBFF之間的值來界說本身的新聞。

除此以外,運用法式還可以挪用RegisterWindowMessage函數注冊一個新聞時,操作體系會前往一個介於0xC000和0xFFFF之間的一個新聞標識符。而且包管這個前往值是體系獨一的。是以,可以免和其他運用法式應用的新聞相抵觸。

3. 新聞派發

windows應用兩種辦法將消派發到一個窗口新聞處置函數:一是將新聞放到新聞隊列(先輩先出隊列),二是不放到新聞隊列,直接發送到窗口新聞處置函數,讓窗口處置函數來處置新聞。

派發到新聞隊列的新聞被稱為列隊新聞(Queued messages)。它們重要是用戶輸出事宜,好比說鼠標或鍵盤新聞盤,有WM_MOUSEMOVE新聞,WM_LBUTTONDOWN,WM_KEYDOWN,和WM_CHAR新聞。還有一些其他的,包含WM_TIMER,WM_PAINT,和WM_QUIT。年夜多半其他的新聞息,這是直接發送到窗口進程,被稱為非隊列新聞(non queued messages)。

(1) 隊列(Queued)新聞

windows可同時顯示隨意率性數目的窗口。此時,體系應用新聞隊列來將鍵盤和鼠標事宜准確的派發到准確的窗口。

windows保護著一個體系新聞隊列,和分離為每一個GUI線程保護一個各自的線程新聞隊列。為了不非GUI線程的創立線程新聞隊列的開支,一切線程創立初始化時,均不創立新聞隊列。只要當線程第一次挪用GDI函數時,體系才會為線程創立新聞隊列。所以那些非GUI線程是沒有新聞隊列的。

每當用戶挪動鼠標,點擊按鈕或鍵盤時,鼠標或鍵盤的裝備驅動法式會將輸出轉換成新聞,並將新聞放在體系新聞隊列裡。刪windows會檢討本身的新聞隊列,假如新聞隊列不為空,則每次掏出並刪除一個新聞,然後肯定新聞的目的窗口,然後把新聞放到創立這個窗口的線程的線程新聞隊列裡。線程的新聞隊列吸收由線程創立的窗口的一切的鼠標和鍵盤新聞。然後線程會從隊列中刪除信息,並告知體系把它們派發到對應的窗口新聞處置函數。

除WM_PAINT, WM_TIMER和WM_QUIT新聞之外,體系老是派發放在在新聞隊列的末尾的新聞。這將包管讓一個窗口以first-in, first-out的次序吸收新聞。WM_PAINT,WM_TIMER,和WM_QUIT新聞,會一向被保留在隊列中,只要在隊列中沒有其他新聞時才會被派發到窗口新聞處置函數。另外,統一個窗口的多個WM_PAINT新聞被歸並成一個WM_PAINT新聞,客戶區的一切有效部門也會被歸並。如許是為了削減窗口重繪客戶區的次數。

windows向線程新聞隊傳記遞新聞時,起首會填充一個MSG構造,然後將這個MSG構造復制到新聞隊列。MSG中的信息包含:目的窗口,新聞標識符,兩個新聞參數,新聞派發時的時光,鼠標光標地位。一個線程可使用PostMessage或PostThreadMessage功效向本身的新聞隊列或許是其他線程的新聞隊列發送新聞。

運用法式可使用GetMessage函數從本身的新聞隊列中刪除新聞。檢查而不刪除新聞,用的是PeekMessage函數。

PeekMessage函數會前往一個帶有新聞信息的MSG構造。

從新聞隊列中刪除新聞後,運用法式可使用DispatchMessage函數指導體系將新聞發送到一個窗口新聞處置函數。 DispatchMessage的參數是是前一次挪用GetMessage或PeekMessage取得的MSG構造的指針。 DispatchMessage會傳遞窗口句柄,新聞標識符,這兩個新聞參數這些信息給窗口新聞處置函數,它不會傳遞新聞派發時光和鼠標光標地位。運用法式可以在處置新聞時挪用的GetMessageTime和GetMessagePos來取得這些信息。

線程可使用WaitMessage函數,交出本身的掌握權,當它的新聞隊列中沒有新聞時,挪用WaitMessage函數會掛起線程,直到本身的新聞隊列裡有新聞時才前往。

您可以挪用SetMessageExtraInfo函數來聯系關系一個值給以後線程的新聞隊列。然後挪用GetMessageExtraInfo函數來獲得由GetMessage或PeekMessage函數獲得的最初一條新聞相干聯的值。你可以去msdn上看更多的關於這幾個函數的信息。

(2) 非隊列(Nonqueued)新聞

Nonqueued新聞被立刻送往目標地的窗口新聞處置函數,繞過了體系的新聞隊列和線程新聞隊列。體系平日會發送nonqueued新聞,來告訴那些會影響窗口的事宜。例如,當用戶激活一個新的運用法式窗口時,體系會發送一些列新聞到窗口,包含WM_ACTIVATE,WM_SETFOCUS,WM_SETCURSOR。這些新聞告訴窗口被激活,鍵盤輸出被定向到窗口,而且鼠標光標也移到窗口的界限內。

Nonqueued新聞也有能夠起源於運用法式挪用體系函數。例如,體系挪用SetWindowPos函數挪動一個窗口後會發送WM_WINDOWPOSCHANGED新聞。 一些函數也發送nonqueued新聞, 有BroadcastSystemMessage,BroadcastSystemMessageEx,SendMessage,SendMessageTimeout,和SendNotifyMessage。 關於這些函數的具體信息,你可以查閱MSDN。

新聞處置

運用法式必需刪除並處置發送到它的線程新聞隊列的新聞。單線程運用法式平日在它的WinMain函數的新聞輪回,刪除和分發新聞到恰當的窗口停止處置。多線程運用法式可以在每個線程創立一個窗口的新聞輪回。以下章節描寫了一個新聞

輪回若何任務,並講述窗口新聞處置函數的感化:

(1)新聞輪回

(2)窗口處置函數

新聞輪回

一個簡略的新聞輪回包括挪用以下三個函數:GetMessage,TranslateMessage,和DispatchMessage。請留意,假如有一個毛病,GetMessage前往-1 -是以,須要測試它的前往值,來斷定為-1的情形

代碼片斷:

...

MSG msg;

BOOL bRet;

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

GetMessage函數從隊列中獲得新聞,並將新聞內容復制到一個MSG構造。它前往一個非零值,除非碰到WM_QUIT新聞,此種前往FALSE並停止新聞輪回。在一個單線程運用法式,停止新聞輪回常常是在封閉運用法式的第一步。運用法式可以挪用PostQuitMessage函數來呼應WM_DESTROY,停止新聞輪回。

假如您指定一個窗口句柄作為GetMessage的第二個參數,那末GetMessage只獲得在新聞隊列裡和這個窗口有關的新聞。 GetMessage也能夠在隊列中挑選新聞,只獲得指定規模內的新聞。如需有關新聞過濾的具體信息,請參考新聞過濾。

線程的新聞輪回必需包含TranslateMessage,假如線程須要接收鍵盤字符的輸出。每次用戶按下一個鍵,該體系發生響應的虛擬鍵新聞(WM_KEYDOWN和WM_KEYUP)。虛擬鍵新聞包括一個虛擬鍵碼,標識的是被按下的鍵,而不是它相干的字符值。要取得此值,新聞輪回必需包括TranslateMessage,用來將虛擬鍵新聞翻譯成字符新聞(WM_CHAR)的並放到運用法式的新聞隊列裡。經由若干次輪回後,WM_CHAR新聞會被並派發到一個窗口。

DispatchMessage函數將新聞發送到到與MSG構造中的窗口句柄聯系關系的窗口。假如窗口句柄是HWND_TOPMOST,DispatchMessage則將新聞發送到操作體系一切的頂層窗口。假如窗口句柄是NULL,DispatchMessage不做任何事。

一個運用法式的主線程初始化後,體系就啟動運用法式的新聞輪回,並發明至多一個窗口。一旦啟動,新聞輪回連續從該線程的新聞隊列中刪除新聞,並派發他們到響應的窗口。GetMessage函數從新聞列表中獲得到WM_QUIT新聞時,新聞輪回停止。

一個新聞隊列只須要一個新聞輪回,即便一個運用法式包括有多個窗口。 DispatchMessage老是調劑新聞到准確的窗口,這是由於每一個隊列中的新聞是MSG構造,它包括著新聞所屬的窗口的句柄。

您可以以多種方法來修正新聞輪回。例如,您可以從隊列中刪除新聞,然則不派發他們。當發送有些不帶有目標地窗口的新聞時這異常有效。您也能夠應用GetMessage只獲得指定的新聞,這是有效的,假如你必需你臨時繞過正常的新聞隊列FIFO次序。

運用法式應用快捷鍵時,必需可以或許將鍵盤新聞轉換為敕令新聞。是以,運用法式的新聞輪回必需包含TranslateAccelerator函數挪用。關於快捷鍵的更多信息,請拜見鍵盤加快器。

假如一個線程應用一個無形式對話框,那末新聞輪回必需包含IsDialogMessage函數,以便該對話框可以吸收鍵盤輸出。

(3)窗口新聞處置函數

窗口新聞函數吸收和處置的一切發送到窗口的新聞。每一個窗口類有一個窗口新聞處置函數,用該類創立的每一個窗口應用統一窗口新聞處置函數。

該體系將新聞發送到一個窗口的法式,並傳遞新聞的相干信息到窗口新聞處置函數,窗口新聞處置函數檢討新聞標識符,依據傳過去的參數辨認並處置分歧的新聞,

一個窗口進程平日不會疏忽一個新聞。假如新聞沒有被處置,必需被發送給體系默許的窗口新聞處置函數,這能否經由過程挪用DefWindowProc函數,來履行一個默許的處置,並前往一個處置的成果。窗口法式必需然後前往該值作為本身的新聞處置的成果。年夜多半窗口新聞處置函數只處置一少部門新聞,並將其他的前往給體系默許的窗口新聞處置函數。

由於窗口新聞處置函數被一切屬於統一個窗口類的窗口同享,它可以處置幾個分歧的窗口的新聞。要肯定詳細的窗口新聞,窗口新聞處置函數可以檢討新聞構造裡的窗口句柄。

願望本文所述對年夜家的Windows運用法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved