mfc 时钟 OnTimer 非静态成员函数的非法调用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mfc 时钟 OnTimer 非静态成员函数的非法调用相关的知识,希望对你有一定的参考价值。

我想制作一个自动走的时钟,在OnTimer里却出现如下问题,给怎么改?我使用的是vs2013,同学的vc可以正常执行,我的却不可以,不知道为什么

CView一行去掉,不能这样调用。
对话框定时器只需要CDialogEx的基类调用就可以了,不能调用CView的。

你需要的功能是什么?如果是更新对话框界面,那么不需要CView这一行;
如果需要更新View视图界面,更不能这样调用,这样是无效的,你看到这条语句的地方必须是在某个View视图的定时器函数中,因为它的功能只是调用基类的虚函数处理。追问

调用CDialogEX为同样的错误

追答

这个OnTimer函数,应该是通过对话框类事件自动添加的,如果你只剩下最后一行,是不会有错误的(除非你其它方法上有问题)。

void CAboutDlg::OnTimer(UINT_PTR nIDEvent)

// TODO: 在此添加消息处理程序代码和/或调用默认值

CDialog::OnTimer(nIDEvent);

这就是自动添加的代码,运行不会有问题。

追问

是不会有问题,但是不能实现功能啊,我需要的就是更新视图界面,让那个秒针自己动,而不是最小化再还原的时候界面才刷新一下

追答

你先描述一下你的完整需求吧。
从你现在的描述和需求,我只看到,你在“关于”对话框里面做定时器。那么,你要开着About对话框看视图View界面的更新?这不合理。
首先你要清楚,时针显示在哪里,是对话框还是视图,在哪里显示用哪个的定时器。
如果是对话框显示,那么很简单,在对话框定时器对显示控件进行更新就可以了,关键还是看时钟放在哪里,不同地方更新方式不同。

参考技术A 在另一个类里调用了另外一个类的保护成员变量是不可的。除非另外一个类把这个类声明为友元类追问

能告诉我该如何操作吗?新手不知道如何操作

追答

我看来你的代码,为什么在这里调用
CView::OnTimer(nIDEvent);
调用他没有任何意义,CView::OnTimer(nIDEvent);函数什么都不干,在这里调用他没有任何意义
代码的错误就在这一句
CView::OnTimer(nIDEvent);

参考技术B CView::OnTimer 改为
::OnTimer试试看追问

改后还是报错:全局范围没有OnTimer

MFC中多线程中静态函数调用成员函数的问题

刚学多线程,想实现一个很简单的例子,就是建立一个基于对话框的工程,然后在工程中添加一个按钮和编辑框,我想使用多线程,在点击按钮的时候,主线程会将一句话显示到编辑框中,新创建的线程则弹出一个消息框,显示子线程也运行了。我是用了CreateThread,其第三个参数申明为静态的,而不是全局的,然后我该如何申明CXXXDlg这个类的一个对象,调用messagebox?

参考技术A 做个转换,定义两个相个函数:static DWORD WINAPI FuncA(LPVOID p)和DWORD FuncB()

DWORD CXXXDlg::FuncA(LPVOID p)

CXXXDlg* pPara=(CXXXDlg*)p;
return pPara->FuncB();

//真正的线程函数
DWORD CXXXDlg::FuncB()

AfxMessageBox(_T(""));
return 0;


CreateThread(NULL,0,FuncA,this,0,NULL);

以上是关于mfc 时钟 OnTimer 非静态成员函数的非法调用的主要内容,如果未能解决你的问题,请参考以下文章

C++ 非静态成员函数的非法调用

MFC中静态成员函数调用其他类的非静态变量

MFC 中,全局SetTimer函数怎么用?

非静态成员作为非静态成员函数的默认参数[重复]

visual C++中error C2352是啥意思

MFC中多线程中静态函数调用成员函数的问题