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

用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时前后不一样,有几个星号和下划线不见了)。本人水平太低,不知如何调试,恳请大佬不吝赐教,感谢!

4个回答

MonitorEnumProc这个函数怎么定义的,它不能是成员函数(目测你现在是成员函数)
m0_37543276
m0_37543276 MonitorEnumProc这个回调函数,采用Add member function…添加的,出现在定义变量的地方。
一年多之前 回复
m0_37543276
m0_37543276 采用Add member function…添加的,它出现在定义变量的地方。不知道对不对。
一年多之前 回复

MoveWindow(0,0,SETTING_WIDTH+SETTIN_HEIGHT,SETTIN_HEIGHT,FALSE);
SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
SetFocus();你试一试这样对不对

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

MoveWindow(0,0,SETTING_WIDTH+SETTIN_HEIGHT,SETTIN_HEIGHT,FALSE);
// 设置窗口位置
SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);
SetFocus();
基于对话框的可以把主对话框的分辨率设置成双屏的分辨率。
把相应的对话框移动到对应位置即可。

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