Visual C++2008 Express Editionを使用しています。
フォーム上にpictureBoxを置いて、四角い枠を描画
させようとしています。ボタン1でサイズの変更しています。
Graphicsオブジェクトを取得するのに2つの方法を試すと
下記の e->Graphics のほうは思ったとおり描画されますが、
gr のほうは、paintイベント、Refreshメソッドでは描画
されません。
ボタン2での gr での描画は可能です。
e のほうを使用すればいいのですが、この差が何か知りたい
と思い質問させていただきました。お願いします。
-------------------------------------------------------
public ref class Form1 : public System::Windows::Forms::Form
{
<略>
private: Graphics^ gr;
int w, h;
<略>
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
gr = pictureBox1->CreateGraphics();
w = 100;
h = 80;
}
private: System::Void pictureBox1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
gr->DrawRectangle(Pens::Gray, 20, 20, w, h); //その1
e->Graphics->DrawRectangle(Pens::Red, 10, 10, w, h);//その2
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
w = 200;
h = 160; //描画する枠のサイズ変更
this->pictureBox1->Refresh();
}
private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {
gr->DrawRectangle(Pens::Gray, 20, 20, w, h);
}
};
Paintハンドラで渡されてくるGraphicsオブジェクトは、一度描くとフォームに残り続けるものです。
それに対して、フォームやピクチャーボックスから取ってきたGraphicsオブジェクトは一時的なものです。
実際にボタン2で灰色の四角を書かせた後、フォームを他のウィンドウの下敷きにから、もう一度見ると、消えている筈です。
他のウィンドウの下敷きになったりして、消えてもらっては困る様な絵は、必ずPaintハンドラ内で、e->Graphicsを使って書き込まなければいけない事になっています。
又、Paintハンドラ内で、再描画対象フォームのGraphicsオブジェクトを、勝手に作成して使用する事も、良からぬ行為と言う事です。
win32 apiを使うプログラミングにおいては、
「Paintハンドラ」が「WM_PAINT」
「e->Graphics」が「BeginPaint()/EndPaint()」
「gr = pictureBox1->CreateGraphics()」が「hDC = GetDC(hWndPictureBox)」
ですが、WM_PAINT内で勝手に、再描画対象のウィンドウデバイスコンテキストを作成するのは、良からぬ事であるのは、例外ではありません。
お礼が遅れてすみませんでした。
ありがとうございました。よくわかりました。
ツイート | ![]() |