Search code examples
c++winapivisual-c++mfcwinpe

Painting Issue when selecting file using CFileDialog


I am facing an issue using CFileDialog in my code.

When I call the CFileDialog from ModalDialog, to select a file. My whole ModalDialog background gets erased once the current view is exited and reopened.

Procedure followed:

  1. Main Dialog
  2. Opened ModalDialog
  3. Opened CFileDialog for selecting file
  4. Exit ModalDialog
  5. Reopen ModalDialog [Background gets erased]

Note : This issue happens only if I select a file. If I click on Cancel in the CFileDialog. There is no issue.

PFB, the code snippet of my CFileDialog use:

//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);

}

Solution

  • I have Found the reason behind the issue.

    When we save/select the file using CFileDialog, the default behavior is to change the WorkingDirectory of the running process.

    Due to this, the background image could not be found in the new location and Hence background getting erased.

    In order to ensure that this does not happen, we need to use the OFN_NOCHANGEDIR flag in CFileDialog, which retains the working directory.