知识大全 C#中如何处理父窗口及其子窗口标题

Posted 标题

篇首语:时人不识凌云木,直待凌云始道高。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#中如何处理父窗口及其子窗口标题相关的知识,希望对你有一定的参考价值。

C#中如何处理父窗口及其子窗口标题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  如果你用 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_SYSMAND 的消息 另一个实现 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 = Scribble ;

  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 = x D 有人会问 你是怎么知道这个消息的 ID 是 x D 啊 很简单 一种方法是运行 SPY 获取 另一种方法是直接查找Windows SDK 中的 winuser h 头文件 一旦你能深入到 WndProc 这一层次编写代码 那么你基本上能用 C 语言写程序了 因为 Win API 和其它语言之间所有东东通过 WPARAMs 和 LPARAMs 参数传递的 包括字符串在内 对于 WM_GETTEXT 来说 Message LParam 是指向 char* 的指针 Message WParam 是该指针长度 也就是说你必须完成将文本串拷贝到调用者的缓冲里 好在这并不是太难 下面是程序代码

    

  public class MainWindow : System Windows Forms Form

  

  private String NormalText = Scribble ;

  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 = x D;

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

图一 子窗口最大化时的主窗口标题 图二 子窗口在常态时两个窗口的标题 cha138/Article/program/net/201311/13196

相关参考

知识大全 在ModalDialog中操作父窗口对象

在ModalDialog中操作父窗口对象  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  不能使用

知识大全 子窗口和父窗口交互

JavaScript实际应用:子窗口和父窗口交互  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 javascript中iframe里面的页面调用父窗口js函数的方法

  实现iframe内部页面直接调用该iframe所属父窗口自定义函数的方法  比如有A窗口A内有个IFRAMEBB里面的装载的是C页面这时C要直接调用A里面的一个自定义函数ExpandPage();

知识大全 解析jquery获取父窗口的元素

  ("#父窗口元素ID"windowparentdocument);对应javascript版本为windowparentdocumentgetElementByIdx_x("父窗口元素ID")取父

知识大全 js中top/parent/frame概述及案例应用

引用方法top该变量永远指分割窗口最高层次的浏览器窗口如果计划从分割窗口的最高层次开始执行命令就可以用top变量parent该变量指的是包含当前分割窗口的父窗口如果在一个窗口内有分割窗口而在其中一个分

知识大全 js 调用父窗口的具体实现代码

想要实现如题所示:父窗体需要顶一个show()方法具体实现代码如下感兴趣的朋友可以参考下哈希望对大家有所帮助   openershow();父窗体需要顶一个show()方法父面页代码复制代码

知识大全 jQuery在iframe里取得父窗口的某个元素的值涛

jQuery在iframe里取得父窗口的某个元素的值涛  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 为Windows窗口标题栏添加新按钮

为Windows窗口标题栏添加新按钮  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  对于我们熟悉

知识大全 C#窗口透明

C#窗口透明  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  usingSystem;  usin

知识大全 利用C#实现任务栏通知窗口

利用C#实现任务栏通知窗口  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作为程序员在享受的同时