小弟最近按照书上的案例写了一个扩展打开对话框的功能,在这个对话框里添加显示文件的大小,文件名和扩展名,但是这个程序能编译成功,运行时打开对话框却弹出非法对话框,不知这是什么原因,部份源程序如下:
#if !defined(AFX_EXTENDFILEDLG_H__8B1C09CF_9108_4CF2_913D_6C29123A14F7__INCLUDED_)
#define AFX_EXTENDFILEDLG_H__8B1C09CF_9108_4CF2_913D_6C29123A14F7__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ExtendFileDlg.h : header file
///////////////////////////////////////////////////////////////////////////////
// CExtendFileDlg dialogclass CExtendFileDlg : public CFileDialog
{
// Construction
public:
CExtendFileDlg(CWnd* pParent = NULL);   // standard constructor// Dialog Data
//{{AFX_DATA(CExtendFileDlg)
enum { IDD = IDD_EXTEND_FILE_DIALOG };
CString m_sFName;
CString m_sExtName;
int m_nFSize;
//}}AFX_DATA
public:
virtual void OnFileNameChange();// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CExtendFileDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
//}}AFX_VIRTUAL// Implementation
protected: // Generated message map functions
//{{AFX_MSG(CExtendFileDlg)
virtual BOOL OnInitDialog();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_EXTENDFILEDLG_H__8B1C09CF_9108_4CF2_913D_6C29123A14F7__INCLUDED_)// ExtendFileDlg.cpp : implementation file
//#include "stdafx.h"
#include "Step.h"
#include "ExtendFileDlg.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CExtendFileDlg dialogCExtendFileDlg::CExtendFileDlg(CWnd * pParent):CFileDialog(TRUE,NULL,NULL,NULL)
{
//{{AFX_DATA_INIT(CExtendFileDlg)
m_sFName = _T("");
m_sExtName = _T("");
m_nFSize = 0;
//}}AFX_DATA_INIT m_ofn.lpstrFilter="Header Files(*.H)\0*.H\0Source Files(*.CPP)\0*.CPP\0All Files(*.*)\0*.*\0\0";
m_ofn.Flags=OFN_EXPLORER|OFN_ENABLETEMPLATE|OFN_ALLOWMULTISELECT|OFN_HIDEREADONLY;
m_ofn.lpTemplateName=MAKEINTRESOURCE(IDD_EXTEND_FILE_DIALOG);
}
void CExtendFileDlg::DoDataExchange(CDataExchange* pDX)
{
CFileDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CExtendFileDlg)
DDX_Text(pDX, IDC_FILE_NAME, m_sFName);
DDX_Text(pDX, IDC_EXT_NAME, m_sExtName);
DDX_Text(pDX, IDC_FILE_SIZE, m_nFSize);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CExtendFileDlg, CFileDialog)
//{{AFX_MSG_MAP(CExtendFileDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CExtendFileDlg message handlersBOOL CExtendFileDlg::OnInitDialog()          //最有可能出问题的地方,可是不知道怎么改!
{
CFileDialog::OnInitDialog();

// TODO: Add extra initialization here

return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}void CExtendFileDlg::OnFileNameChange()
{
CString fileName=GetPathName();
if(fileName.IsEmpty()){
m_nFSize=0;
m_sFName="";
m_sExtName="";
}
else {
CFile file(fileName.GetBuffer(fileName.GetLength()),CFile::modeRead);
m_nFSize=file.GetLength();
m_sFName=GetFileTitle();
m_sExtName=GetFileExt();
UpdateData(FALSE);
}
CFileDialog::OnFileNameChange();
}
请各位帮我看看,谢谢!
问题解决马上结贴!

解决方案 »

  1.   

    BOOL CExtendFileDlg::OnInitDialog()          //最有可能出问题的地方,可是不知道怎么改!
    {
    CFileDialog::OnInitDialog();

    // TODO: Add extra initialization here

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }BOOL CExtendFileDlg::OnInitDialog()          //最有可能出问题的地方,可是不知道怎么改!
    {
    CFileDialog::OnInitDialog();

    // TODO: Add extra initialization here

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }你这个里面什么 都没写啊!!
    出什么问题!?void CExtendFileDlg::OnFileNameChange()
    这个函数在什么时候调用!!??作为普通的对话框]
    应该 可以,但是作为filedlg
    我没做过,所以也不知道!!
    你设置断点,看看使那里出错!!
      

  2.   

    CFile file你定义了一个file,但是没看到Open,和,read,以及Close
    是不是这里 有问题!!
      

  3.   

    你的构造函数有问题吧。我是这么做扩展对话框的,你参考一下:
    .h文件:(片断)
    class CFilePlay : public CFileDialog
    {
    public:
    bool m_bCanRead;
    DWORD m_nTextWords;
    public:
    CFilePlay (BOOL bOpenFileDialog, 
    LPCTSTR lpszDefExt = NULL,
    LPCTSTR lpszFileName = NULL,
    DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
    LPCTSTR lpszFilter = NULL,
    CWnd* pParentWnd = NULL);
    ///////////////////////////
    .cpp文件(片断)
    CFilePlay::CFilePlay(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
    DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
    CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)
    {
    //{{AFX_DATA_INIT(CFilePlay)
    m_bPreview = FALSE;
    //}}AFX_DATA_INIT
    m_ofn.Flags|=(OFN_EXPLORER | OFN_ENABLETEMPLATE);
    m_ofn.Flags&=~OFN_ENABLESIZING;
    m_ofn.lpTemplateName =MAKEINTRESOURCE(IDD_FILEPLAY);
    m_ofn.lpstrTitle ="文件排版";
    ///
    }
      

  4.   

    同意,happyparrot(快乐鹦鹉)你自己搞了一个construct 是不行的,先看看CFileDialog class
      

  5.   

    这写的是重新建一个对话框,里面设计一个静态框,命名为stc32,让打开对话框显示在这个框里,书上面在BOOL CExtendFileDlg::OnInitDialog()里面没有加代码,但我不知怎么加?希望各位能帮我看看!
      

  6.   

    给代码看看?你可以得到它的指针
    CString str;
    str.Format("%d,%f",i,j);
    CWnd * pWnd = GetDlgItem( ID_STATIC_..);
    pWNd->SetWindowText(str);//设置显示的文本!
      

  7.   

    代码我已经全部贴上来了!除了在MainFrm.cpp,加了下面的代码:
    void CMainFrame::OnActionsFiledlg() 
    {
    // TODO: Add your command handler code here
    CExtendFileDlg dlg;
    dlg.DoModal();
    }
    谢谢帮忙!