VS2010 重载CFileDialog问题
今天把XP VS2005工程下面的一个MFC程序弄到windows7下装的vs2010下编译,编译通过。
但是出现问题。
//.h
class CSpcialDialog : public CFileDialog
{
DECLARE_DYNAMIC(CSpcialDialog)
public:
CSpcialDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL);
virtual ~CSpcialDialog();
// 对话框数据
enum { IDD = IDD_DLG_FILESPECIAL };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
afx_msg void OnDelete();
public:
CString m_strFileName;
BOOL m_bDeleteAll;
};
// .cpp
#include "SpcialDialog.h"
// CSpcialDialog 对话框
IMPLEMENT_DYNAMIC(CSpcialDialog, CFileDialog)
CSpcialDialog::CSpcialDialog( BOOL bOpenFileDialog,
LPCTSTR lpszDefExt /*= NULL*/,
LPCTSTR lpszFileName /*= NULL*/,
DWORD dwFlags /*= OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT*/,
LPCTSTR lpszFilter /*= NULL*/,
CWnd* pParentWnd /*= NULL*/ )
: CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName,
dwFlags, lpszFilter, pParentWnd)
{
m_ofn.Flags |= OFN_ENABLETEMPLATE;
m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DLG_FILESPECIAL);
m_ofn.lpstrTitle = "Delete File";
m_bDeleteAll = FALSE;
}
CSpcialDialog::~CSpcialDialog()
{
}
void CSpcialDialog::DoDataExchange(CDataExchange* pDX)
{
CFileDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CSpcialDialog, CFileDialog)
ON_BN_CLICKED(IDC_BTN_DELETE, &CSpcialDialog::OnDelete)
END_MESSAGE_MAP()
BOOL CSpcialDialog::OnInitDialog()
{
BOOL bRet = CFileDialog::OnInitDialog();
if (TRUE == bRet)
{
GetParent()->GetDlgItem(IDOK)->SetWindowText(_T("删除"));
}
return bRet;
}
// CSpcialDialog 消息处理程序
void CSpcialDialog::OnDelete()
{
m_bDeleteAll = TRUE;
GetParent()->GetDlgItem(0x47C)->GetWindowText(m_strFileName);
GetParent()->SendMessage(WM_COMMAND, IDCANCEL);
}
资源中Dialog属性style设置成child,里面有一个group ID设置成stc32就是那个0x45f,用于包含FileDialog,还有一个Button。但是显示出来的就是FileDialog没有button
[解决办法]
调整下FileDialog的button位置,编译通过说明东西都在。可能换了编译环境位置不同了。
[解决办法]
http://www.codeproject.com/KB/dialog/imagepreviewdialog.aspx
是想定制CFileDialog对话框吗?可以参考一下这个?
------解决方案--------------------
用GetDlgItem(IDC_BTN_DELETE)测试一下有没有这个Button
如果有,用GetWindowsRect看一下button的位置
[解决办法]
自己重载CFileDialog和CDialog一样,不能再次绑定它与一个已有的对话框了,所以在你的代码中
enum { IDD = IDD_DLG_FILESPECIAL }; 这一句是无效的代码,它并不是你所相像的如果直接DoModal窗口就会显示,而必须像创建普通窗口一样,先创建再显示
1.CSpcialDialog dlg;
if(!IsWindow(dlg.m_hWnd)){ //如果dlg没有创建成功成为一个窗口
dlg.Create(窗口ID,this);
}
dlg.ShowWindow();