我需要编写一个回调函数,因为我将使用以下函数:
EnumChildWindows(windowHandle, EnumChildProc, 0);
其中第二个变量“EnumChildProc”需要是回调函数。
问题是我在头文件和源文件中编写函数时遇到了困难。通常当我写一个布尔函数或任何其他类型时,我会首先通过以下方式在头文件中对它进行delcare:
bool myFunction(int var1);
如果前一个文件在file.h中,我会在源文件中编写以下代码:
bool file::myFunction (int var1)
{
///here would be my code
}
但是使用回调函数我尝试执行以下操作并且它不起作用:
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)
任何想法我做错了什么?当我在头文件或源文件或某个地方声明回调函数时,我不知道我做错了什么...你们觉得怎么样?
答案 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);
}
}