- PR -

コントロールが消えない

1
投稿者投稿内容
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-05-07 14:25
ダッチです。

<環境>
Windows XP ProfessionalSP2
VB 2005
ビデオカード GeForce FX 5700

<内容>
フォーム内のパネルにコンテナ化されているコントロールが
見た目上、消えない現象が発生しております。

.NET のバグなのか
ビデオカードが原因なのかがわからずにいます。

消えないコントロールが
通常の動きどおりに消える方法をお聞きしたく質問いたしました。

<現象再現手順>
1.適当なプロジェクトを作成します。
2.Form1 に Panel を追加します。
3.追加した Panel に Button を追加します。(コンテナ化します)
4.Form1 に Timer を追加します。
5.Form をプロジェクトに追加します。
6.下記のコードを Form1 に追加します。

コード:
    Private m_Form2 As New Form2

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' フォームに対して TransparencyKey を設定すると現象が発生します。
        Me.TransparencyKey = Color.AliceBlue

        Me.Panel1.Dock = DockStyle.Fill
        Me.Button1.Dock = DockStyle.Fill

        Me.m_Form2.Show()
        Me.Timer1.Interval = 3000
        Me.Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Me.Panel1.Hide()
    End Sub


7.プログラムを実行し、ボタンを選択します。
 3秒後に Panel と Button が消えるはずですが、Form2 を動かしてみると
 動かしたところにコントロールが消えていないかのように見えてしまっています。

よろしくお願いいたします。

<補足>
この現象は Panel や GroupBox などコンテナ化できるコントロールで発生するのを確認しております。

また、以前にも Form の TransparencyKey と Opacity を設定したら OS が数秒固まってしまう件がありました。
そのときはビデオカードが原因だったので、もしかしたら今回もビデオカードが原因なのでしょうか。
スクロールが表示されるとOSが固まってしまう。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-07 14:59
引用:

ダッチさんの書き込み (2006-05-07 14:25) より:

3秒後に Panel と Button が消えるはずですが、Form2 を動かしてみると
動かしたところにコントロールが消えていないかのように見えてしまっています。


再現しました...... が、これは OS 側の問題だと思います。
隠された部分は描画する必要がないと判断しているのでしょう。

コード:

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
      Me.Panel1.Hide()
        Me.Refresh()
    End Sub


このように強制描画しましょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-07 15:32
誤解されかねないので補足です。

引用:

私の書き込み (2006-05-07 14:59) より:

再現しました...... が、これは OS 側の問題だと思います。
隠された部分は描画する必要がないと判断しているのでしょう。


これは、隠れている部分が 即座に更新されない ことについてだけの説明でした。
ここを補うことで解決策を出してはいますが、実際に問題となっているのはここではないですね。(;^-^)

OS の都合で考えると 隠れている部分ですから、本来は即座に更新する必要はないです。
描画が 必要になったタイミング で更新すれば良いわけです。(通常、これが自然です)

この タイミング は、今回で言えば Form2 をどかして Button1 の描画が必要になった時ですが、
今回、このタイミングで描画されていないのが、直接的な原因です。
その原因となっているのが、TransparencyKey プロパティというわけです。

# 実際、Button1 に Form2 を '半分だけ' 被せて 3 秒間待ってみると良くわかります。
# 面白いことに、半分だけ描画され、半分だけ描画されないままになっています。

そういうわけで、

引用:

ダッチさんの書き込み (2006-05-07 14:25) より:

この現象は Panel や GroupBox などコンテナ化できるコントロールで発生するのを確認しております。


コンテナ内のコントロールであるかどうかは、関係ないです。
以下のように変更して確認してみたところ、同様の現象を確認しました。

コード:

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Me.Button1.Hide()
    End Sub


以上、拙い補足でした。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-05-07 16:02
回答ありがとうございます。

ご指示いただいた下記のコードで現象を回避することができました。
大変ありがとうございました。

コード:

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
      Me.Panel1.Hide()
        Me.Refresh() ' 強制的に描画することでコントロールが通常通り消えました。
    End Sub




引用:


じゃんぬねっとさんの書き込み (2006-05-07 15:32) より:

コンテナ内のコントロールであるかどうかは、関係ないです。


本当ですね。
コンテナ化については関係ありませんでした。
勘違いをしておりました。

----------------------------------------------------------------------------

ひとつ疑問が残るのですが。
引用:

OS の都合で考えると 隠れている部分ですから、本来は即座に更新する必要はないです。
描画が 必要になったタイミング で更新すれば良いわけです。(通常、これが自然です)



ここまでは理解できます。

引用:

この タイミング は、今回で言えば Form2 をどかして Button1 の描画が必要になった時ですが、
今回、このタイミングで描画されていないのが、直接的な原因です。
その原因となっているのが、TransparencyKey プロパティというわけです。




なぜ TransparencyKey プロパティ を設定することで
描画がされなくなってしまったのでしょうか。
TransparencyKey プロパティ のヘルプを見る限りでは、
とくに描画がされなくなりますなどとは記載されておりません。

こちらについての回答もよろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-07 16:11
引用:

ダッチさんの書き込み (2006-05-07 16:02) より:

なぜ TransparencyKey プロパティ を設定することで
描画がされなくなってしまったのでしょうか。
TransparencyKey プロパティ のヘルプを見る限りでは、
とくに描画がされなくなりますなどとは記載されておりません。
こちらについての回答もよろしくお願いいたします。


ダッチさんのご想像の通り、不具合の可能性が高いです。
(だから、ドキュメントに記載されない...)

透明化したことによる描画関係の不具合は、過去にも何度かありました。
「再描画が必要な時に描画されない」という類は、既に報告されていたかと思います。

多分、直らないんでしょうね。
根深そうなので、インシデントを発行する気にもなれません。(;~_~)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ダッチ
大ベテラン
会議室デビュー日: 2005/10/31
投稿数: 113
投稿日時: 2006-05-07 17:09
回答ありがとうございます。

引用:

じゃんぬねっとさんの書き込み (2006-05-07 16:11) より:

ダッチさんのご想像の通り、不具合の可能性が高いです。
(だから、ドキュメントに記載されない...)

透明化したことによる描画関係の不具合は、過去にも何度かありました。
「再描画が必要な時に描画されない」という類は、既に報告されていたかと思います。

多分、直らないんでしょうね。
根深そうなので、インシデントを発行する気にもなれません。(;~_~)



はぁ〜、そうなんですか。
透明化は今の時代でも難しいんでしょうね。
透明化の技術は
グラフィカルなアプリケーションを作成するには必須なんですけど、
仕方ないですね。
次の OS Vista に期待して待つことにします。

でも、今回の現象が回避できて感謝しております。
ありがとうございました。

# なんか私がやりたいと思ったことに対して、
# .NET のバグとか OS のバグとかに結構出会っている感じです。
# 運が悪いのかなぁ
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-05-07 17:11
引用:

ダッチさんの書き込み (2006-05-07 17:09) より:
グラフィカルなアプリケーションを作成するには必須なんですけど、
仕方ないですね。


え?必須なの?僕は使ったことないぜよ?
それにしてもWindowsには困ったものだ・・
_________________
質問する前にググレカス
1

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