pictureBoxへの描画について

解決


Beginer  2009-10-09 04:28:43  No: 71011

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);
    }

};


Mister Bation  2009-10-23 07:10:43  No: 71012

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内で勝手に、再描画対象のウィンドウデバイスコンテキストを作成するのは、良からぬ事であるのは、例外ではありません。


Beginer  2009-11-25 09:02:15  No: 71013

お礼が遅れてすみませんでした。
ありがとうございました。よくわかりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加