3

MSDNおよび多数の投稿では、BeginPaint/EndPaintをWM_PAINTで使用する必要があることが示唆されています。また、ペイントでダブルバッファリングを使用する場合は、WM_CREATEでDCとmemの割り当てを初期化し、それらのハンドルをWM_PAINTで再利用する方が理にかなっていることを示唆する場所を数多く見ました。

たとえば、BeginPaintを使用すると、よく次のように表示されます。

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
MemDC = CreateCompatibleDC(hdc);
bmp = CreateCompatibleBitmap(hdc, width, height);
oldbmp = SelectObject(MemDC,bmp);
g = new Graphics(MemDC);

//do paint on bmp
//blt bmp back to hdc

EndPaint(hWnd, &ps);
DeleteObject(bmp);
g->ReleaseHDC(MemDC);
DeleteDC(MemDC);
delete g;

初期化と破棄を保存するために、これを行うことは可能ですか?

case WM_CREATE:
hdc   = GetDC(hWnd);
//create memDC and graphics object references ...
case WM_DESTROY
//delete memDC and graphics object references...
case WM_PAINT
BeginPaint(hWnd, &ps);
//use previously create mem and graphics object to paint 
EndPaint(hWnd, &ps);

したがって、EndPaintを使用して更新領域をクリアするだけで、描画を前に作成したオブジェクトに委任します。

4

1 に答える 1

6

いいえ、それは非常に悪い習慣です。これは、デバイスコンテキストのクリッピング領域が間違っているために最初に問題が発生します。ユーザーがウィンドウのサイズを変更したときに、ウィンドウを適切にペイントできません。

2番目の問題は、更新領域のクリッピングが有効にならないことです、PAINTSTRUCT.rcPaint。更新領域がウィンドウの一部である場合にWindowsが自動的に実行する可能性のあるペイントの最適化を防止します。

3番目の問題は、オペレーティングシステムのリソースを不必要に保持していることです。すべてのGDIオブジェクトは、同じデスクトップで実行されるすべてのプロセスによって共有される単一のヒープに割り当てられます。

HDCの作成は非常に安価です。必要なときに作成してください。PAINTSTRUCT.hdcは言うまでもなく、すぐに使える大皿に盛り付けられます。

于 2012-08-28T06:11:08.830 に答える