VC 弹出对话框
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC 弹出对话框相关的知识,希望对你有一定的参考价值。
有两个对话框
子对话框:CGuarantee_Slip_SeeDlg
父对话框:CIPDDlg
主对话框中一个按扭的单击函数:
void CIPDDlg::OnGuaranteeSlipSee()
// TODO: Add your control notification handler code here
问题:如何让单击这个按扭的时候,弹出子对话框,且子对话框覆盖父对话框。
请详细一点,我才学VC两周,谢谢指点!
函数里面应该如何写?
我想让子对话框覆盖父对话框,也就是单击后,让子对话框把父对话框完全摭住
那样并没有什么效果,因为我并没有为对话框指定大小,我是把父对话框与子对话框随意的拖动大小 ,但是父对话框比子对话框大,子对话框弹出来的时候并不能摭住父对话框,也就是对话框的一个缩放功能,如果在单击弹出子对话框后,能把父对话框缩小或者把子对话框放大,这样应该也可以实现功能,但具体怎么做我不知道,还有,如果把子对话框变大,如何才能做他的按钮随对话框的变大而不影响布局
利用子对话框的缩放
1.进入子类的OnInitialDialog()这个函数以后,在这里,用GetParent能够获得父对话框的指针,没错吧。有了父对话框的指针,那么父对话框的窗口位置及大小我们就知道了,对吧?然后我们在这里写上MoveWindow(....)... e 当然是Move子对话框咯。这里要填 左上角x,y以及高和宽,这里的x,y起始与父窗口的左上角...嗯 具体MSDN去
第二个问题 页面布局
嗯.在vb和C#有自动调整布局的功能,那么vc呢 需要你自己去用程序实现了。
重载Onsize函数,等你对话框缩放时,会触发这个函数,假设里面有很多控件,也需要按比例缩放,那么,你就在这个函数里面,按照比例计算一下,一个个控件去MoveWindow吧。 参考技术B 用DoModal()就可达到遮住效果,但如果要让父对话框隐藏,那就最好用非模态对话框。
CGuarantee_Slip_SeeDlg dlg;
dlg.DoModal();
当然要包含Guarantee_Slip_SeeDlg.h头文件
CRect rc,rcScreen;
GetWindowRect(&rc);
int nWidth=rc.Width();
int nHeight=rc.Height();
int nWidthScreen=::GetSystemMetrics(SM_CXSCREEN); //屏幕宽
int nHeightScreen=::GetSystemMetrics(SM_CYSCREEN); //屏幕高
MoveWindow((nWidthScreen-nWidth)/2,(nHeightScreen-nHeight)/2,nWidth,nHeight);
修改nWidth和nHeight,便可修改窗口长和宽;
找到控件指针,用同样的方法移动窗口中的控件位置。 参考技术C 最简单的办法是暂时隐藏父窗体
void CIPDDlg::OnGuaranteeSlipSee()
ShowWindow(SW_HIDE );
CGuarantee_Slip_SeeDlg mdlg(this);
mdlg.DoModal();
ShowWindow(SW_SHOWNORMAL );
本回答被提问者采纳
关于VC弹出选择文件夹对话框
VC编程中经常需要弹出选择文件夹对话框供用户选择目标文件夹
基本实现的源码如下:
1 void CTestDlg::OnBtnTest() 2 { 3 // TODO: Add your control notification handler code here 4 TCHAR pszPath[MAX_PATH]; 5 BROWSEINFO bi; 6 bi.hwndOwner = this->GetSafeHwnd(); 7 bi.pidlRoot = NULL; 8 bi.pszDisplayName = NULL; 9 bi.lpszTitle = TEXT("请选择文件夹"); 10 bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT; 11 bi.lpfn = NULL; 12 bi.lParam = 0; 13 bi.iImage = 0; 14 15 LPITEMIDLIST pidl = SHBrowseForFolder(&bi); 16 if (pidl == NULL) 17 { 18 return; 19 } 20 21 if (SHGetPathFromIDList(pidl, pszPath)) 22 { 23 AfxMessageBox(pszPath); 24 } 25 }
这一般均能够满足要求,但有时还是需要在此基础上增强一些功能。
比如在弹出选择文件夹对话框时选中默认的文件夹,或在STATUSTEXT区域显示一些信息等等。这需要在BrowseCallbackProc回调函数中实现。具体实现的源码如下:
(具体BrowseCallBackFun回调函数的用法请参照MSDN)
//选择文件夹对话框回调函数 int CALLBACK BrowseCallBackFun(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { switch(uMsg) { case BFFM_INITIALIZED: //选择文件夹对话框初始化 //设置默认路径为lpData即‘D:‘ ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData); //在STATUSTEXT区域显示当前路径 ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, lpData); //设置选择文件夹对话框的标题 ::SetWindowText(hwnd, TEXT("请先设置个工作目录")); break; case BFFM_SELCHANGED: //选择文件夹变更时 { TCHAR pszPath[MAX_PATH]; //获取当前选择路径 SHGetPathFromIDList((LPCITEMIDLIST)lParam, pszPath); //在STATUSTEXT区域显示当前路径 ::SendMessage(hwnd, BFFM_SETSTATUSTEXT, TRUE, (LPARAM)pszPath); } break; } return 0; } void CTestDlg::OnBtnTest() { // TODO: Add your control notification handler code here TCHAR pszPath[MAX_PATH]; BROWSEINFO bi; bi.hwndOwner = this->GetSafeHwnd(); bi.pidlRoot = NULL; bi.pszDisplayName = NULL; bi.lpszTitle = TEXT("请选择文件夹"); bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT; bi.lpfn = BrowseCallBackFun; //回调函数 bi.lParam = (LPARAM)TEXT("D:\"); //传给回调函数的参数,设置默认路径 bi.iImage = 0; LPITEMIDLIST pidl = SHBrowseForFolder(&bi); if (pidl == NULL) { return; } if (SHGetPathFromIDList(pidl, pszPath)) { AfxMessageBox(pszPath); } }
以上是关于VC 弹出对话框的主要内容,如果未能解决你的问题,请参考以下文章
急急急!!请问各位高手:为啥VC生成的release版本在无VC环境的机器上不能弹出对话框?