为何afxwin.h中ScreenToClient无HWND参数重载?如何指定父控件?
解决MFC中ScreenToClient指定父控件的问题
MFC的CWnd::ScreenToClient确实仅提供接收LPPOINT或LPRECT的重载,没有直接带HWND参数的版本。要指定父控件完成坐标转换,可按以下方式操作:
若已有目标父控件的
CWnd对象指针,直接调用该对象的ScreenToClient方法即可:// pParentWnd为目标父控件的CWnd指针 POINT ptScreen = {100, 200}; pParentWnd->ScreenToClient(&ptScreen); // 转换后ptScreen即为相对于父控件客户区的坐标若仅持有父控件的HWND句柄,先通过
CWnd::FromHandle将HWND转换为CWnd临时对象,再调用方法:HWND hParentWnd = /* 父控件的句柄 */; POINT ptScreen = {100, 200}; CWnd* pParentWnd = CWnd::FromHandle(hParentWnd); if (pParentWnd != nullptr) { pParentWnd->ScreenToClient(&ptScreen); }
本质上,MFC的ScreenToClient是对Win32原生ScreenToClientAPI的封装,原生API需要以HWND作为第一个参数,MFC则将该参数隐含在CWnd对象中。只要获取到对应父控件的CWnd对象,就能完成对应坐标系的转换。
内容的提问来源于stack exchange,提问作者shibayan
相关产品推荐
相关产品推荐

