- PR -

TabControl(Page)上のコントロール再描画ちらつきを抑制したい

投稿者投稿内容
ShuU
常連さん
会議室デビュー日: 2006/09/29
投稿数: 21
投稿日時: 2007-06-21 14:50
お世話になっております。

Windowsフォームアプリケーションでタブを切り替える度に、コントロール描画がちらつく問題に直面しております。

各タブには、グループボックスやラベル、テキストボックスやボタンが計50個くらい配置されています。
(それぞれ一画面に納めたい情報のため、分断したくはありません)


開発環境はVB2005Expで、対象OSはWindowsXP(Vistaでも現象は変わらず)です。
PCのスペックはXeon 3GHz、RAM 3GBですので、原因ではないと思います。

VB6で同様のアプリケーションを開発した時は、このような現象は無かったと思います。
過去ログやウェブ検索をしてみましたが、「コントロール数削減」や「諦め」を促してるものばかりで、
解決されているものを見つけられませんでした。
(特にタブ切り替え時の情報が少ない)


タブ切り替えでも、パラパラちらつかない方法をご教授願います。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-06-21 14:53
ないと思う。50もあればちらつくのはしょうがない。
いったん再描画しないようにすればパラパラ感はなくなるかもしれないけどかかる時間は変わらないと思う。経験あり。
ShuU
常連さん
会議室デビュー日: 2006/09/29
投稿数: 21
投稿日時: 2007-06-21 16:39
ぶさいくろう氏:

ご助言有難う御座います。
確かに1画面内に10程度であれば気になりません。

「再描画しないように」という方法は理解できておりませんが、
TabPage表示時間が変わらないのであれば、今度は"遅い"と感じてしまいそうですので、
再描画の制御には手を出さないでおきます。

明瞭な対策が取れないのは残念ですが、当面は、DataGritViewなどを駆使して、
可能な限りコントロール数を減らすよう努力することにします。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-22 05:35

50個は多いですね。
入力する人の身になると、泣けてきます。
一般的なデザインの指針とかを探して、見直したほうがいいでしょうね。

それはそうとして。

TabControlにButtonとTextBoxをそれぞれ30個ずつ並べてみました。
ちらつくというより、描画が遅い。ボタンを書いてるのがわかります。
DoubleBufferを使えばいいと思ったのですが、
TabControlはなぜかDoubleBufferが効きません。
指定しても動きません。

仕方ないので、無理やり効かせてみました。

コード:
Public Class BufferedTabControl
    Inherits TabControl
    Private WS_EX_COMPOSITED As Integer = &H2000000

    Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
        Get
            Dim c As CreateParams
            c = MyBase.CreateParams
            c.ExStyle = c.ExStyle Or Me.WS_EX_COMPOSITED
            Return c
        End Get
    End Property
End Class



ちょっと使ってみましたが、劇的改善です。
ちらつきはありません。
反応はぶさいくろうさんのおっしゃる通り遅いですが、
タブをクリックして操作するならあまり問題にはならないレベルです。

ですが、

問題なく動くなら、わざわざDoubleBufferedを無効にする意味がありません。
きっとなにか問題が生じるはずです。
複雑なので理由を調べる気になりませんが、
絶対にどこかで不具合が生じるはずです。

酔狂な方がいらしたら、
ぜひ調べてみてください。
ShuU
常連さん
会議室デビュー日: 2006/09/29
投稿数: 21
投稿日時: 2007-06-22 10:02
れい氏:

ユーザーコントロールのサンプルを提示して頂き、有難う御座います。

開発中のアプリケーションは、自動的に特定動作を連続して行うクレーンゲームのような装置を制御するものです。
非常に多くのパラメータ設定が必要であるため、ある程度機能別にグループ分けしても、ラベルやテキストボックスが増加してしまっています。もちろん、試行錯誤して、コントロールの削減には努めますが……。

さて、拡張スタイル「WS_EX_COMPOSITED」を使用して、ダブルバッファリングを強制する件ですが、動作としては十分です。(「WS_EX_COMPOSITED」は今回始めて知りました)

引用:
問題なく動くなら、わざわざDoubleBufferedを無効にする意味がありません。
きっとなにか問題が生じるはずです。



ウェブ検索した程度では、「リストビュー」に関する不具合(表示されないなど)は数件報告されていましたが、
タブコントロールについてはありませんでした。
フォームを含め、"コンテナ"として扱うコントロールについては、効果的なパラメータのはずですが、
本当に何が問題で無効にされたのか気になりますね。

先ずは様子見で使用してみて、何らかの問題が生じた際には、本件を疑う&ご報告を上げたいと思います。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-22 15:49

>先ずは様子見で使用してみて、何らかの問題が生じた際には、本件を疑う&ご報告を上げたいと思います。

ぜひ教えてください。
動作不良は探すほうが大変で、
見つかってしまえば対応策も考えることができますので。
ShuU
常連さん
会議室デビュー日: 2006/09/29
投稿数: 21
投稿日時: 2007-07-11 13:59
引用:

れいさんの書き込み (2007-06-22 15:49) より:

>先ずは様子見で使用してみて、何らかの問題が生じた際には、本件を疑う&ご報告を上げたいと思います。

ぜひ教えてください。
動作不良は探すほうが大変で、
見つかってしまえば対応策も考えることができますので。



「WS_EX_COMPOSITED」を使用した「ucTabControl」を使って2週間。
2点の問題が発生しました。

1.ucTabControlがあるフォーム上のコントロールがちらつく
  動作時ではなく、デザイン時の問題です。
  配置を変更しようと、コントロールをドラッグするとちらつきます。
  WS_EX_COMPOSITEDをコメントアウトして再ビルドすれば解消されます。

2.NumericUpDownの表示が汚れる
  NumericUpDownの表示領域に、前回表示タブの描画カスが残ります。
  ComboBoxでは問題ありませんでした。

1はともかく、2については、言葉で言い難い現象です。
NumericUpDownは駄目で、ComboBoxは問題無しといういのも不可解です。

何か、お気付きの点がありましたら、ご教授願います。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-11 15:13
引用:

ShuUさんの書き込み (2007-07-11 13:59) より:
「WS_EX_COMPOSITED」を使用した「ucTabControl」を使って2週間。
2点の問題が発生しました。



おや。
思ったより少ないですね。

引用:

1.ucTabControlがあるフォーム上のコントロールがちらつく
  動作時ではなく、デザイン時の問題です。



大丈夫かと思ったんですが、問題ありですか。
これはよくやる手で対応できますね。

コード:
    Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
        Get
            If Me.DesignMode Then Return MyBase.CreateParams
            Dim c As CreateParams
            c = MyBase.CreateParams
            c.ExStyle = c.ExStyle Or Me.WS_EX_COMPOSITED
            Return c
        End Get
    End Property




引用:

2.NumericUpDownの表示が汚れる
  NumericUpDownの表示領域に、前回表示タブの描画カスが残ります。
  ComboBoxでは問題ありませんでした。

1はともかく、2については、言葉で言い難い現象です。
NumericUpDownは駄目で、ComboBoxは問題無しといういのも不可解です。



問題はこちらですが。
私のところでは再現しません。
もう少し詳しく。
もしくはサンプルをどこかにあげてください。

スキルアップ/キャリアアップ(JOB@IT)