使用 CFileDialog 选择文件时的绘画问题
Painting Issue when selecting file using CFileDialog
我在代码中使用 CFileDialog
时遇到问题。
当我从 ModalDialog 调用 CFileDialog
时,到 select 一个文件。
一旦退出并重新打开当前视图,我的整个 ModalDialog 背景就会被删除。
遵循的程序:
- 主对话框
- 已打开 ModalDialog
- 打开
CFileDialog
selecting 文件
- 退出模态对话框
- 重新打开 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标志,它保留了工作目录。
我在代码中使用 CFileDialog
时遇到问题。
当我从 ModalDialog 调用 CFileDialog
时,到 select 一个文件。
一旦退出并重新打开当前视图,我的整个 ModalDialog 背景就会被删除。
遵循的程序:
- 主对话框
- 已打开 ModalDialog
- 打开
CFileDialog
selecting 文件 - 退出模态对话框
- 重新打开 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标志,它保留了工作目录。