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

Painting Issue when selecting file using CFileDialog

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

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

遵循的程序:

  1. 主对话框
  2. 已打开 ModalDialog
  3. 打开 CFileDialog selecting 文件
  4. 退出模态对话框
  5. 重新打开 ModalDialog [背景被删除]

注意: 只有当我 select 文件时才会出现此问题。 如果我在 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);

}

我已经找到问题背后的原因。

当我们 save/select 使用 CFileDialog 的文件时,默认行为是更改 运行 进程的 WorkingDirectory。

因此,无法在新位置找到背景图像,因此背景被删除。

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