首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > C#中如何处理父窗口及其子窗口标题
【标  题】:C#中如何处理父窗口及其子窗口标题
【关键字】:C,窗口,C#
【来  源】:网络

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

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


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

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


图二 子窗口在常态时两个窗口的标题
随机数算法:【上一篇】
C语言基础:插入排序法:【下一篇】
【相关文章】
  • VC#初学入门:第一个Windows程序
  • 利用Visual C#打造一个平滑的进度条
  • C语言常用的三种排序方法总结与探讨
  • C#程序控制开始菜单的弹出
  • 用C#制作一个目录选择对话框
  • Visual C#中实现窗体间的数据传递之一
  • Visual C#实现窗体间数据传递之二
  • 经典C程序100例==11--20
  • 经典C程序100例==21--30
  • 经典C程序100例==41--50
  • 【随机文章】
  • 动网论坛有史以来最大的安全漏洞(3)
  • 向地图中加入点程序代码
  • 沟通中,怎样成为说话高手!
  • 火凤凰2.0使用教程
  • DP With PPCoder Update
  • 公司代理服务器配置技术
  • Excel数据分类汇总满足多种数据整理需求
  • weblogic的安装、目录结构、启动
  • 在Delphi中轻松操作注册表
  • 用Eclipse平台进行C/C++开发
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.