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

AutoScroll = True でコンテナが透けるのを回避する方法

環境/言語:[Windows98, XP VBNET (VS2002)]
分類:[.NET]

お早うございます。
いつもお世話様です。平ちゃんです。
Webで検索しましたが該当するのが見当たりませんでしたので、すみませんがまた宜しくお願いします。

実際のコードは複雑ですので、以下のように単純にしました。

フォーム(サイズ=500×300)にGroupBox1を一杯に配置し、GroupBox1にButton1、TextBox1(MultLine = True)を貼り付けます。

Form1_Loadで以下のようにフォームの高さを半分に変更し、スクロールします。(隠れてしまうのでMe.AutoScroll = True とします。)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.SuspendLayout()
Me.AutoScroll = True
Me.Size = New Size(Me.Size.Width, 150)
Me.ResumeLayout(False)
End Sub

このようにして実行するとGroupBox1が透けた状態になります。
(サンプルコード、実行画面を sample.lzh として添付します。)

Me.AutoScroll = False では問題ないです。
なおGroupBox1でなくPanel1でも同様です。コンテナ部分が透けるようです。
Button1、TextBox1 はこの問題とは直接関係ないです。
Me.SuspendLayout()、Me.ResumeLayout(False) をコメントアウトしても同じ。

この問題を回避する方法を宜しくお願いします。



#実際のプログラムではフォームの表示可能な高さに制限がありそれに合わせて上記例のようにサイズ変更しスクロール表示していますので、問題が発生しています。
(この記事にはファイル"sample.lzh"が添付されていましたが、削除されました。)
> Webで検索しましたが該当するのが見当たりませんでしたので、すみませんがまた宜しくお願いします。
> この問題を回避する方法を宜しくお願いします。
> #実際のプログラムではフォームの表示可能な高さに制限がありそれに合わせて上記例のようにサイズ変更しスクロール表示していますので、問題が発生しています。
>

こんにちは。

自分の環境はWin2000、VS2003なのですが、問題は発生しませんでした。
どうやら、VisualStylesのBugの可能性が怪しいです。
> 自分の環境はWin2000、VS2003なのですが、問題は発生しませんでした。
> どうやら、VisualStylesのBugの可能性が怪しいです。

自分のところで再現していない、不確定な情報でバグと判定するのは少々乱暴すぎやしないですか?

------------------------------------------------------
中博俊 MSMVP Visual Studio C# Since 2004/04-2005/03, MCP
http://naka.wankuma.com/
http://naka.wankuma.com/blog/
naka@wankuma.com
■No9643に返信(antさんの記事)

antさん 中博俊さん こんにちは。いつも有難うございます。

antさん
>
> 自分の環境はWin2000、VS2003なのですが、問題は発生しませんでした。
> どうやら、VisualStylesのBugの可能性が怪しいです。

中博俊さん
>自分のところで再現していない、不確定な情報でバグと判定するのは少々乱暴すぎやしないですか?

もう少し詳しく症状を書きますと
アプリケーション起動後の表示は添付画面の通りです。
スクロールできますので、スクロールして戻すと再描画されて正常となります。

これを踏まえて次のようにするとOKです。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.SuspendLayout()
Me.AutoScroll = True
Me.Size = New Size(Me.Size.Width, 150)
Me.ResumeLayout(False)
'GroupBox1.Invalidate()
'GroupBox1.Update()

AddHandler Application.Idle, AddressOf MyRefresh

End Sub


Private Sub MyRefresh(ByVal sender As Object, ByVal e As System.EventArgs)
GroupBox1.Invalidate()
GroupBox1.Update()
End Sub

Application.Idle を使わないで直接Form1_Loadイベントに
GroupBox1.Invalidate()
GroupBox1.Update()
を追加するだけでは ダメです。

antさんの VisualStyles はコードで書けるのでしょうか?
これかなと思ってやってみましたが違うみたいです。

Class Mygb
Inherits GroupBox
Sub New()
Me.SetStyle(ControlStyles.Opaque, False)
Me.SetStyle(ControlStyles.ResizeRedraw, True)
End Sub
End Class

いまのところの情報です。
宜しくお願いします。
■No9645に返信(平ちゃんさんの記事)

自己レスです

>
> Private Sub MyRefresh(ByVal sender As Object, ByVal e As System.EventArgs)
> GroupBox1.Invalidate()
> GroupBox1.Update()
> End Sub

このアイドル時イベントの中身は GroupBox1.Refresh() でも Me.Refresh() でもOKです。

一旦Form1_Loadイベントを抜けないと正常に戻す事ができないということでしょうか?


宜しくお願いします。

2005/03/07(Mon) 15:31:17 編集(投稿者)

■No9644に返信(中博俊さんの記事)
> 自分のところで再現していない、不確定な情報でバグと判定するのは少々乱暴すぎやしないですか?

書き方が悪かったようです。
一応ざっとは調べてあります。
適当な語句(GroupBox Transparent bug)で検索すれば
情報はいくらでもでてきます。
ですからそのへんで、調べてみては如何でしょうか?ということです。
自分は”怪しい”と書いたのであって、”判定(断定)”はしていません。
こんにちは、じゃんぬねっと です。

■No9645に返信(平ちゃんさんの記事)
> antさんの VisualStyles はコードで書けるのでしょうか?
> これかなと思ってやってみましたが違うみたいです。

「VisualStyles」とは XP 視覚テーマのことですかね?
EnableVisualStyles() メソッドは Framework 1.1 からですね。

今回は、VS2002 のようなので、マニフェスト ファイル になるでしょうか。
■No9652に返信(じゃんぬねっとさんの記事)

皆様 お世話になります。

antさん じゃんぬねっとさん の回答はいま調べているところです。

皆様の環境では再現しないので回答出来ないという事みたいですが、私の環境ではしっかりと再現します。
コード自体はサンプルで掲載した通り、ありふれた普通のコードです。
(皆様からこの部分が悪いという指摘も特にありません)

で、口に出さないで心の中で(これはバグだ!)と勝手に決めて対処法としてフォームのクラスを作りました。

Public Class MyForm
Inherits System.Windows.Forms.Form

Public Sub New()
MyBase.New()
End Sub

Protected Overrides Sub OnResize(ByVal e As EventArgs)
MyBase.OnResize(e)
Me.Refresh()
End Sub

End Class

このクラスを現在のフォームに適用する事で次のForm1_Loadイベント

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.SuspendLayout()
Me.AutoScroll = True
Me.Size = New Size(Me.Size.Width, 150)
Me.ResumeLayout(False)
End Sub

は元のままで私の環境でも問題は解決されました。

作成した MyForm を適用する事による弊害はこのサンプルを動作させた限りではありませんでした。
私的にはこれでいこうかと思っています。

もし、この方法ではどうも別の問題が? 気になる!! という方からレス頂けると幸いです。
私の経験が浅くフォームのクラスなど作った経験も無く、このプログラムでいいのか不安一杯です。

宜しくお願いします。
■No9656に返信(平ちゃんさんの記事)

自己レスです。

元々 AutoScroll の問題なので OnResize に AutoScroll の判定をいれました。多少パフォーマンスがよくなる気がします。

Public Class MyForm
Inherits System.Windows.Forms.Form

Public Sub New()
MyBase.New()

End Sub

Protected Overrides Sub OnResize(ByVal e As EventArgs)
MyBase.OnResize(e)
If Me.AutoScroll Then
Me.Refresh()
End If
End Sub

End Class

何かお気付きの点があれば宜しくお願いします。

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