1

Visual C ++は初めてなので、これはGDIオブジェクトの選択に関連する非常に基本的な質問かもしれません。

次のコードスニペットは、境界線のない明るい灰色の円を描画します。

cPen pen(PS_NULL, 0, (RGB(0,0,0)));
dc.SelectObject(& pen);
CBrush brush (RGB (192,192,192));
dc.SelectObject (&brush);
dc.Ellipse(0,0, 100,100);

コードスニペットから理解できるのは、最初にペンのオブジェクトが作成され、そのNULLペンによって境界線が消え、ブラシが灰色の円を作成することだけdcですが、すでにブラシを使用している場合、ペンはどのように使用しますか?これは少し紛らわしいです。

dc.SelectObject()2回使用するとどのように役立ちますか?ソリッドブラシオブジェクトを使用して灰色の円を作成する場合、ブラシオブジェクトの作成時にペンオブジェクトが破壊された場合、ペンオブジェクトの作成はどのように役立ちますか?これはどのように正確に機能しますか?

4

2 に答える 2

4

SelectObject関数は、5つの異なるタイプのオブジェクトをDCに選択するために使用されます

  1. ペン
  2. みがきます
  3. フォント
  4. ビットマップと
  5. 領域

ドキュメントには次のように記載されてい The newly selected object replaces the previous object of the same typeます。つまり、問題なくペンとブラシを選択できますが、ペンを2回選択することはできません。

さらに、リソースリークを回避するには、以前に選択したものをすべて古いペン/ブラシを選択する必要があります

CPen pen(PS_NULL, 0, (RGB(0,0,0)));
CPen *oldPen = dc.SelectObject(& pen);
CBrush brush (RGB (192,192,192));
CBrush *oldBrush = dc.SelectObject (&brush);
dc.Ellipse(0,0, 100,100);

dc.SelectObject(oldPen);
dc.SelectObject(oldBrush);
于 2012-07-31T06:54:20.307 に答える
1

DCオブジェクトには、現在のブラシ、現在のペン、現在のフォントなどがあります。つまり、特定のタイプの現在のオブジェクトです。したがって、ペンとブラシを同時に選択することはできますが、2つのペンを同時に選択することはできません。SelectObject内部でハンドルのタイプを確認します。

また、SelectObject指定したハンドルを選択しても選択されていない、同じタイプの以前の現在のオブジェクトを返します。保存して、終了したら復元する必要があります。

于 2012-07-31T06:54:30.290 に答える