首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

VS2010 重载CFileDialog有关问题

2013-07-09 
VS2010 重载CFileDialog问题今天把XP VS2005工程下面的一个MFC程序弄到windows7下装的vs2010下编译,编译通

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

热点排行