asp.net C#中父窗口及其子窗口标题调用方法

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


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

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


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

时间: 2024-10-01 21:34:34

asp.net C#中父窗口及其子窗口标题调用方法的相关文章

C#中父窗口和子窗口之间实现控件互操作

父窗口|控件|子窗口 很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件.相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可. 下面重点介绍前一种,目前常见的有两种方法,基本上大同小异: 第一种,在主窗体类中定义一个静态成员,来保存当前主窗体对象,例如: public static yourMainWindow pCurrentWin = null; 然后在主窗体构造函数中,给静态成员初始化,如下: pCurrentWin = t

jQuery父窗口与子窗口通信

$("#父窗口元素ID",window.parent.document);  对应javascript版本为window.parent.document.getElementByIdx_x("父窗口元素ID"): 取父窗口的元素方法:$(selector, window.parent.document); 那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document); 类似的,取其它窗口的方法大同小异 $

MFC父窗口控制子窗口CListCtrl控件刷新的问题

问题描述 MFC父窗口控制子窗口CListCtrl控件刷新的问题 目标:父窗口单击按钮,向子窗口发送一个消息:子窗口的消息处理函数中,调用列表显示函数来刷新列表数据. 我的代码: // 父窗口void CDlg4::OnButtonClick(){ CDlg43 *dlg = new CDlg43(); dlg->Create(IDD_DIALOG_43this); if (NULL == dlg) { AfxMessageBox(""failed""); d

servlet-关于父窗口和子窗口的request 的问题(可以传值吗??)

问题描述 关于父窗口和子窗口的request 的问题(可以传值吗??) 问题是这样的 我在login.jsp提交表单到一个servlet 然后在这个servlet中将一个list存入 request,再跳转到index.jsp(是用frameset写的 引入了show.jsp).本来我是在show.jsp 中获取数据.可是在index.jsp看不了show.jsp数据 因为login.jsp servlet index.jsp 才是同一了请求 现在我要在index.jsp看到show.jsp 的

iframe 父窗口和子窗口相互的调用方法集锦_javascript技巧

一.父窗口调用iframe子窗口方法 1.HTML语法:<iframe name="myFrame" src="child.html"></iframe> 2.父窗口调用子窗口:myFrame.window.functionName(); 3.子窗品调用父窗口:parent.functionName(); 简单地说,也就是在子窗口中调用的变量或函数前加个parent.就行 4.父窗口页面源码: 复制代码 代码如下: <html>

JavaScript子窗口调用父窗口变量和函数的方法_javascript技巧

本文实例讲述了JavaScript子窗口调用父窗口变量和函数的方法.分享给大家供大家参考.具体如下: 示例1:子窗口是新打开的窗口 父窗口: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=" http://www.w3.

在同一个页面父窗口打开子窗口,动态无刷新提交(1/2)

在同一个页面父窗口打开子窗口,动态无刷新提交,超炫基于jquery ajax提交,兼容ie7+,火狐.. 基于父窗口打开子窗口,效果超炫,用jquery ajax 动态无刷新提交... 下面先来分析代码:父窗体页面代码 <div><a href="网页特效:void(0);" url='openerweb.asp教程x' id="aparent">编辑</a><div id="blockoptip" st

javascript iframe 父窗口和子窗口实现代码

一.父窗口调用iframe子窗口方法 1.html语法:<iframe name="myframe" src="child.html"></iframe> 2.父窗口调用子窗口:myframe.window.functionname(); 3.子窗品调用父窗口:parent.functionname(); 简单地说,也就是在子窗口中调用的变量或函数前加个parent.就行 4.父窗口页面源码: 复制代码 代码如下: <html>

利用递归算法找到一张关系表中父节点和子节点并且进行修改他们的id

问题描述 利用递归算法找到一张关系表中父节点和子节点并且进行修改他们的id 利用递归算法找到一张关系表中父节点和子节点并且进行修改他们的id,修改父id的时候,先修改他下面的子节点id,这样一层层往上修改,最后修改父id.通过递归的方法一级级找,边找边修改,这个代码怎么实现?