1

CreateFont()を使用して(非静的変数として)フォントを作成し、SelectObjectを使用して関数で使用する場合、その関数を終了する前に、前のオブジェクトを選択し、DeleteObjectを使用してフォントを削除する必要があります。

しかし、グローバル変数を宣言した場合HFONT gFont = CreateFont(...)、メッセージでフォントを削除するためWM_DESTROYに呼び出す必要がありますか?DeleteObject

この場合もhOldFont = SelectObject(memDC, gFont);、関数で使用する場合、その関数を終了する前に呼び出す必要がありSelectObject(memDC, hOldFont);ますか?Bitmapの場合、これをクリーンアップする必要があるように思われますが、これが他のGDIオブジェクトに当てはまるかどうかはわかりません。

4

2 に答える 2

3

DeviceContextそれぞれ(DC)をキャンバスと考えてください。これらの各キャンバスは、一度にタイプごとに1つのアクティブなGDIオブジェクトのみを持つことができます。したがって、そのキャンバスに対してアクティブなものとして、、、などを選択することができます。BrushPenFont

呼び出すSelectObject()と、そのタイプのアクティブオブジェクトが設定されます。「赤いペンを手に取って描画し、次に青いペンを手に取って描画する」と考えてください。GDI関数がPen(などのRectangle)を取る場合、最後に選択されたペンを経由して使用しSelectObjectます。これが、SelectObject完了時に状態を復元するために保存できるように、前の値を返す理由です。

DestroyObject作成された、不要になったGDIオブジェクトには常に使用する必要があります。さらに、すべての呼び出しとすべての呼び出し(DCが不要になった場合)に常に使用するDeleteDC必要CreateDCReleaseDCありGetDCます。

DeviceContext(DC)を見つけた方法に復元することをお勧めします。したがって、Fontまたはを設定した場合Brushは、戻る前に元の値に復元する必要があります。復元が重要でない唯一の時間は、おそらく一時的な場合に、DCをとにかく処分しようとしているときですBitmap

を使用する場合はGetStockObject、を呼び出す必要はありませんDeleteObject

于 2013-01-18T20:46:10.753 に答える
1

Delphi(Pascal)の例:

Procedure AngleTextOut(hDC: THandle; const sTxt: string; iX, iY, iH, iAngle: integer);
var
    aryC: array[0..255] of Char;
    hFont, hFontOld: THandle;
begin
    StrPCopy(aryC, sTxt);
    hFont:= CreateFont(-iH, 0, iAngle *10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'arial');
    hFontOld:= SelectObject(hDC, hFont);
    TextOut(hDC, iX, iY, aryC, StrLen(aryC));
    SelectObject(hDC, hFontOld);
    DeleteObject(hFont);
end;//  AngleTextOut
于 2018-08-29T16:45:02.640 に答える