DOBON.NET DOBON.NETプログラミング掲示板過去ログ

FormのPaintイベント

環境/言語:[WindowsXP VC++.NET]
分類:[.NET]

こんにちは。WindowsXP VC++.NETで開発しています。C#の方が多いみたいですが、マネージドの質問ですので、C#で答えていただいてもうれしいです。

Form1_Paint(System::Object * sender, System::Windows::Forms::PaintEventArgs * e)

を使ってフォームの上に再描画する必要のある図形や文字を出力しようと試みています。ただ、このまま実行すると、実行された時点でForm1_Paint内が出力されてしまうので、条件や操作によってそれをコントロールしたいと思います。

例えば、ボタンを押したときや、メニューを選択したときにこれを実行したいのですが、具体的にどうすればよいかご指導していただきたいです。

初めに自分が考えたのは

public: bool choice;

を定義して、メニューの中で

choice = true;

にして

Form1_Paintの中で

if(choice == true)

で実行しようとしたのですが、実行できませんでした。理由も分からずじまいです。
何かの形でフラグを渡す必要があるとはうすうす感じていますが、どうすればよいでしょうか?
■No13790に返信(ゆうさんの記事)
> Form1_Paintの中で
>
> if(choice == true)
>
> で実行しようとしたのですが、実行できませんでした。理由も分からずじまいです。
> 何かの形でフラグを渡す必要があるとはうすうす感じていますが、どうすればよいでしょうか?
具体的にどのようなコードを書いているのでしょうか?
if文以外のところが重要なのではないでしょうか?
それと、どのタイミングで再描写させるかが問題なのかもしれません。
# メニューで図形や文字を選択したらそのタイミングで Paintイベントを呼ばないといけない。(this->Invalidate()で再描写させる)
Form1_Paintの中身はこんな感じですね。今はこれだけです。


if(selectA == true)
{
String* out;
out = "A";
System::Drawing::Font* myMoji = new System::Drawing::Font(S"MS ゴシック", 10);
e->Graphics->DrawString(out, myMoji, Brushes::Black, x_pos, y_pos);
}

エラーもなく、実行はできるんですけど、いざ selectA = true, を定義しているメニューをクリックしても文字は現れたり現れなかったり、最描画できていないのは確かですね。

> どのタイミングで再描写させるかが問題なのかもしれません。

タイミングってどういうことでしょう?と言うより、タイミングってどう操作するんでしょうか?やはりコードの順番だけですか?
それともしフラグに使う変数の注意点などあったら教えてください。(private: public: などの種類や、Form1クラスとは別にクラス扱いしたほうがよい場合とか…)
■No13792に返信(ゆうさんの記事)
> エラーもなく、実行はできるんですけど、いざ selectA = true, を定義しているメニューをクリックしても文字は現れたり現れなかったり、最描画できていないのは確かですね。
クリックイベントの中で、
selectA = true;
だけしか記述していないのならば、
this->Invalidate();
を追加してみてください。
上手くいきました!このInvalidate()で強制的に再描写するんですね。奥が深いな〜
ありがとうございました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板