2009-07-11 89 views

回答

1

它實際上創建後立即不發送,但可以在創建之後的任何時候,如果收到的窗口有定義的非客戶區,窗口有兩個主要區域,客戶端和非客戶端非客戶端區域是窗口的外邊界/邊界,客戶端區域可以被視爲窗口的「主體」,這是您獲得最多活動的區域,通常這是一個窗口,用戶應相互的預期區域。當然,有時其他各方將有沒有非客戶端區域,但仍然顯示自己的邊界和其他細節的控制。

將近所有庫存控制(Microsoft公佈的任何通用控制庫和其他基於窗口的控件),以下區域被視爲非客戶區域。前綴爲NC

  • 字幕標題詳細
  • 系統菜單/最小化/最大化/關閉
  • 國界

消息表示發生在窗口的非客戶端領域的活動。沒有前綴的消息在客戶區域。

無論如何,我相信你有被跟蹤一個特定的窗口上鼠標事件的功能。如果需要跟蹤窗口非客戶區域的任何移動(例如,對於拖動或懸停操作),您需要將以下消息添加到鼠標跟蹤中。

  • WM_NCMOUSEMOVE

(鼠標位置以非客戶區已改變)

  • WM_NCLBUTTONDBLCLK
  • WM_NCLBUTTONDOWN
  • WM_NCLBUTTONUP

(在非客戶區左按鈕動作)

  • WM_NCMBUTTONDBLCLK
  • WM_NCMBUTTONDOWN
  • WM_NCMBUTTONUP

(以非客戶區中間按鈕動作)

  • WM_NCRBUTTONDBLCLK
  • WM_NCRBUTTONDOWN
  • WM_NCRBUTTONUP

(非客戶區右按鍵動作)

此外,根據您的應用程序,以下消息可能會感興趣的爲好。

  • WM_NCACTIVATE

(窗口激活已經通過用戶操作改變,需要更新的非客戶區)

  • WM_NCHITTEST

(窗口管理器想知道非客戶區是否跟蹤鼠標活動)

  • WM_NCPAINT
(需要非客戶區重新繪製)

用於確定非客戶區的視覺範圍的有用技巧是攔截WM_NCPAINT消息並只是油漆非客戶區域以您選擇的顏色(紅色/粉紅色或其他突出的顏色)顯示。這對於調試多個窗口彼此相鄰且非應用程序區域應該無縫顯示的情況很有用。

最後,這裏有一個鏈接,它有一個演示源代碼,可能值得研究非客戶端區域如何工作。

Customizing the Non-client Area from CodeProject (VB)

+0

謝謝您的答覆^ _^ 但它不是非常有幫助我的問題:( 我的問題是,我創建了一個窗口,我要跟蹤WM_NCMOUSELEAVE出於某種原因,所以我在WINPROC中添加了WM_NCMOUSELEAVE處理程序,但我注意到在我調用TrackMouseEvent()來跟蹤WM_NCMOUSELEAVE之前,但在創建窗口之後,如果將光標移動到非客戶區域上,WINPROC將只收到一次WM_NCMOUSELEAVE一次。 我不知道爲什麼。所以我發佈這個問題。我試圖用TME_CANCEL調用TrackMouseEvent來防止消息,但它不起作用。 我的系統是使用sp3的WINXP。 – cyberscorpio 2009-07-12 06:15:52

相關問題