我想调用一个类函数作为我的计时器的回调,但它正在修复。我试着做的另一种方法是将一个函数指针复制到项目中的另一个cpp文件,这样有人告诉我这里有什么问题。
标头包含文件程序:
class Progc:
public IStorage
{
public:
Processor(HWND Hwnd);
static void CALLBACK ClickCall(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime);
};
Timecatch.cpp文件程序
void CALLBACK Progc::ClickCall(HWND hwnd, UINT uMsg, UINT timerId, DWORD dwTime)
{
RECT rcOwner;
GetWindowRect(hwnd, &rcOwner);
SetCursorPos((rcOwner.top), (rcOwner.left));
this->Action();
KillTimer(hwnd, 0);
}
我得到的错误是
error C2671: 'Progc::ClickCall' : static member functions do not have 'this' pointers
error C2227: left of '->Action' must point to class/struct/union/generic type
继续Timecatch.cpp文件程序
void Progc::Action()
{
SetTimer(hWndParent, 0, 6000,(TIMERPROC) &this->ClickCall);
}
接下来是另一个文件程序文件名Program.cpp
Progc *ProgBr1;
ProgBr1 = new Processor(hWnd);
我想做的很简单,我希望在定时器调用该函数之后从Action()
函数调用ClickCall(....)
函数,或者使用其他方式或者使用ProgBr1指针,就像我使用ProgBr1来从Program.cpp调用Action。
ProgBr1->Action();
但我不能使另一个变量初始化并使用
获取指针ProgBr1 = new Processor(hWnd);
那么有没有办法制作另一个指针数据并将ProgBr1值复制到它并在Timecatch.cpp文件中使用它?
真的很困惑,对c ++很新。如果我得到任何更新,将在此处发布。
答案 0 :(得分:3)
错误消息非常清楚地告诉您错误:
static member functions do not have 'this' pointers`
这意味着对this->Action();
的调用是非法的。回调函数必须为static
,编译器不会向static
函数传递隐藏的this
指针。换句话说,static
函数不与类的特定实例相关联,而是与该类的所有对象相关。
遗憾的是,无法将任意数据传递给Windows计时器回调函数。 SetTimer
没有LPARAM
或等效参数。
为了使此代码有效,您必须将指针存储在与计时器关联的窗口中。您可以使用例如SetProp()
。
或者,如果您有多个与单个窗口关联的计时器,则不会很好地扩展。在这种情况下,您可以使用静态集合(例如std::map
)来跟踪您想要与计时器关联的数据指针。的ID。
编辑:假设您的示例代码实际上就是您正在做的事情,而不仅仅是一个人为的示例,看起来您可以使代码基本上工作"内联"调用Action
成员函数。我不确定这会做什么,但它会编译并运行。也许现在可能是一个很好的地方指出,我很不清楚这段代码的目的是什么。您是否只是尝试连续轮询并设置光标位置?这是荒谬的毫无意义。我所要做的就是移动鼠标并重新拧紧。您将不得不经常运行计时器,徒劳地尝试修复鼠标指针位置,这会破坏性能并惹恼每个人。请尝试拔掉鼠标。
答案 1 :(得分:0)
用static标记的函数实际上是静态函数。它可以被称为Progc::ClickCall(...)
并且没有这个指针并且没有对象引用。它就像通常的函数,但在类的命名空间中。
需要删除static
并将其设为非静态类成员。如果你需要静态函数,那么你需要通过param将this
传递给静态函数,或者使用singleton并从singleton中获取类引用。