• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • C#中如何處理父窗口及其子窗口標題

    發表于:2007-05-25來源:作者:點擊數: 標簽:其子標題如果窗口處理
    如果你用 MFC 編寫過多文檔界面(MDI)Windows 程序,那么肯定知道:如果父窗口標題為“PCaption”,子窗口標題為“ CC aption”,那么每當子窗口最大化并處于激活狀態時,子窗口標題一般都會與父窗口標題合二為一,變成“PCaption-[CCaption]”。 這是一種 M
    如果你用 MFC 編寫過多文檔界面(MDI)Windows 程序,那么肯定知道:如果父窗口標題為“PCaption”,子窗口標題為“CCaption”,那么每當子窗口最大化并處于激活狀態時,子窗口標題一般都會與父窗口標題合二為一,變成“PCaption-[CCaption]”。 這是一種 MDI 的默認行為。用 C# 編寫多文檔界面程序也不例外。很多用戶都不喜歡這種缺省特性,往往想用定制的窗口標題取而代之。本文將示范如何在C#程序中定制和修改MDI應用的窗口標題。
      如果用MFC來編程,只要改寫框架窗口類的虛函數 CFrameWnd::OnUpdateFrameTitle 即可。那么在微軟的 .NET 框架中如何用C#實現相同的功能呢?首先,我們必須理解 MDI 本身是如何通過 Windows 核心 API 來實現自己的行為特性的,其實這與MFC或者.NET的公共語言運行時(CLR)沒有什么關系。在創建MDI應用時,框架及其子窗口有各自專門的窗口過程,DefFrameProc 和 DefMDIChildProc,一個處理各種 WM_MDIXXX 消息以及其它類似 WM_SIZE, WM_SYSCOMMAND 的消息,另一個實現 MDI 行為。

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

    // in Scribble.cs, MainWindow class
    private String NormalText = "Scribble2";
    private String MaximizedText = "Window is now maximized";

      如果想讓其它類存取這兩個成員,那么可以通過屬性機制代替數據成員,如:

    private String normaltext;
    public String NormalText
    {
    get { return normaltext; }
    set { normaltext = value; }
    }

      因為在例子程序中 MainWindow 是唯一一個存取該字符串的類,所以沒有必要使用屬性機制。有了這兩個新的數據成員,你要做的只是 改寫 WM_GETTEXT 處理例程,返回子窗口最大化狀態以及常態時的標題文本。那么如何改寫 WM_GETTEXT 處理例程呢?



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

    public class MainWindow : System.Windows.Forms.Form
    {
     private String NormalText = "Scribble2";
     private String MaximizedText = "Window is now maximized";

     // Handle WM_GETTEXT: Return maximized or
     // normal text, depending on
     // state of active MDI child window.
     protected override void WndProc(ref Message m)
     {
      const int WM_GETTEXT = 0x000D;
      if (m.Msg==WM_GETTEXT) {
       Form active = this.ActiveMdiChild;
       String s = active!=null &&
       active.WindowState==FormWindowState.Maximized ? MaximizedText :
    NormalText;
       char[] c = s.ToCharArray();
       IntPtr buf = m.LParam;
       int len = c.Length;
       Marshal.Copy(c, 0, buf, Math.Min((int)m.WParam, len));
       m.Result = (IntPtr)len;
       return;
      }
      base.WndProc(ref m);
     }

     ...... // rest of MainWindow unchanged from Scribble sample

    }

      經過上述的改動,現在運行程序,當MDI子窗口最大化時,主窗口標題顯示的文本是“Window is now maximized”,如圖一所示,


    圖一 子窗口最大化時的主窗口標題

      當兩個窗口處于常態時,其畫面如圖二所示:


    圖二 子窗口在常態時兩個窗口的標題

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>