自己建了一个单文档MFC程序,添加了一些程序后,发现无法执行OnAppAbout(),其他的都正常,就是弹不出来关于窗口,而且ToolBar也添加不了多余了,任意添加就提示“标识中含有非法字符,请输入一个有效字符”,找了好几天都没有发现原因所在,请高手帮忙!

解决方案 »

  1.   

    BEGIN_MESSAGE_MAP(CCnEarthApp, CWinApp)
    //{{AFX_MSG_MAP(CCnEarthApp)
    ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
    // NOTE - the ClassWizard will add and remove mapping macros here.
    //    DO NOT EDIT what you see in these blocks of generated code!
    //}}AFX_MSG_MAP
    // Standard file based document commands
    ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
    ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
    // Standard print setup command
    ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CCnEarthApp constructionCCnEarthApp::CCnEarthApp()
    {
    // TODO: add construction code here,
    // Place all significant initialization in InitInstance
    }/////////////////////////////////////////////////////////////////////////////
    // The one and only CCnEarthApp objectCCnEarthApp theApp;/////////////////////////////////////////////////////////////////////////////
    // CCnEarthApp initializationBOOL CCnEarthApp::InitInstance()
    {/*
    { // BLOCK: doc template registration
    // Register the document template.  Document templates serve
    // as the connection between documents, frame windows and views.
    // Attach this form to another document or frame window by changing
    // the document or frame class in the constructor below.
    CSingleDocTemplate* pNewDocTemplate = new CSingleDocTemplate(
    IDR_LEFTOPTION_TMPL,
    RUNTIME_CLASS(CCnEarthDoc), // document class
    RUNTIME_CLASS(CMainFrame), // frame class
    RUNTIME_CLASS(CLeftOption)); // view class
    AddDocTemplate(pNewDocTemplate);
    }*/
    AfxEnableControlContainer(); // Standard initialization
    // If you are not using these features and wish to reduce the size
    //  of your final executable, you should remove from the following
    //  the specific initialization routines you do not need.#ifdef _AFXDLL
    Enable3dControls(); // Call this when using MFC in a shared DLL
    #else
    Enable3dControlsStatic(); // Call this when linking to MFC statically
    #endif // Change the registry key under which our settings are stored.
    // TODO: You should modify this string to be something appropriate
    // such as the name of your company or organization.
    SetRegistryKey(_T("Local AppWizard-Generated Applications")); LoadStdProfileSettings();  // Load standard INI file options (including MRU) // Register the application's document templates.  Document templates
    //  serve as the connection between documents, frame windows and views. CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CCnEarthDoc),
    RUNTIME_CLASS(CMainFrame),       // main SDI frame window
    RUNTIME_CLASS(CCnEarthView));
    AddDocTemplate(pDocTemplate); // Parse command line for standard shell commands, DDE, file open
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo); // Dispatch commands specified on the command line
    if (!ProcessShellCommand(cmdInfo))
    return FALSE; // The one and only window has been initialized, so show and update it.
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow(); return TRUE;
    }
    /////////////////////////////////////////////////////////////////////////////
    // CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog
    {
    public:
    CAboutDlg();// Dialog Data
    //{{AFX_DATA(CAboutDlg)
    enum { IDD = IDD_ABOUTBOX };
    //}}AFX_DATA // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CAboutDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL// Implementation
    protected:
    //{{AFX_MSG(CAboutDlg)
    // No message handlers
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    //{{AFX_DATA_INIT(CAboutDlg)
    //}}AFX_DATA_INIT
    }void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    //}}AFX_DATA_MAP
    }BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //{{AFX_MSG_MAP(CAboutDlg)
    // No message handlers
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()// App command to run the dialog
    void CCnEarthApp::OnAppAbout()
    {
    CAboutDlg aboutDlg;
    aboutDlg.DoModal();
    }/////////////////////////////////////////////////////////////////////////////
    // CCnEarthApp message handlers
    CCnEarthApp.cpp
      

  2.   


    IMPLEMENT_DYNCREATE(CCnEarthDoc, CDocument)BEGIN_MESSAGE_MAP(CCnEarthDoc, CDocument)
    //{{AFX_MSG_MAP(CCnEarthDoc)
    // NOTE - the ClassWizard will add and remove mapping macros here.
    //    DO NOT EDIT what you see in these blocks of generated code!
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CCnEarthDoc construction/destructionCCnEarthDoc::CCnEarthDoc()
    {
    // TODO: add one-time construction code here}CCnEarthDoc::~CCnEarthDoc()
    {
    }BOOL CCnEarthDoc::OnNewDocument()
    {
    if (!CDocument::OnNewDocument())
    return FALSE; // TODO: add reinitialization code here
    // (SDI documents will reuse this document) return TRUE;
    }/////////////////////////////////////////////////////////////////////////////
    // CCnEarthDoc serializationvoid CCnEarthDoc::Serialize(CArchive& ar)
    {
    if (ar.IsStoring())
    {
    // TODO: add storing code here
    }
    else
    {
    // TODO: add loading code here
    }
    }/////////////////////////////////////////////////////////////////////////////
    // CCnEarthDoc diagnostics#ifdef _DEBUG
    void CCnEarthDoc::AssertValid() const
    {
    CDocument::AssertValid();
    }void CCnEarthDoc::Dump(CDumpContext& dc) const
    {
    CDocument::Dump(dc);
    }
    #endif //_DEBUG/////////////////////////////////////////////////////////////////////////////
    // CCnEarthDoc commands
    CCnEarthDoc.cpp
      

  3.   

    IMPLEMENT_DYNCREATE(CCnEarthView, CView)BEGIN_MESSAGE_MAP(CCnEarthView, CView)
    //{{AFX_MSG_MAP(CCnEarthView)
    // NOTE - the ClassWizard will add and remove mapping macros here.
    //    DO NOT EDIT what you see in these blocks of generated code!
    //}}AFX_MSG_MAP
    // Standard printing commands
    ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CCnEarthView construction/destructionCCnEarthView::CCnEarthView()
    {
    // TODO: add construction code here}CCnEarthView::~CCnEarthView()
    {
    }BOOL CCnEarthView::PreCreateWindow(CREATESTRUCT& cs)
    {
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs return CView::PreCreateWindow(cs);
    }/////////////////////////////////////////////////////////////////////////////
    // CCnEarthView drawingvoid CCnEarthView::OnDraw(CDC* pDC)
    {
    CCnEarthDoc* pDoc = (CCnEarthDoc*)CView::GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    }/////////////////////////////////////////////////////////////////////////////
    // CCnEarthView printingBOOL CCnEarthView::OnPreparePrinting(CPrintInfo* pInfo)
    {
    // default preparation
    return DoPreparePrinting(pInfo);
    }void CCnEarthView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    // TODO: add extra initialization before printing
    }void CCnEarthView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    // TODO: add cleanup after printing
    }/////////////////////////////////////////////////////////////////////////////
    // CCnEarthView diagnostics#ifdef _DEBUG
    void CCnEarthView::AssertValid() const
    {
    CView::AssertValid();
    }void CCnEarthView::Dump(CDumpContext& dc) const
    {
    CView::Dump(dc);
    }
    /*
    CCnEarthDoc* CCnEarthView::GetDocument() // non-debug version is inline
    {
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCnEarthDoc)));
    return (CCnEarthDoc*)m_pDocument;
    }*/
    #endif //_DEBUG
    CCnEarthView.cpp
      

  4.   

    class CMainFrame : public CFrameWnd
    {

    protected: // create from serialization only
    CMainFrame();
    DECLARE_DYNCREATE(CMainFrame)// Attributes
    public:// Operations
    public:// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CMainFrame)
    public:
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
    virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
    //}}AFX_VIRTUAL// Implementation
    public:
    CSplitterWnd m_wndSplitter;
    virtual ~CMainFrame();
    #ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
    #endifprotected:  // control bar embedded members
    CStatusBar  m_wndStatusBar;
    CToolBar    m_wndToolBar;// Generated message map functions
    protected:
    //{{AFX_MSG(CMainFrame)
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    // NOTE - the ClassWizard will add and remove member functions here.
    //    DO NOT EDIT what you see in these blocks of generated code!
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_MAINFRM_H__3F037053_F534_4C0F_88D0_B847F168FB4E__INCLUDED_)
    CMainFrame.cpp
      

  5.   

    class CLeftOption : public CFormView
    {
    protected:
    CLeftOption();           // protected constructor used by dynamic creation
    DECLARE_DYNCREATE(CLeftOption)// Form Data
    public:
    //{{AFX_DATA(CLeftOption)
    enum { IDD = IDD_LEFTOPTION_FORM };
    // NOTE: the ClassWizard will add data members here
    //}}AFX_DATA// Attributes
    public:// Operations
    public:// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CLeftOption)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL// Implementation
    protected:
    virtual ~CLeftOption();
    #ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
    #endif // Generated message map functions
    //{{AFX_MSG(CLeftOption)
    // NOTE - the ClassWizard will add and remove member functions here.
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_LEFTOPTION_H__EFD5F89C_D802_46AE_8BB5_8D96381E67C0__INCLUDED_)
    CLeftOption.cpp
      

  6.   

    以上是所有的代码,我就是为了在单文档MFC工程中形成左右格局,坐标是一些操作的tree,右边是显示数据的地方,能正常运行,但是如果编辑toolbar资源,只要添加一个新的按钮就会弹出一个对话框"标识中含有非法字符,请输入一个有效的字符!",单文档自身带动按钮可以编辑!而且按钮资源是新添加到,还没有设置ID!
      

  7.   

    我发现在单文档中任意添加一个View,原来的toolbar资源图标添加的时候就会出错!盼帮忙解答!