16

純粋な Win32 API (RegisterClass および CreateWindow 関数) を使用してウィンドウを作成しています。システム定義のフォントではなく、ウィンドウのフォントを指定するにはどうすればよいですか?

4

3 に答える 3

16

独自のウィンドウクラスを作成するときは、フォントを自分で管理する必要があります。このタスクは4つの部分で構成されます。

  1. ウィンドウが作成されたら(つまり、WM_CREATEを処理するとき)、CreateFont()またはCreateFontIndirect()を使用して、ウィンドウで使用するフォントのHFONTを取得します。このHFONTは、ウィンドウクラスのインスタンスごとに保持する他のデータと一緒に保存する必要があります。ウィンドウクラスでWM_GETFONTWM_SETFONTを処理することもできますが、通常、トップレベルウィンドウでは必要ありません(コントロールウィンドウクラスを作成する場合は、ダイアログマネージャーがそのメッセージを送信するため、WM_SETFONTを処理する必要があります。 )。
  2. ウィンドウにテキストを含む子ウィンドウがある場合は、ウィンドウのフォントが変更されるたびに、それぞれにWM_SETFONTメッセージを送信します。一般的なWindowsコントロールはすべてWM_SETFONTを処理します。
  3. ウィンドウのコンテンツを描画するとき(通常はWM_PAINTメッセージに応答して)、テキストを描画する前に(または、GetTextMetrics()などのテキスト関数を使用して)SelectObject()関数を使用してHFONTをデバイスコンテキストに選択します。
  4. ウィンドウが破棄された場合(つまり、WM_DESTROYを処理する場合) 、 DeleteObject()を使用して、手順1で作成したフォントを解放します。ウィンドウでWM_SETFONTを処理する場合は、WM_SETFONTで受け取ったフォントオブジェクトを削除しないでください。メッセージを送信したコードはそのハンドルの所有権を保持することを期待しているため、ハンドラー。
于 2008-10-22T13:32:54.467 に答える
13

vivos が言ったように、CreateFont()/CreateFontIndirectを使用するだけです。

HFONT hFont = CreateFont (13, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, 
      OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 
      DEFAULT_PITCH | FF_DONTCARE, TEXT("Tahoma"));

次に、 WM_SETFONTメッセージを使用して、ウィンドウ/コントロールにこのフォントを設定します。

SendMessage(window, WM_SETFONT, hFont, TRUE);
于 2008-10-22T04:06:26.467 に答える
7

独自のフォント ハンドルを既に持っている標準のコモン コントロールをスーパークラス化する場合は、次のアプローチを使用します。CreateFontまたはCreateFontIndirectを使用してフォントを作成し、メッセージを使用して設定しWM_SETFONTます (MFC と ATL には対応するSetFont関数があります)。フォントが不要になったら、 を使用してフォントを破棄しDeleteObjectます。ウィンドウの以前に設定されたフォントを破棄しないようにしてください。

自分自身を描画するカスタム コントロールを作成している場合は、 or を使用して新しいフォント オブジェクトを作成し、CreateFontそれCreateFontIndirectをクラスのどこかに保存します。サードパーティのユーザーをサポートしたい場合は、ユーザーが別のフォントを設定できるように処理WM_SETFONTしてください。WM_GETFONTペイントするときは、クラスに保存されている現在のフォント オブジェクトを使用します。

于 2008-10-21T10:40:29.310 に答える