首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

天极网 > 软件频道>C#中如何处理父窗口及其子窗口标题

C#中如何处理父窗口及其子窗口标题

2004-07-23 19:30作者:Paul DiLascia出处:vckbase责任编辑:方舟

  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”,如图一所示,


图一 子窗口最大化时的主窗口标题

  当两个窗口处于常态时,其画面如图二所示:


图二 子窗口在常态时两个窗口的标题

共2页。 9 1 2

关注此文的读者还看过:

返回软件频道首页

共2页。 上一页12

软件频道最新更新

热点推荐

天极服务|关于我们|About us|网站律师|RSS订阅|友情合作|加入我们|天极动态|网站地图|意见反馈|MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络