WM_GETFONT返回LRESULT类型,而不是预期的HFONT

WM_GETFONT returns type LRESULT instead of expected HFONT

本文关键字:HFONT GETFONT 返回 LRESULT 类型 WM      更新时间:2023-10-16

当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是可以的。