使用CFileDialog选择文件时的绘画问题

时间:2016-10-27 07:38:59

标签: c++ winapi visual-c++ mfc winpe

我在代码中使用CFileDialog时遇到了问题。

当我从ModalDialog调用CFileDialog时,选择一个文件。 一旦当前视图退出并重新打开,我的整个ModalDialog背景就会被删除。

遵循程序:

  1. 主要对话
  2. 打开ModalDialog
  3. 已打开CFileDialog以选择文件
  4. 退出ModalDialog
  5. 重新打开ModalDialog [背景被删除]
  6. 注意:仅当我选择文件时才会出现此问题。 如果我点击CFileDialog中的取消。没有问题。

    PFB,我的CFileDialog使用的代码段:

    //This is the code to Open the DoModal dialog from MainWindow 
    //
    void CCommonDlg::OnBnClickedButton1()
    {
    
        COSDADlg dlg;
        //m_pMainWnd = &dlg;
        INT_PTR nResponse = dlg.DoModal();
        if (nResponse == IDOK)
        {
    
        }
        else if (nResponse == IDCANCEL)
        {
            // TODO: Place code here to handle when the dialog is
            //  dismissed with Cancel
        }
    
    }
    
    // This is the code for open CFileDialog from ModalDialog to save file
    //
    void COSDADlg::OnBnClickedButton1()
    {
    
            CFileDialog dlgFile(FALSE);
    
            CString fileName;
            dlgFile.GetOFN().lpstrFile = fileName.GetBuffer(FILE_LIST_BUFFER_SIZE);
            dlgFile.GetOFN().nMaxFile = FILE_LIST_BUFFER_SIZE;
    
    
            INT_PTR nResult = dlgFile.DoModal();
            fileName.ReleaseBuffer();   
    
    }
    
    //This is the code to paint the background image for ModalDialog
    //
    void COSDADlg::OnPaint()
    {
        CPaintDC dc(this); // device context for painting
    
        Graphics    graph(dc.m_hDC);
        CRect rt;
        GetWindowRect(&rt);
        graph.DrawImage(m_pImage, (INT)0, (INT)0,  (INT)rt.Width() , (INT)rt.Height() );
        DefWindowProc(WM_PAINT, (WPARAM)dc.m_hDC, (LPARAM)0);
    
    }
    

1 个答案:

答案 0 :(得分:2)

我找到了问题背后的原因。

当我们使用CFileDialog保存/选择文件时,默认行为是更改正在运行的进程的WorkingDirectory。

由于这个原因,在新位置找不到背景图像,因此背景被删除。

为了确保不会发生这种情况,我们需要在CFileDialog中使用OFN_NOCHANGEDIR标志,该标志会保留工作目录。