c ++在file.h和file.cpp中编写回调函数

时间:2014-04-28 17:08:02

标签: c++ windows callback

我需要编写一个回调函数,因为我将使用以下函数:

EnumChildWindows(windowHandle, EnumChildProc, 0);

其中第二个变量“EnumChildProc”需要是回调函数。

问题是我在头文件和源文件中编写函数时遇到了困难。通常当我写一个布尔函数或任何其他类型时,我会首先通过以下方式在头文件中对它进行delcare:

bool myFunction(int var1);

如果前一个文件在file.h中,我会在源文件中编写以下代码:

bool file::myFunction (int var1)
{
  ///here would be my code
}

但是使用回调函数我尝试执行以下操作并且它不起作用:

在file.h中:

BOOL CALLBACK EnumChildProc(HWND windowHandle, LPARAM lParam);

在file.cpp中:

BOOL file::CALLBACK EnumChildProc(HWND windowHandle, LPARAM lParam)
{
   ///code goes here
}

它不起作用,因为我收到以下错误:

error: expected unqualified-id before '__attribute__'

,错误引用源代码中的以下行:

BOOL programLoop::CALLBACK EnumChildProc(HWND windowHandle, LPARAM lParam)

任何想法我做错了什么?当我在头文件或源文件或某个地方声明回调函数时,我不知道我做错了什么...你们觉得怎么样?

1 个答案:

答案 0 :(得分:1)

CALLBACK只是一个宏,它将一个专门的Microsoft属性添加到一个函数声明中。仅在声明中使用它,而不是在使用该函数的地方使用它。

EnumChildWindows的第二个参数声明为WNDENUMPROC,声明为

    typedef BOOL (CALLBACK* WNDENUMPROC)(HWND, LPARAM);

所以你要将你的回调函数声明为

    BOOL CALLBACK myFunction (HWND w, LPARAM var1);

    BOOL CALLBACK file::myFunction (HWND w, LPARAM var1);

范围限定符:: 总是位于范围名称(在本例中为file)和从属名称(myFunction

之间

如果file是命名空间,那么您将全部设置;如果file是一个类,请记得在类中声明myFunction static。在某些情况下,您可能还需要extern

枚举子窗口时

    HWND hwparent=/* handle of the window you want to enumerate */;
    LPARAM var1=/* the value you want to pass in*/;

    EnumChildWindows (hwParent, myFunction, var1);

Windows为每个窗口调用您的函数,并传入w参数,以便您知道它是哪个窗口,var1这是您的参数。


至于何处:没有必要在头文件中声明myFunction。最有可能仅对EnumChildWindows 的调用使用myFunction。它不会从任何其他文件中调用。因此,只要{。1}}在.cpp文件中调用myFunction之前就可以了。

当然,如果EnumChildWindows是一个类,那么静态成员函数file必须位于类声明中,该声明通常位于某个标题的某个位置。

使用该功能时,只需添加myFunction,如果您调用它的位置不在file::(类或命名空间)范围内。

如果file是一个课程,您需要file来定义myFunction,但如果您在另一个地方调用file::,则不需要file::班级成员职能。

EnumChildWindows

如果 // .h file class file { private: HWND m_hwParent; static HRESULT myFunction (HWND hw, LPARAM arg1); public: HRESULT OnAllChildWindows (LPARAM arg1); // more stuff }; // .cpp file HRESULT file::myFunction (HWND hw, LPARAM arg1) { // whatever this does } HRESULT file::OnAllChildWindows (LPARAM arg1) { EnumChildWindows (m_hwParent, myFunction, arg1); } 是名称空间,如果您将所有代码包装在命名空间块中,则不需要file

file::

但如果你没有,或者它的范围不同:

  namespace file {

      HRESULT myFunction (HWND hw, LPARAM arg1) 
      {
       // whatever this does
      }

      HRESULT OnAllChildWindows (HWND hwParent, LPARAM arg1)
      {
       EnumChildWindows (myFunction, arg1);
      }
   }