c++程序实现主对话框和子对话框的切换。

在主对话框上定义两个按钮,点击其中一个按钮时隐藏主对话框,显示子对话框。在子对话框上有退出按钮,点击退出按钮时隐藏子对话框,显示主对话框。我现在有两个对话框,想把它们组合... 在主对话框上定义两个按钮,点击其中一个按钮时隐藏主对话框,显示子对话框。
在子对话框上有退出按钮,点击退出按钮时隐藏子对话框,显示主对话框。
我现在有两个对话框,想把它们组合起来,点击一个对话框上的按钮就隐藏当前对话框,显示另一个对话框。
需要具体的步骤。谢谢。
展开
 我来答
山书世间2
2011-01-31 · TA获得超过1322个赞
知道小有建树答主
回答量:1074
采纳率:0%
帮助的人:440万
展开全部
参照如下试试,希望给你有所帮助:
1, 创建一个以对话框为基础的项目。在对话框中添加一个Static : IDC_FULLSCREEN,拉出适当的大小形状。以容纳另一个窗口。
2, 插入一个对话框资源。去掉上面默认的所有控件。必须修改对话框以下属性:
a) Visible TRUE
b) Style Child
根据需要修改Title bar。可以自己看看效果。如果有标题栏,则可以在static中移动该窗口。
3, 生成一个新类CMyDlg
a) 对该类重载以下两个函数,以免用户敲入回车和Esc键将该窗口关闭。
void OnOK(){return;}
void OnCancel(){return;}
b) 由于需要与主窗口(也就是其父窗口)通信,在该对话框跳出父窗口后,还需要再次嵌入到父窗口中,所以增加一个父窗口类的实例指针。
CWnd* m_pParent;
c) 在CMyDlg的构造函数中,将传递过来的父窗口指针保存起来以备后用:
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent),m_pParent(pParent)
{
}
4, 有了上面的窗口后,我们不能像普通控件拖到对话框中,所以需要在主窗口类中定义一个指针成员变量保存播放窗口,并动态创建之。
CMyDlg* pDlg;
并在对话框类的构造函数中将其赋值为NULL。在析构中delete pDlg。
5, 在对话框的OnInitDialog函数中初始化CMyDlg;如下:
// TODO: 在此添加额外的初始化代码
CWnd* pS = (CWnd*)GetDlgItem(IDC_FULLSCREEN);
if (pS ==NULL)
{
AfxMessageBox(Error);
return FALSE;
}
if ( pDlg==NULL )
{
pDlg = new CMyDlg(pS);
pDlg->Create( CMyDlg::IDD,pS );
pDlg->ShowWindow(SW_NORMAL);
}
在创建CMyDlg时,将其父窗口指向static窗口。
6, 这时可以运行程序了。当然编译的时候需要添加一些头文件之类的琐碎事情,自己可以搞定。我们可以发现播放窗口在主窗口的static控件中出现了,如果有标题栏,还可以移动。如果播放窗口的边框有resizing的属性,还可以改变大小。玩够了后结束程序,继续。
7, 现在增加将播放窗口跳出主窗口的动作。主要用到的是SetWindowLong函数修改其现有的属性。在一个按钮被按下的事件中处理,主要的功能就是去掉子窗口属性(WS_CHILD)添加弹出窗口属性(WS_POPUP),然后设置其父窗口为NULL。
将代码中注释掉的代码恢复后,就达到全屏的效果了。
void CfullscreenDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
if ( pDlg == NULL ) return;
HWND hWnd = pDlg->GetSafeHwnd();
if ( hWnd == NULL ) return;
::SetWindowLong( hWnd , GWL_STYLE, (::GetWindowLong(hWnd,GWL_STYLE) ) & (~WS_CHILD) & (~WS_DISABLED) | WS_POPUP );
pDlg->SetParent(NULL);
//if ( ! ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), 0) )
//{
// AfxMessageBox(NO);
//}
}
8, 现在运行程序,单击按钮后,我们发现播放窗口真的跳出来了。按下Esc键,退出程序。我们来添加恢复到嵌入主窗口中的功能。
9, 为了简单起见,我们直接在CMyDlg类中实现。给CMyDlg增加一个消息处理函数:鼠标左键弹起,在消息处理中,无非也是修改窗口属性。代码如下:
void CMyDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if ( m_pParent != NULL )
{
HWND hWnd = GetSafeHwnd();
if ( hWnd == NULL ) return;
LONG newStyle = ::GetWindowLong( hWnd,GWL_STYLE)
& (~WS_POPUP)
| WS_CHILD
| WS_DISABLED ;

::SetWindowLong( hWnd , GWL_STYLE, newStyle) ;
SetParent(m_pParent);
}
CDialog::OnLButtonUp(nFlags, point);
}
到此目的达到。
再看看下面的对你有帮助不:
首先在画面上拖两个Button (btnY,btnN)宽度设为0(注意不要把visible属性设为False)然后调用下边的方法 ,弹出对话框的时候,点【确定】就会进入到btnY的click事件里,点【取消】就进入到btnN的click事件里,
有Updatapanel的时候第一个参数是这个Updatapanel 没有的话第一个参数传Nothing就可以了,第二个参数是当前画面,第三个参数就是要在对话框上显示的提示消息了。

Imports System.Text
Imports System.Web.UI
Public Class MessageBoxClass MessageBox
Public Shared Sub ShowYN()Sub ShowYN(ByVal objUpdate As System.Web.UI.UpdatePanel, ByVal objPage As System.Web.UI.Page, ByVal strMsg As String, ByVal btnY As System.Web.UI.Control, ByVal btnN As System.Web.UI.Control)
Dim strScript As String = "<script> if (confirm('" & strMsg & "')==true){document.getElementById('" & btnY.ClientID & "').click();}else{document.getElementById('" & btnN.ClientID & "').click();}</script>"
If objUpdate Is Nothing Then
'没有updatapanel的情况
objPage.Page.ClientScript.RegisterStartupScript(objPage.GetType(), "", strScript)
Else
'有updatapanel的情况
ScriptManager.RegisterStartupScript(objUpdate, objPage.GetType(), "updateScript", strScript, False)
End If
End Sub
End Class
kepomsc
2011-01-31 · TA获得超过269个赞
知道小有建树答主
回答量:455
采纳率:100%
帮助的人:208万
展开全部
关键问题是在window函数:ShowWindow,参数是TRUE/FALSE(显示/隐蔽)
子对话框定义为主窗口的一个全局变量 ,在主窗口初始化的时候同时创建子窗口,并使其不显示ShowWindow(FALSE);
进入主对话框后,双击按钮,然后做二件事,一是隐蔽自身主窗口,二是显示子窗口指针变量
在调用子窗口后要做的二件事,隐蔽自身窗口,显示主窗口GetParent()->ShowWindow(TRUE).
思路就是这样啦
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式