2016-10-27 2 views
2

В моем коде есть проблема с использованием CFileDialog.Ошибка окраски при выборе файла с использованием CFileDialog

Когда я вызываю CFileDialog из ModalDialog, выберите файл. Весь мой фон ModalDialog удаляется, как только текущий вид открывается и снова открывается.

Процедуры, применявшиеся:

  1. Главный диалог
  2. Открылся MODALDIALOG
  3. Открыт CFileDialog для выбора файла
  4. Выход ModalDialog
  5. Reopen MODALDIALOG [Фон стирается]

Примечание: Эта проблема возникает, только если я выбираю файл. Если я нажму «Отмена» в поле 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); 

} 
+2

'DefWindowProc (WM_PAINT, (WPARAM) dc.m_hDC, (LPARAM) 0);' выглядит подозрительно для меня, попробуйте удалить его. –

+0

@MichaelWalz: Я попробовал ваше предложение об удалении функции DefWindowProc. Но он не решает проблему, По внешнему виду, я не думаю, что это проблема с художником. Кажется, что больше связано с CFileDialog. Просто повторить повтор, это не происходит, когда я просто отменил CFileDialog. Скорее всего, только когда я выбираю файл из него и сохраняю. –

+0

В вашем коде есть ошибка, но мы ее не видим. Тот факт, что вы вызываете оконную процедуру из обработчика 'WM_PAINT', показывает тревожное отсутствие понимания, как работает MFC. Я был бы удивлен, если бы это была твоя единственная ошибка. – IInspectable

ответ

2

Я Найденный причиной проблемы.

Когда мы сохраняем/выбираем файл с помощью CFileDialog, поведение по умолчанию заключается в изменении WorkDirectory текущего процесса.

Из-за этого фоновое изображение не может быть найдено в новом месте и, следовательно, фон будет стертым.

Для того, чтобы этого не произошло, мы должны использовать флаг OFN_NOCHANGEDIR в CFileDialog, который сохраняет рабочий каталог.