Windowsのcreateメソッドで次のコードを使用します
HANDLE hFont = ::GetStockObject(DEFAULT_GUI_FONT);
m_InfoTab.SendMessage(WM_SETFONT, (WPARAM)hFont);
m_InfoTabは、標準のWindows/MFCタブコントロールです。元のフォントを保存して、親ウィンドウが破棄されたときに復元する必要がありますか?
元のフォントを復元する必要はありません。ただし、フォント オブジェクトを自分で管理する責任があります。つまり、使用しなくなったら削除します。のドキュメントWM_SETFONT
は、ここでかなり明示的です。
アプリケーションは、不要になったフォントを削除するために DeleteObject 関数を呼び出す必要があります。たとえば、コントロールを破棄した後。
この特定のケースでは、 を呼び出してフォント オブジェクトを取得したため、問題は発生しませんGetStockObject()
。これらのオブジェクトはシステムによって制御され、それらに対して DeleteObject を呼び出す必要はありません (害はありませんが)。
アプリケーションが GDI ハンドルをリークしているかどうかは、タスク マネージャーを使用して簡単に確認できます。Processesタブに移動し、View -> Select Columns...を選択してGDI Objectsにチェックマークを付けます。SetTimer()
監視が整ったら、コードを変更し、 with uElapsed = 1000
(1 秒に 1 回)を使用してタイマーをインストールします。OnTimer
次のコードでハンドラーを追加します。
void CMyDialog::OnTimer(UINT_PTR nIDEvent)
{
// Retrieve the system font
HFONT hFontSystem = (HFONT)GetStockObject( DEFAULT_GUI_FONT );
LOGFONT lfSystem = { 0 };
GetObject( hFontSystem, sizeof( lfSystem ), &lfSystem );
// And construct and identical font object
HFONT hFontNew = CreateFontIndirect( &lfSystem );
// This will leak the font object
m_InfoTab.SendMessage( WM_SETFONT, (WPARAM)hFontNew );
__super::OnTimer(nIDEvent);
}
タスク マネージャーを開き、アプリケーションを起動して、GDI オブジェクトの数が 1 秒ごとに増加するのを確認します。
いいえ、問題のウィンドウ (m_infoTab) は、そのフォントを管理し、必要に応じて古いものを解放する責任があります。