none
【3】书本上的例子,编译的时候出问题了,请指教 RRS feed

  • 问题

  • (1) 新建一个基于对话框的MFC程序,命名为Dialog_C。删除对话框中原有控件。

    (2)通过MFC类向导创建对话框类FileDlgEx,通过添加成员变量向导添加变量m_ctrSta,变量类型选择CStatic。在Dialog_C.cpp文件头部输入以下代码:

    #include "FileDlgEx.h"

    在FileDlgEx::OnInitDialog()函数中输入以下代码:

    BOOL FileDlgEx::OnInitDialog()
    {
                                   //其他初始化
    CRect rect;
    CWnd * wndDlg=GetParent();     //获取父窗口句柄
    SetTimer(1,200,NULL);            //设置定时器
    wndDlg->GetWindowRect(&rect);       //获取窗口尺寸
    wndDlg->SetWindowPos(NULL,0,0,rect.right-rect.left,rect.bottom-rect.top+50,SWP_NOMOVE);
    //设置静态控件尺寸和位置
    rect.top+=30;
    rect.bottom-=220;
    rect.left=90;
    rect.right=200;
    //创建静态控件
    m_ctrSta.Create(_T("00:00:00"),WS_THICKFRAME|WS_CHILD|WS_VISIBLE,rect,wndDlg,4);
    return TRUE;
    }

    在FileDlgEx::OnTimer()函数中输入以下代码:

    void FileDlgEx::OnTimer(UINT_PTR nIDEvent)
    {
    CTime tmCurr;
    CString strTime;
    CWnd * wndDlg=GetParent();
    tmCurr=CTime::GetCurrentTime();     //获取系统当前时间
    strTime=tmCurr.Format("%H:%M:%S");       //时间格式化后将其赋给字符串
    wndDlg->SetDlgItemText(4,strTime);
    CFileDialog::OnTimer(nIDEvent);
    }

    【输出框显示如下】

    1>------ 已启动生成: 项目: Dialog_C, 配置: Debug Win32 ------
    1>正在编译...
    1>FileDlgEx.cpp
    1>d:\my documents\visual studio 2005\projects\dialog_c\dialog_c\filedlgex.cpp(42) : error C2065: “m_ctrSta”: 未声明的标识符
    1>d:\my documents\visual studio 2005\projects\dialog_c\dialog_c\filedlgex.cpp(42) : error C2228: “.Create”的左边必须有类/结构/联合
    1>        类型是“'unknown-type'”
    1>d:\my documents\visual studio 2005\projects\dialog_c\dialog_c\filedlgex.cpp(54) : error C2248: “CWnd::OnTimer”: 无法访问 protected 成员(在“CWnd”类中声明)
    1>        f:\软件\microsoft vs 2005\vc\atlmfc\include\afxwin.h(2657) : 参见“CWnd::OnTimer”的声明
    1>        f:\软件\microsoft vs 2005\vc\atlmfc\include\afxwin.h(1973) : 参见“CWnd”的声明
    1>d:\my documents\visual studio 2005\projects\dialog_c\dialog_c\filedlgex.cpp(54) : error C2352: “CWnd::OnTimer”: 非静态成员函数的非法调用
    1>        f:\软件\microsoft vs 2005\vc\atlmfc\include\afxwin.h(2657) : 参见“CWnd::OnTimer”的声明
    1>生成日志保存在“file://d:\My Documents\Visual Studio 2005\Projects\Dialog_C\Dialog_C\Debug\BuildLog.htm”
    1>Dialog_C - 4 个错误,0 个警告
    ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

    2015年9月25日 5:16

全部回复

  • 您好,

    m_ctrSta变量在未声明前就去使用它,会导致未声明的标识符错误。请确保在FileDlgEx.h中可以找得到m_ctrSta的定义。

    Amor

    2015年9月25日 9:37
  • 谢谢你,原来我把成员变量放到对话框类里面了。改了之后还有两个错误,如下:

    1>------ 已启动生成: 项目: Dialog_C, 配置: Debug Win32 ------
    1>正在编译...
    1>FileDlgEx.cpp
    1>d:\my documents\visual studio 2005\projects\dialog_c\dialog_c\filedlgex.cpp(54) : error C2248: “CWnd::OnTimer”: 无法访问 protected 成员(在“CWnd”类中声明)
    1>        f:\软件\microsoft vs 2005\vc\atlmfc\include\afxwin.h(2657) : 参见“CWnd::OnTimer”的声明
    1>        f:\软件\microsoft vs 2005\vc\atlmfc\include\afxwin.h(1973) : 参见“CWnd”的声明
    1>d:\my documents\visual studio 2005\projects\dialog_c\dialog_c\filedlgex.cpp(54) : error C2352: “CWnd::OnTimer”: 非静态成员函数的非法调用
    1>        f:\软件\microsoft vs 2005\vc\atlmfc\include\afxwin.h(2657) : 参见“CWnd::OnTimer”的声明
    1>正在生成代码...
    1>正在编译...
    1>Dialog_C.cpp
    1>正在生成代码...
    1>生成日志保存在“file://d:\My Documents\Visual Studio 2005\Projects\Dialog_C\Dialog_C\Debug\BuildLog.htm”
    1>Dialog_C - 2 个错误,0 个警告
    ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========

    2015年9月27日 2:41
  • Hi,

       请问你在FileDlgEx::OnTimer()函数中最后一行CFileDialog::OnTimer(nIDEvent);里调用的CFileDialog类是哪个窗口的类呢?

       你是否遵循了以下的步骤添加OnTimer函数呢?

             1.      FileDlgEx对话框打开类向导,选中message(消息), 在下面的消息项中选择WM_TIMER,点击”Add Handler(添加)

             2.      在显示的FileDlgEx::OnTimer方法中添加代码,注意不要改动该方法段的最后一句。

                       void FileDlgEx::OnTimer(UINT_PTR nIDEvent)

                       {

                                // TODO: Add your message handler code here and/or call default

     

                                CDialog::OnTimer(nIDEvent);

                       }

    2015年9月30日 3:23
  • 【抱歉,这么久我才回复您】

    关于OnTimer,我只发现了下面这个:

    void CDialog_CDlg::OnTimer(UINT_PTR nIDEvent)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    CDialog::OnTimer(nIDEvent);
    }

    你说的“FileDlgEx对话框打开类向导,”,可是对话框里面的消息是上面这样的……

    2015年10月23日 8:08
  • 上一条回复看见吗?在?
    2015年10月24日 1:23
  • chchlll在吗?
    2015年11月12日 2:30
  • 我觉得可能是操作的一些问题,因为这个题目表义确实不是很清晰,因为题目说的是创建的是对话框类FileDlgEx,

    所以你发现的不应该是CDialog_CDlg类的这个ONTIMER,

    而应该是FileDlgEx的OnTimer。

    本来想把我做的一步步截图贴给你的,过程有点太繁琐,一直被打岔了。你的问题还没有解决吗?

    2015年11月12日 5:21