自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#改寫WM_GETTEXT處理例程

開發(fā) 后端
這里介紹C#改寫WM_GETTEXT處理例程,包括介紹示范如何在C#程序中定制和修改MDI應(yīng)用的窗口標(biāo)題和MainWindow 是唯一一個存取該字符串的類。

在向大家詳細(xì)介紹C#改寫WM_GETTEXT處理例程之前,首先讓大家了解下MDI應(yīng)用,然后全面介紹C#改寫WM_GETTEXT處理例程。

如果你用 MFC 編寫過多文檔界面(MDI)Windows 程序,那么肯定知道:如果父窗口標(biāo)題為“PCaption”,子窗口標(biāo)題為“CCaption”,那么每當(dāng)子窗口***化并處于激活狀態(tài)時,子窗口標(biāo)題一般都會與父窗口標(biāo)題合二為一,變成“PCaption-[CCaption]”。 這是一種 MDI 的默認(rèn)行為。用 C# 編寫多文檔界面程序也不例外。很多用戶都不喜歡這種缺省特性,往往想用定制的窗口標(biāo)題取而代之。以及將示范如何在C#程序中定制和修改MDI應(yīng)用的窗口標(biāo)題?!?/P>

如果用MFC來編程,只要改寫框架窗口類的虛函數(shù) CFrameWnd::OnUpdateFrameTitle 即可。那么在微軟的 .NET 框架中如何用C#實(shí)現(xiàn)相同的功能呢?首先,我們必須理解 MDI 本身是如何通過 Windows 核心 API 來實(shí)現(xiàn)自己的行為特性的,其實(shí)這與MFC或者.NET的公共語言運(yùn)行時(CLR)沒有什么關(guān)系。在創(chuàng)建MDI應(yīng)用時,框架及其子窗口有各自專門的窗口過程,DefFrameProc 和 DefMDIChildProc,一個處理各種 WM_MDIXXX 消息以及其它類似 WM_SIZE, WM_SYSCOMMAND 的消息,另一個實(shí)現(xiàn) MDI 行為。

如果用純 C 代碼編寫,那么必須自己負(fù)責(zé)用 DefFrameProc 和 DefMDIChildProc 創(chuàng)建窗口;在 MFC 中則使用 CMDIFrameWnd/CMDIChildWnd;.NET 框架平臺里則設(shè)置 Form.IsMdiContainer 和 Form.MdiParent,不管用哪種方式,其核心都是 user kernel,尤其是 DefFrameProc,當(dāng) MDI 子窗口***化時,它會聯(lián)接父子窗口的標(biāo)題文本來產(chǎn)生主窗口標(biāo)題串。理解了這一點(diǎn),下面我來示范如何改寫MDI。這個例子的原始版本來自 MSDN 庫中用C#寫的 Scribble MDI(用 “scribble sample”搜索一下即可找到)?;舅悸肥鞘紫仍?Scribble 例子的 MainWindow 中改寫 WM_GETTEXT 消息處理例程,必須添加兩個數(shù)據(jù)成員:NormalText 和 MaximizedText,用它們來保存常態(tài)和***化狀態(tài)的標(biāo)題 :

  1. // in Scribble.cs, MainWindow class  
  2. private String NormalText = "Scribble2";  
  3. private String MaximizedText = "Window is now maximized";  
  4. //如果想讓其它類存取這兩個成員,那么可以通過屬性機(jī)制代替數(shù)據(jù)成員  
  5. private String normaltext;  
  6. public String NormalText  
  7. {  
  8. get { return normaltext; }  
  9. set { normaltext = value; }  

因?yàn)樵诶映绦蛑?MainWindow 是唯一一個存取該字符串的類,所以沒有必要使用屬性機(jī)制。有了這兩個新的數(shù)據(jù)成員,你要做的只是C#改寫WM_GETTEXT處理例程,返回子窗口***化狀態(tài)以及常態(tài)時的標(biāo)題文本。那么如何C#改寫WM_GETTEXT處理例程呢?

Windows.Forms 提供了一些 處理 WM_XXX 消息的虛擬函數(shù),如 OnResize/WM_SIZE等,但是恰恰缺少與 WM_GETTEXT 相關(guān)東東(OnGetText/WM_GETTEXT)。不要擔(dān)心,沒有虛函數(shù),我們總是可以改寫包羅萬象的 WndProc 處理例程。為此必須知道所處理的消息ID,也就是 WM_GETTEXT 的消息 ID = 0x000D,有人會問,你是怎么知道這個消息的 ID 是 0x000D 啊,很簡單,一種方法是運(yùn)行 SPY 獲取,另一種方法是直接查找Windows SDK 中的 winuser.h 頭文件。一旦你能深入到 WndProc 這一層次編寫代碼,那么你基本上能用 C 語言寫程序了,因?yàn)?Win32 API 和其它語言之間所有東東通過 WPARAMs 和 LPARAMs 參數(shù)傳遞的,包括字符串在內(nèi)。對于 WM_GETTEXT 來說,Message.LParam 是指向 char* 的指針,Message.WParam 是該指針長度。也就是說你必須完成將文本串拷貝到調(diào)用者的緩沖里。好在這并不是太難,下面是程序代碼:

  1. public class MainWindow : System.Windows.Forms.Form  
  2. {  
  3. private String NormalText = "Scribble2";  
  4. private String MaximizedText = "Window is now maximized";   
  5. // Handle WM_GETTEXT: Return maximized or  
  6. // normal text, depending on  
  7. // state of active MDI child window.  
  8. protected override void WndProc(ref Message m)  
  9. {  
  10. const int WM_GETTEXT = 0x000D;  
  11. if (m.Msg==WM_GETTEXT) {  
  12. Form active = this.ActiveMdiChild;  
  13. String s = active!=null &&  
  14. active.WindowState==FormWindowState.Maximized ? MaximizedText :  
  15. NormalText;  
  16. char[] c = s.ToCharArray();  
  17. IntPtr buf = m.LParam;  
  18. int len = c.Length;  
  19. Marshal.Copy(c, 0, buf, Math.Min((int)m.WParam, len));  
  20. m.Result = (IntPtr)len;  
  21. return;  
  22. }  
  23. base.WndProc(ref m)  
  24. }  
  25. ...... 
  26. // rest of MainWindow unchanged from Scribble sample  

【編輯推薦】

  1. C# this關(guān)鍵字詳解
  2. C#調(diào)用析構(gòu)方法詳解
  3. C#釋放托管資源簡單描述
  4. C#單路代理簡單分析
  5. C#文法產(chǎn)生式概述
責(zé)任編輯:佚名 來源: CSDN
相關(guān)推薦

2009-08-14 17:38:08

C#改寫方法

2009-08-12 15:20:21

C#事件處理

2009-08-06 14:08:08

C#語言異常處理

2009-08-19 15:54:33

處理C#消息

2009-08-27 18:02:22

C#事件處理

2009-08-07 17:45:29

C#預(yù)處理

2009-08-07 17:41:40

C#預(yù)處理

2009-08-31 17:26:32

C#異常處理

2009-08-12 18:28:09

C#事件處理程序

2009-09-01 10:10:51

C# StreamRe

2009-08-05 18:28:05

C#異常處理

2009-09-02 14:00:34

C#文件處理

2009-09-23 09:36:34

C#數(shù)組

2009-09-17 09:20:45

C#操作XML

2009-09-07 15:21:38

Java與C#事件處理

2024-04-28 11:25:02

C#JSON

2009-08-06 18:33:45

C#處理文本文件

2009-09-02 19:13:08

C#處理文本文件

2009-07-31 16:48:44

C#位運(yùn)算

2009-08-05 18:09:17

C#異常處理機(jī)制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號