VC 弹出对话框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC 弹出对话框相关的知识,希望对你有一定的参考价值。

有两个对话框
子对话框:CGuarantee_Slip_SeeDlg
父对话框:CIPDDlg
主对话框中一个按扭的单击函数:
void CIPDDlg::OnGuaranteeSlipSee()

// TODO: Add your control notification handler code here

问题:如何让单击这个按扭的时候,弹出子对话框,且子对话框覆盖父对话框。
请详细一点,我才学VC两周,谢谢指点!
函数里面应该如何写?
我想让子对话框覆盖父对话框,也就是单击后,让子对话框把父对话框完全摭住
那样并没有什么效果,因为我并没有为对话框指定大小,我是把父对话框与子对话框随意的拖动大小 ,但是父对话框比子对话框大,子对话框弹出来的时候并不能摭住父对话框,也就是对话框的一个缩放功能,如果在单击弹出子对话框后,能把父对话框缩小或者把子对话框放大,这样应该也可以实现功能,但具体怎么做我不知道,还有,如果把子对话框变大,如何才能做他的按钮随对话框的变大而不影响布局

参考技术A 嗯 第一个问题 子对话框覆盖父对话框的问题
利用子对话框的缩放
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 如何点下按钮弹出一个子对话框并在子对话框上显示图片

关于VC弹出选择文件夹对话框

vc编程DoModal弹不出对话框

急急急!!请问各位高手:为啥VC生成的release版本在无VC环境的机器上不能弹出对话框?

VC++ MFC关于全局勾子的执行次数问题,高手帮助!成功调用以后,按下F9会弹出两次对话框,求解?只要执行一

请教实现android工程中点击菜单弹出一个对话框