如何在System.Windows.Forms.Timer定时器中调用自定义成员函数
错误原因
你当前使用的TimerEventProcessor回调方法是static静态成员,静态成员属于类本身,不绑定具体的类实例。而你自定义的draw1是MyForm类的普通成员函数,必须依赖MyForm的实例对象才能调用,因此在静态回调中直接调用draw1()会报标识符未定义的错误。
解决方法(优先选第一种,更适配WinForm开发场景)
方法1:将Timer相关成员改为非静态
删掉TimerEventProcessor、myTimer、alarmCounter、exitFlag前的static修饰符,改为MyForm类的普通成员,修改后的回调代码如下:
private: System::Windows::Forms::Timer^ myTimer = gcnew System::Windows::Forms::Timer; int alarmCounter = 1; bool exitFlag = false; // 去掉static修饰符,改为普通成员方法 void TimerEventProcessor( Object^ /*myObject*/, EventArgs^ /*myEventArgs*/ ) { myTimer->Stop(); // 直接调用draw1即可 draw1(); // 原有逻辑保持不变 if ( MessageBox::Show( "Continue running?", String::Format( "Count is: {0}", alarmCounter ), MessageBoxButtons::YesNo ) == DialogResult::Yes ) { alarmCounter += 1; myTimer->Enabled = true; } else { exitFlag = true; } }
修改Timer事件绑定逻辑,绑定当前实例的回调方法:
myTimer->Tick += gcnew EventHandler(this, &Practform::MyForm::TimerEventProcessor);
方法2:保留静态回调,传入MyForm实例
如果有特殊要求必须保留静态回调,可以通过Timer的Tag属性传递实例:
- 绑定Timer事件前,先将当前Form实例存入Tag:
myTimer->Tag = this;
- 在静态回调中取出实例再调用
draw1:
static void TimerEventProcessor( Object^ myObject, EventArgs^ /*myEventArgs*/ ) { System::Windows::Forms::Timer^ sender = safe_cast<System::Windows::Forms::Timer^>(myObject); sender->Stop(); // 取出Form实例调用自定义方法 Practform::MyForm^ formInst = safe_cast<Practform::MyForm^>(sender->Tag); formInst->draw1(); // 原有逻辑保持不变 if ( MessageBox::Show( "Continue running?", String::Format( "Count is: {0}", alarmCounter ), MessageBoxButtons::YesNo ) == DialogResult::Yes ) { alarmCounter += 1; sender->Enabled = true; } else { exitFlag = true; } }
额外注意
检查draw1方法的访问修饰符,若设置为private仅允许同类成员调用,若需要跨类调用需改为public或添加友元声明。
内容的提问来源于stack exchange,提问作者user17059077
相关产品推荐
相关产品推荐

