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 に答える