1

Windowsのcreateメソッドで次のコードを使用します

HANDLE hFont = ::GetStockObject(DEFAULT_GUI_FONT);
m_InfoTab.SendMessage(WM_SETFONT, (WPARAM)hFont);

m_InfoTabは、標準のWindows/MFCタブコントロールです。元のフォントを保存して、親ウィンドウが破棄されたときに復元する必要がありますか?

4

2 に答える 2

3

元のフォントを復元する必要はありません。ただし、フォント オブジェクトを自分で管理する責任があります。つまり、使用しなくなったら削除します。のドキュメント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 秒ごとに増加するのを確認します。

于 2013-01-09T22:00:49.997 に答える
-1

いいえ、問題のウィンドウ (m_infoTab) は、そのフォントを管理し、必要に応じて古いものを解放する責任があります。

于 2013-01-09T21:20:43.670 に答える