对话框-模态对话框与非模态对话框
【ITjob 课程资料】
系统默认对话框
MFC 默认创建的窗口有三种,其中一个就是对话框,对话框是一个用户和应用程序之间交互的窗口,用于接收用户的输入,输出应用程序相关数据等,下面我们利用MFC 的自动向导自动生成一个对话框程序,如下:
按下Finish 按钮,则完成对话框窗口的建立。
Windows 的对话框分为:模态对话框和非模态对话框。
模态对话框
1
第五章:对话框 ITjob 就业培训
首先我们来看一下系统默认的模态对话框,模态对话框的概念是打开模态对话框之后,用户无法进行其它操作,只有当对话框关闭以后才能进行其它操作。显示模态对话框非常容易,只需要DoModal 函数即可。
完成的对话框程序中在App 类中的Initlnstance 函数中创建对话框见到如下的代码: CTest1Dlg dlg;
int nResponse = dlg.DoModal();
下面我们添加一个功能,当我们在双击窗口的时候打开它,编写代码如下: void C×××Dlg::OnLButtonDblClk(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call
default }
当我们双击窗口复制一个窗口的时候,只能响应新打开的窗口!
非模态对话框
还有一种方式可以打开它,就是采用非模态对话框的方式打开,代码如下:
void C×××Dlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or C×××Dlg dlg;
int nResponse = dlg.DoModal();
CDialog::OnLButtonDblClk(nFlags, point);
call default
2
C×××Dlg* pDlg=new CTest1Dlg(); pDlg->Create(IDD_TEST1_DIALOG);
http://www.5itjob.com
}
CDialog::OnLButtonDblClk(nFlags, point);
模态对话框和非模块对话框的创建都非常容易:首先创建对象,再调用DoModal 或者Create 成员函数创建模态或者非模态对话框。
关于退出窗口
在MFC 默认建立的对话框中有两个按钮(确定和取消),当我们按下这两个按钮的时候窗口将会关闭,另外当我们按下回车键或ESC 键时,窗口也会关闭。这个时候只要重载OnOk 和OnCancel 函数即可,但此时点击关闭按钮无法关闭窗口,还需要再重载OnClose 函数。代码如下:
void CTestDlg::OnOK() { }
void CTestDlg::OnCancel() { }
void CTestDlg::OnClose() {
// TODO: Add your message handler code here and/or // TODO: Add extra cleanup here //CDialog::OnCancel();
// TODO: Add extra validation here //CDialog::OnOK();
call default
3
第五章:对话框 ITjob 就业培训
}
CDialog::OnCancel(); //CDialog::OnClose();
就像打开一个对话框用DoModal 一样,关闭对话框调用EndMoal 即可,但是CDialog::OnOK首先调用UpdateData(TRUE)将数据传给对话框成员变量,然后调用EndDialog(IDOK)关闭对话框; 而CDialog::OnCancel只调用EndDialog(IDCANCEL)关闭对话框; 当点
击系统默认关闭按钮
的时候,系统发送了WM_CLOSE消息,这个消息通过
CDialog::OnClose()函数响应,而默认的该函数是调用本窗口的CTestDlg::OnCancel()函数,这个函数我们已经做了重写,所以要直接调用基类(CDialog )的OnCancel 函数才可以关闭。
自定义对话框
如果我们不想用MFC 默认创建的对话框,则需要采取如下的步骤实现:
(1) 首先在资源中插入一个对话框资源,如图:
4
http://www.5itjob.com
(2) 使用类向导为该资源创建一个新类CMyDialog ,实现该类与该资
源的捆绑
(1) 以模态对话框方式调用 下面我们用模态对话框的方式打开:
添加鼠标左键消息(或者某个菜单项消息) (准备实现点击鼠标左键显示对话框);
添加如下成员函数代码: #include "MyDialog.h"
void CDlgTestView::OnLButtonDown(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or
call default
5
第五章:对话框 ITjob 就业培训
CMyDialog dlg; // 模态对话框显示实例 dlg.DoModal(); }
注意到模态对话框的特点,dlg 是一个栈实例,在运行了dlg.DoModal()之后,出函数作用域,自动销毁。 (2)以非模态对话框方式调用 下面我们再以非模态对话框方式调用:
修改以上代码,使得对话框显示为非模态对话框。 #include "MyDialog.h"
void CTest1Dlg::OnLButtonDblClk(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or CView::OnLButtonDown(nFlags, point);
call default
CMyDialog* pDlg=new CMyDialog(); // 非模态对话框
显示实例
pDlg->Create(IDD_DIALOG1); }
注意:由于新建立的窗口visible 属性都是false ,所以,要调用ShowWindow 函数。
注意到一个问题,就是非模态对话框的堆实例销毁的问题,否则会造成内存泄漏。
我们可以在打开的窗口的销毁消息响应函数中处理,但是我们要获得指
针,那么只能在该窗口中保留一个成员变量来保存了,所以把
pDlg->ShowWindow(SW_SHOW);
CDialog::OnLButtonDblClk(nFlags, point);
6
http://www.5itjob.com
CMyDialog* pDlg提升为成员变量即可
下面增加该窗口销毁时候的代码
void CDlgTest1View::OnDestroy() {
if(pDlg!= NULL) {
delete pDlg; pDlg = NULL; } }
这样就比较完美的解决了内存泄漏的问题了 (3)关于退出窗口带返回参数
MessageBox 的返回太单调了,我们想处理一个可以选择yes,no 的CView::OnDestroy();
// TODO: Add your message handler code here
对话框,然后根据这个对话框获得下一步的处理。
非常简单,只需要利用MessageBox 的第三个参数即可, 代码如下: if (MessageBox("是否继续?","",MB_YESNO)==IDYES)
MessageBox("继续");
else
MessageBox("不继续");
Win32将返回的值都变成了具体宏对应,如下:
7
这个功能我们很容易用自定义对话框实现,步骤如下: ? 在资源中插入一个新的对话框
? 加入一个类CMessage 绑定到这个对话框(前面已经描述,这里
不再复述)
? 去除掉所有按钮,增加两个按钮,YES (IDYES),NO(IDNO),
再增加一个静态文本(是否继续)
如图:
? 主窗口调用代码: #include "Message.h" void CTestDlg::OnOK() { }
// TODO: Add extra validation here //CDialog::OnOK(); CMessage message;
if (message.DoModal()==IDYES)
MessageBox("继续");
else
MessageBox("不继续");
? 在CMessage 类中增加两个按钮(双击按钮则可以简单添加函数)
代码:
8
http://www.5itjob.com
void CMessage::OnYes() {
// TODO: Add your control notification handler code
here }
void CMessage::OnNo() {
// TODO: Add your control notification handler code this->EndDialog(IDYES);
here
常用的窗口相关函数
SetWindowPos 改变窗口位置
案例: 将窗口移动到屏幕的左上角: 函数原型:
BOOL SetWindowPos(const CWnd* pWndInsertAfter, int x, int y, int cx, int cy,UINT nFlags); 在窗口的OnInitDialog 函数中写入: this->SetWindowPos(NULL,0,0,0,0,SWP_NOSIZE|SWP_SHOWWINDOW); SWP_NOSIZE表示:保持当前窗口的大小(忽略cx 和cy 参数)。 SWP_SHOWWINDOW表示立即显示这个窗口。
9
this->EndDialog(IDNO);
将一个OK 按钮移动到窗口的原点(0,0)处
this->GetDlgItem(IDOK)->SetWindowPos(NULL,0,0,0,0,SWP_NOSIZE); 这个函数同样适合于Button, 因为它继承于Window 。
GetWindowRect
取得的窗口空间,坐标以Screen 为原点。 案例1:
改变窗口大小 CRect newRect;
this->GetWindowRect(&newRect);
SetWindowPos(NULL,0,0,newRect.Width()/2,newRect.Height()/2,SWP_NOMOVE);
SWP_NOMOVE表示:保持当前的位置(忽略x 和y 参数)。
GetClientRect
取得的窗口的客户区空间
ScreenToClient
10
http://www.5itjob.com
将以屏幕为原点的坐标转换为以父窗口为原点。
ClientToScreen 则做与ScreenToClient 相反的转换
相关资料与视频请访问ITjob 就业培训网
11
模态对话框与非模态对话框
模态对话框与非模态对话框
JDialog
public void setModal(Boolean modal)
package com.swing.Jlist;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.UIManager;
public class Test04 extends JFrame{
public Test04(){
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.Nimbu
sLookAndFeel");
} catch (Exception e) {
// TODO: handle exception
}
JButton jb1=new JButton("模态显示对话框");
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
do_button01(e);
}
});
JButton jb2=new JButton("非模态显示对话框");
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){>10;i++){>
do_button02(e);
}
}
});
jb1.setBounds(103,64, 206,30);
jb2.setBounds(103,106, 206,30);
this.setLayout(null);
this.add(jb1);
this.add(jb2);
this.setVisible(true);
this.setBounds(100,100, 450,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void do_button01(ActionEvent e){
JDialog jd=new JDialog(this);
jd.setModal(true);
jd.setSize(300,200);
jd.setLocation(200,200);
jd.setTitle("模态显示对话框");
JButton jb3=new JButton("关闭");
jb3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(1);
}
});
jb3.setBounds(20, 20,100,30);
jd.setLayout(null);
jd.add(jb3);
jd.setVisible(true);
}
public void do_button02(ActionEvent e){
JDialog jd=new JDialog(this);
jd.setModal(false);
jd.setSize(300,200);
jd.setLocation(200,200);
jd.setTitle("模态显示对话框");
JButton jb3=new JButton("关闭");
jb3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(1);
}
});
jb3.setBounds(20, 20,100,30);
jd.setLayout(null);
jd.add(jb3);
jd.setVisible(true);
}
public static void main(String[] args) {
new Test04();
}
}
模态对话框
关于模态窗口(showModalDialog)的专题讨论!
1.模态窗口的打开
2.模态窗口的关闭
3.模态窗口的传递参数。
4.其他。。。。
1.window.showModalDialog( "DialogPage.aspx ", "newwin ", "dialogHeight: 200px; dialogWidth: 150px; dialogTop: 458px; dialogLeft: 166px; edge: Raised; center: Yes; help: Yes; resizable: Yes; status: Yes; ");
2.window.close();
3.传值
ParentPage.aspx:
window.showModalDialog( "DialogPage.aspx?para1=aaa¶2=bbb ");
DialogPage.aspx:
string str1=Request.QueryString[ "para1 "].toString();
string str2=Request.QueryString[ "para2 "].toString();
返回值
DialogPage.aspx:
window.returnValue= "aaa ";
ParentPage.aspx:
var str=window.showModalDialog( "DialogPage.aspx ");
4.
aspx页面在showmodeldialog情况下为什么一提交就重新打开一个页面?
showmodaldialog打开的页面中在
之间加入一行:6.例子
WebForm2.aspx.vb
Inherits System.Web.UI.Page
Protected WithEvents Button1 As System.Web.UI.WebControls.Button
Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
Protected WithEvents Button2 As System.Web.UI.WebControls.Button
Protected WithEvents TextBox2 As System.Web.UI.WebControls.TextBox
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Button1.Attributes.Add( "onclick ", "var st=window.showModalDialog( 'user.aspx?val= '+document.all( 'TextBox1 ').value);document.all( 'TextBox1 ').value=st;return st; ")
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
RegisterStartupScript( "key ", " ")
End Sub
user.aspx.vb
Protected WithEvents TextBox1 As System.Web.UI.WebControls.TextBox
Protected WithEvents cancel As System.Web.UI.WebControls.Button
Protected WithEvents ok As System.Web.UI.WebControls.Button
Protected WithEvents TextBox2 As System.Web.UI.WebControls.TextBox
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim str As String
If Not IsPostBack Then
str = Request.QueryString( "val ")
TextBox1.Text = str
End If
End Sub
Private Sub cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cancel.Click
RegisterStartupScript( "key ", " ")
End Sub
Private Sub ok_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ok.Click
RegisterStartupScript( "key ", " ")
End Sub
这个,非常简单啊.楼主可能对模态窗口的使用了解太少.
在A页面中,打开模态窗口B,可直接在A页面中获取B页面中返回来的值.假设如下:
var str=window.showModalDialog( "DialogPage.aspx ");
那么str就可以得到DialogPage.aspx中返回来找值,而且该值返回的时候,此模态窗口自然就消失了,你用不着去关它.
此时在本页面,要刷新本页面,应是比较容易吧
a页面
var str = window.showModalDialog( "DialogPage.aspx ", "newwin ", "dialogHeight: 200px; dialogWidth: 150px; dialogTop: 458px; dialogLeft: 166px; edge: Raised; center: Yes; help: Yes; resizable: Yes; status: Yes; ");
window.reload;
b页面
对我有用[0] 丢个板砖[0] 引用 举报 管理 TOP 精华推荐:【讨论、技术】如何使用.NET开发浏览器
Truly
(Truly)
等 级:
#2楼 得分:10回复于:2005-06-03 14:47:17window.opener.location.reload()
window.opener.window.focus()
self.close()
模态对话框
模态对话框
2007-12-08 13:33
javascript中showModalDialog和showModelessDialog区别
1( showModalDialog和showModelessDialog的异同 同:两者弹出的窗体不能刷新
异:前者是模态窗口,始终获得焦点;后者是非模态窗口,只不过弹出一个页面,
还可以操作父窗口。
2( 关闭showModalDialog和showModelessDialog弹出的窗口
3( 怎样才让在showModalDialog和showModelessDialog的弹出新窗口里操作
button,不弹出新窗口,
在
和之间加参照例子:
t1.html:
t2.html
<body>