WM_GETFONT返回LRESULT类型,而不是预期的HFONT
WM_GETFONT returns type LRESULT instead of expected HFONT
当MSDN声明返回类型为HFONT时,执行HFONT childfont = SendMessage (childwin, WM_GETFONT, NULL, NULL);
会导致错误"从'LRESULT'到'HFONT__*'无效转换"。这个函数的正确返回类型是什么?我应该只使用LRESULT吗?还是我必须做一些特殊的事情,因为如果我不这样做,我的程序会回来咬我?
SendMessage
是一把瑞士军刀:它做了很多不同的事情,所有这些都返回不同类型的值。由于C不支持重载返回值(记住Win32 API是一个C API),它必须返回一个通用的LRESULT
类型。
因此,需要将结果强制转换为实际类型。文档指出,如果此消息返回HFONT
,那么必须将结果强制转换为HFONT
:
HFONT childFont = (HFONT)SendMessage(childWin, WM_GETFONT, ...);
或者,您可以使用头文件<WindowsX.h>
中定义的宏GetWindowFont()
,其中包含许多实用程序宏:
// From WindowsX.h. SNDMSG is a macro which expands to either SendMessage or
// AfxSendMessage.
#define GetWindowFont(hwnd) FORWARD_WM_GETFONT((hwnd), SNDMSG)
#define FORWARD_WM_GETFONT(hwnd, fn)
(HFONT)(UINT_PTR)(fn)((hwnd), WM_GETFONT, 0L, 0L)
// Example usage:
HFONT childFont = GetWindowFont(childWin);
由于SendMessage
用于许多许多用途,因此它不可能具有适合所有用途的完美返回类型。在这种情况下,必须将其强制转换为所需的类型:
HFONT childfont = reinterpret_cast<HFONT>(SendMessage(...));
在WM_GETFONT
的处理程序中,您可能会看到类似这样的内容:
HFONT whateverFont;
...
return (LRESULT)whateverFont;
所以转换回原来的HFONT
是可以的。