Windows编程中回调函数的使⽤⼼得(MFC篇)回调函数就是⼀个通过函数指针调⽤的函数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指
向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。
Windows SDK中回调函数处处可见,MFC中使⽤回调函数要⽐纯Window SDK或C#,VB中⿇烦许多,笔者想借这篇⽂章来总结MFC中回调函数的使⽤。
本⽂以回调函数EnumWindows为例,介绍如何在MFC中使⽤回调函数:
函数功能
该函数枚举所有屏幕上的顶层窗⼝,并将窗⼝句柄传送给应⽤程序定义的回调函数。回调函数返回FALSE将停⽌枚举,否则EnumWindows函数继续到所有顶层窗⼝枚举完为⽌。函数原型 BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);参数: lpEnumFunc:指向⼀个应⽤程序定义的回调函数指针,请参看EnumWindowsProc。 lPararm:指定⼀个传递给回调函数的应⽤程序定义值。回调函数原型 BOOL CALLBACK EnumWindowsP
函数原型:
BOOL EnumWindows(WNDENUMPROC lpEnumFunc,LPARAM lParam);
参数:
lpEnumFunc:指向⼀个应⽤程序定义的回调函数指针,请参看EnumWindowsProc。
lPararm:指定⼀个传递给回调函数的应⽤程序定义值。
回调函数原型
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);
参数:
enum函数hwnd:顶层窗⼝的句柄
lparam:应⽤程序定义的⼀个值(即EnumWindows中lParam)
回调函数注意:
1. 回调函数函数必须修饰为CALLBACK并且只能声明类的为静态成员函数:
static BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam);//获取进程句柄中的主窗⼝句柄
这种声明⽅式带来了⼀个问题,即EnumWindows只能使⽤类中的静态成员变量,如何解决这种⽭盾呢?
2. 可以使⽤lParam来传递指向该类的指针已访问类的⾮静态变量,即:
BOOL CALLBACK CSimInstDlg::EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
DWORD id;
HWND thwnd;
CSimInstDlg* CurInst = (CSimInstDlg*)lParam;
id=GetWindowThreadProcessId(hwnd,NULL);
if (id==(DWORD)CurInst->m_dwInstTID)
{
while((thwnd=::GetParent(hwnd))!=NULL)
hwnd=thwnd;
CurInst->m_hWind = hwnd;
::SetLastError(0);// 设置⽆错误
return FALSE; // 返回 false 以终⽌枚举窗⼝
}
return TRUE;
}
3. EnumWindows函数不列举⼦窗⼝,只能列举所有的主窗⼝
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论