Paintイベントを抑制する方法

このQ&Aのポイント
  • Form1上のコントロールのPaintイベントを抑制する方法について教えてください。
  • Form1上のコントロールが多く、Paintイベントが同時に走ってしまうため重くなってしまいます。
  • 個々のコントロールを触ったときにのみPaintイベントが走るようにしたいです。
回答を見る
  • ベストアンサー

Paintイベントを抑制する方法

Paintイベントを抑制する方法  今晩は,質問させていただきます. どうぞよろしくお願いいたします. Form1.Visible = False   :   : '(この間、Form1上の変更は無し)   : Form1.Visible = True '(←ここで重くなります) とした時に、Form1上のコントロールのPaintイベントが 走るのを抑制したいのでございますが、そのような方法って あるのでございましょうか?  Form1上のコントロールが多く(30個くらいありますorz) これらのPaintイベントが一度に同時に 走ってしまうので、重くなってしまいます。。。 個々のコントロールを触ったときにだけ.Paintイベントが 走ってくれればよいのでございますが。。  何か良さそうな方法などございましたら、是非とも アドバイスいただきたくお願い申し上げます。

  • MKT_
  • お礼率99% (329/330)

質問者が選んだベストアンサー

  • ベストアンサー
  • reset_cat
  • ベストアンサー率68% (94/138)
回答No.1

Paintイベントは、その表示状態が変わって再描画が必要となったときに走ります。端的にはform1のウィンドウを一番手前にしておき、その上に別のウィンドウ(たとえばIE)を重ねて隠し、その後IEなどのウィンドウを閉じると、その時点でform1のPaintイベントが走ります。 Form1.Visibleプロパティは、フォームの表示・非表示を切り替えるプロパティですから、falseにしたときに後ろにあるウィンドウのPaintイベントが走り、その後trueにしたときにform1のPaintイベントが走るという動作になります。 要するに、今の方法でPaintイベントを走らせるのを減らすことはできないということになります。 ど~してもPaintイベントを走らせたくないのなら、Win32APIのValidateRectなどを使う方法が考えられるのですが・・・はっきり言っておすすめできないです。

MKT_
質問者

お礼

 どうもありがとうございます!! Paintの走るタイミングのご説明が分かりやすかったです^^ >Win32APIのValidateRectなどを使う方法が考えられるのですが・・・はっきり言っておすすめできないです。 そうでございますか。。。orz おすすめできない、ということで ございますので、何か他の方法を考えてみます。。  ご閲覧・アドバイスいただきまして、どうもありがとうございました!m(_ _)m

関連するQ&A

  • 【VB2008】2つのFormの上下を切り替える方法。。。

    【VB2008】2つのFormの上下を切り替える方法。。。  今晩は,いつも勉強させていただいております. 質問させていただきます.どうぞよろしくお願いいたします.  2つの重なったFormを切り替えるときに今までは Form1.Visible = False Form2.Visible = True などといたしておりましたが、その度に膨大な量の .Paintイベントが走っていることに気づきましたゆえ、 常に重ねておいて上下を切り変えればよいかな?と考えました。  そこで、 Form2.Activate や Form2.Owner = Form1 などといたしましたが変化がございません。。 検索いたしましてもなかなか出てこないのですが、 他に何か方法はございますでしょうか??  もしお詳しい方がいらっしゃいましたら,是非ともアドバイス いただきたく、どうぞよろしくお願いいたします。

  • TEXTBOX_CHANGEのイベント抑制

    TEXTBOX_CHANGE イベントでのイベント抑制方法を教えてください。 エクセルのVBAで、ユーザーフォーム内のTEXTBOXの内容を変更した際にイベントが発生しない様にしたいのですが、うまくいきません。 Private Sub TextBox1_Change() Application.EnableEvents = False UserForm1.TextBox1.Text = "" Application.EnableEvents = True UserForm1.TextBox1.SetFocus End Sub  ユーザーフォーム内では Application.EnableEvents  は使えないのかな?? どなたかご教授をお願いします。

  • Active Basic Paintイベントを通らずに再描写

    Active Basicでゲームを作っています。 最終目標は『東方』のような弾幕避けシューティングです。 スレッドを何とか勉強して、ちらつきも抑えようと頑張っています。 このとき、画像を描写する場合には、 InvalidateRect(hMainWnd, ByVal 0, TRUE) を使って最描写を連続して繰り返してきました。 しかし、これを繰り返すと、『プレイヤー』『弾』『敵』を何度も連続して再描写するため、どうしてもちらついてしまいます。 この、『プレイヤー』『弾』『敵』を別々に描写するとちらつき現象はなくなると思うのですが、どうしてもやり方がわかりません。 InvalidateRect(hMainWnd, ByVal 0, TRUE)を使うと、結局Paintイベントが呼び出されるため、Sub MainWnd_Paint(hDC As HDC)の中に『プレイヤー』『弾』『敵』の描写処理を書いて、 プレイヤー描写、弾(約50個)のループ描写、敵のループ描写が一度にまとめて描写されてしまいます。 これらを別々に表示させるにはどうすればいいのでしょうか? すみませんが、出来るだけやさしくご教授ください。 お願いします。

  • 変更イベント

    テキストフィールドAとBがあり、どちらか一方でもテキストを変更されると ボタンCのEnabled属性がtrue(デフォルトでfalseに設定している)ようにしたいと考えています。 通常ならば、テキストフィールドAとBのTextChangedイベントに ボタンCのEnabled属性をtrueとするように記述すれば良いだけなのですが 今回、テキストフィールドAとBは汎用的なユーザーコントロールD内に存在しており ボタンCはそのユーザコントロールDを含むフォーム上に存在しています。 つまり、ユーザコントロール上に存在するテキストフィールドが変更された時に フォーム上のボタンのEnabled属性をtrueとしたいのですが テキストフィールドのTextChangedイベントの処理内容にフォームに対する処理を記述すると フォームとユーザコントロールの依存度が高くなるのでそれを避けたいのです。 できればユーザコントロールの内容が変更されたときのイベントを フォーム側で拾えると一番いいかと思うのですが そのようなことは可能でしょうか? あるいは何かいい方法はございますでしょうか?

  • コントロールの表示・非表示

    C++Builder6を使用しています。 コントロールをあらかじめ配置しておき, ボタンを押すことでコントロールを表示(使用可能) したり,非表示(使用不可)にしたりしたいです。 ボタンは表示用と非表示用の2つを用意しました。 そこで コンポーネント->Visible = True; コンポーネント->Visible = False; のような記述をしました。 が,Trueにはできるのですが,Falseができません。 Show,Hideも試してみたのですが,やはりHideができません。 デフォルトはFalseの状態で見えないようにしています。 一度TrueにするとFalseにはできないのでしょうか。 アドバイスをお願いします。

  • Loadイベント中にほかのイベントを発生したくない

    VisualC# .net です。 フォームを表示する場合に コンストラクタが呼ばれその後ロードイベントで フォームのコントロールの初期設定を行っています。 (この方法がまちがっている?) ロードイベント内でコンボボックスの初期設定を行うと コンボボックスのイベントが発生してしまいます。 以下参照にて このイベントでメッセージを表示しているのですが 初期設定では出てほしくありません。 そこで、 これを防ぐためには以下のようにフラグを立てるような 方法しかないのでしょうか? それともDebugger.IsAttached のようなものが 用意されているのでしょうか public bool iload = false;     (←仮フラグを追加) private void Form1_Load(object sender, EventArgs e) { iload = true;    (←仮フラグを登録) ComboBox1.SeletedIndex = 0; iload = false;   (←仮フラグを削除) } private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e) { if (iload) return;     (←仮フラグ登録時はなにもしない) MessageBox.Show("変更しました"); }

  • アクセス イベントの発生を停止させたい

    アクセスでイベントを発生しないようにしたいのですが エクセルで使用できる、Application.EnableEvents = Falseを使うと、 コンパイルエラーになります。 フォームを指定して、 .FilterOn = True を通ると、 該当のフォームのPrivate Sub Form_Current()イベントが発生してしまうので、 Application.EnableEvents = Falseのように、イベントの発生を停止させたいです。

  • メッセージの抑制 続き

    Excell 2011 でのメッセージの抑制について mu2011 さんにお世話になりました。 Help 画面で調べると次の場合変更は保存されないことになっています。 Application.DisplayAlerts = False Workbooks("BOOK1.XLS").Close Application.DisplayAlerts = True 虫のよすぎる希望ですが、上の場合応答しないで保存してもらう方法は無いのでしょうか? こんな要求、全く虫が良すぎますよね!

  • フォームの存在をチェックする方法

    みなさんこんばんわです。よろしくお願いします。 VB.NET 2008で開発をしています。フォームについて、どうしてもわからない点がありますのでお伺いいたします。 Form1、Form2があるとします。 Form1.Visible = False とすれば、Form1のインスタンスは残ったまま、非表示なだけです。一方、 Form1.Close() Form1.Dispose() とすれば、Form1は完全にメモリ上から解放されています。つまり、Form1上のコントロールから値を取得しようとするとエラーになりますよね。 つまり、上記の二つのケースをForm2から判断したいのですが、そのコードが分からないんです。Form2のコードで、Form1のインスタンスが存在するかどうか、つまり、Form1上のコントロールの値を参照することができるかどうかを知りたいんです。 具体的には、実際のイメージはForm3まであって、Form1が不可視で生きていれば、Form1上のコントロールの値を参照し、Form2が不可視で生きていれば、Form1は無視してForm2上のコントロールの値を参照するという具合です。 ちなみに、 If Form1.Visible = False Then Debug.Print("生きてます") のコードでは、Form1のインスタンスがメモリ上にあってもなくても、不可視であれば、同じ値を返すことがわかり、役に立ちません。 ご存じの方がいらっしゃいましたら、たいへんお手数をおかけしますが、どうぞよろしくお願い申し上げます。 ありがとうございました。

  • デザイン時のVisible=Falseは実行時に変更できない?

    VB2008です。 フォームデザイン時に、コントロールのVisibleをFalseに設定していると、実行時にTrueに設定してもコントロールが見えません。(実行時エラーも出ません。) 私の環境では、ほぼすべてのコントロールが同じ挙動をします。 もちろん、デザイン時にVisibleをTrueにしておいて、実行時にコードでFalseにすると見えなくなりますし、Trueを与えてやると再度見えるようになります。 これは、言語の仕様なのでしょうか。

専門家に質問してみよう