求助大佬:MFC检测扩展显示器时回调函数错误怎么解决? 5C

用MFC编了一个基于对话框的程序,准备使用电脑扩展屏,形成一个主屏和副屏分别显示1个对话框。参考咱们CSDN大佬的程序代码,操作如下:
第1步:在FileView中添加了”MULTIMON.H“头文件;
第2步:在ClassView中通过Add Member Function自己写了回调函数,用来检测主副显示器信息,如下所示

BOOL CALLBACK CTESTDLG::MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
/******
对话框:CTESTDLG
回调函数名:MonitorEnumProc
输入参数:HMONITOR hMonitor—显示器句柄;
HDC hdcMonitor—显示器DC句柄;
LPRECT lprcMonitor, LPARAM dwData—EnumDisplayMonitor传来的数据
返回:bool
******/

第3步:在初始化函数中添加EnumDisplayMonitor调用回调函数。
就是在BOOL CTESTDLG::OnInitDialog()中添加
EnumDisplayMonitor(NULL, NULL, MonitorEnumProc, 0);

运行后,显示错误如下:
error C2664:'xEnumDisplayMonitor' : cannot convert parameter 3 from 'int(struct HMONITOR___*, struct HDC___*,struct tagRECT , long)' to 'int(___stdcall )(struct HMONITOR___, struct HDC___,struct tagRECT *, long)'

就是xEnumDisplayMonitor或EnumDisplayMonitor(此处也不明白为什么原代码没有x,报错时有了x)第3个参数,也就是MonitorEnumProc这个回调函数转换有问题,前后多了一个(___stdcall *)。
也就是cannot convert parameter 3 from 'int(……)' to 'int(___stdcall *)(……)'
两个括号里面的传递参数一样(不知道为什么上传CSDN时前后不一样,有几个星号和下划线不见了)。本人水平太低,不知如何调试,恳请大佬不吝赐教,感谢!

2个回答

其实就是struct tagRECT 不能转换为struct tagRECT * 指针形式,你去查查是不是第三个参数MonitorEnumProc中定义的struct tagRECT矩形是不是指针类型的。

m0_37543276
m0_37543276 括号里面的内容一模一样
11 个月之前 回复
m0_37543276
m0_37543276 您好,我又重新编辑了一下问题,不知道为什么CSDN不显示个别星号和下划线号。实际报错是:'int(……)' to 'int(___stdcall *)(……)'
11 个月之前 回复

这是一个特有的callback 全局函数,不是能通过添加成员函数的方式添加。
可去掉 CTESTDLG::, 直接写成这样的形式:
BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
...
}
编译报错是因为需要传入函数指针,你传递进去了成员函数的指针,不匹配。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问