ペイント サイクル以外で DC を使用することはできますか? ウィンドウの DC は永久に有効であることが保証されていますか?
コントロールのデバイス コンテキスト (DC) が有効な期間を把握しようとしています。
私は私が呼び出すことができることを知っています:
GetDC(hWnd);
コントロールのウィンドウのデバイス コンテキストを取得することはできますか?
Windows から WM_PAINT メッセージが送信されたら、BeginPaint / EndPaintを呼び出して、ペイントしたことを適切に認識し、無効な領域を内部的にクリアする必要があります。
BeginPaint(hWnd, {out}paintStruct);
try
//Do my painting
finally
EndPaint(hWnd, paintStruct);
end;
しかし、BeginPaint を呼び出すと、PAINTSTRUCT 構造内の DC も返されます。これは、私がペイントする必要がある DC です。
BeginPaint() によって返される DC が、GetDC() から取得する DC と同じであるというドキュメントは見つかりません。
特にデスクトップ コンポジションの時代に、BeginPaint 以外で取得した DC にペイントすることは有効ですか?
ペイント サイクル中に DC をペイントする方法は 2 つあります。
DC = GetDC (hWnd);
BeginPaint(&paintStruct);
3 番目の方法がありますが、私が開発している Borland Delphi のバグのようです。
WM_PAINTの処理中に、Delphi は wParam が DC であると認識し、その上に描画を開始します。MSDN によると、WM_PAINT メッセージの wParam は使用されていません。
なぜ
私の本当の目標は、永続的な DC を持つことに依存する GDI+ のより優れたパフォーマンスの機能を使用できるように、永続的な GDI+ グラフィックス オブジェクトを HDC に対して保持しようとすることです。
WM_PAINT メッセージの処理中に、キャンバスに GDI+ イメージを描画したいと考えています。次の nieve バージョンは非常に遅いです。
WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(m_hwnd, ps);
Graphics g = new Graphics(ps.hdc);
g.DrawImage(m_someBitmap, 0, 0);
g.Destroy();
EndPaint(h_hwnd, ps);
}
GDI には、より高速に実行されるビットマップである CachedBitmap が含まれています。しかし、何も考えずに使用すると、パフォーマンス上の利点はありません。
WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(m_hwnd, ps);
Graphics g = new Graphics(ps.hdc);
CachedBitmap bm = new CachedBitmap(m_someBitmap, g);
g.DrawCachedBitmap(m_bm, 0, 0);
bm.Destroy();
g.Destroy();
EndPaint(h_hwnd, ps);
}
パフォーマンスの向上は、CachedBitmap を 1 回作成することで得られるため、プログラムの初期化では次のようになります。
m_graphics = new Graphics(GetDC(m_hwnd));
m_cachedBitmap = new CachedBitmap(b_someBitmap, m_graphcis);
そして今、ペイントサイクルに:
WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(m_hwnd, ps);
m_graphics.DrawCachedBitmap(m_cachedBitmap, 0, 0);
EndPaint(h_hwnd, ps);
}
今を除いて、アプリケーションが実行されている限り、プログラムの初期化後に取得した DC がウィンドウの同じ DC になると信じています。これは、次のように存続することを意味します。
- 素早いユーザー切り替え
- コンポジションの有効/無効
- テーマの切り替え
- テーマの無効化
ウィンドウが存在する限り、特定のウィンドウに同じ DC が使用されることを保証するものは、MSDN にはありません。
注:私は良い開発者になりたいし、正しいことをしたいので、ダブル バッファリングを使用していません。* 場合によっては、ダブル バッファリングが悪いことを意味します。