1

当MSDN 声明返回类型为 HFONT时,这样做HFONT childfont = SendMessage (childwin, WM_GETFONT, NULL, NULL);会导致错误“从 'LRESULT' 到 'HFONT__*' 的转换无效” 。这个函数的正确返回类型是什么?我应该只使用 LRESULT 还是我必须做一些特别的事情,因为如果我不这样做,我的程序稍后会回来咬我?

4

2 回答 2

4

由于SendMessage用于许多用途,它不可能对所有东西都有完美的返回类型。在这种情况下,您必须将其转换为您需要的类型:

HFONT childfont = reinterpret_cast<HFONT>(SendMessage(...));

在 的处理程序中WM_GETFONT,您会期望看到类似这样的内容:

HFONT whateverFont;
...
return (LRESULT)whateverFont;

所以回到HFONT原来的状态是可以的。

于 2013-01-22T20:44:44.420 回答
4

SendMessage是一把瑞士军刀:它做了很多不同的事情,所有这些都返回不同类型的值。由于 C 不支持重载返回值(请记住 Win32 API 是 C API),它必须返回泛型LRESULT类型。

因此,您需要将结果转换为实际类型。该文档指出,此消息返回一个HFONT,因此您必须将结果转换为HFONT

HFONT childFont = (HFONT)SendMessage(childWin, WM_GETFONT, ...);

或者,您可以使用GetWindowFont()头文件中定义的宏<WindowsX.h>,其中包含许多实用宏:

// 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);
于 2013-01-22T20:45:10.520 回答