C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: 最小化から戻るときのClientRectangleについて


(過去ログ 104 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■61991 / inTopicNo.1)  最小化から戻るときのClientRectangleについて
  
□投稿者/ Maranello (1回)-(2011/09/14(Wed) 16:34:51)

分類:[.NET 全般] 

VB2010Express Windows7 64bit

あるフォームがあります。
フォームにはDataGridViewやSplitContainer、RichTextBox等があります。
フォームやDataGridViewにはグラデーション処理をPaintで行っています。

問題は、最小化したあとタスクバーから復帰する際だけ起こります。
最小化から復帰する際、MyBase.Paintが動くのですが
その時点の「Me.ClientRectangle」の内容がすべて0になってしまっており、

----------------------------------------------------------------------------------------------------------
Dim myLGBrush As LinearGradientBrush = Nothing
myLGBrush = New LinearGradientBrush(Me.ClientRectangle, Color.Black, Color.White, Mode)
----------------------------------------------------------------------------------------------------------

とした時点で、Me.ClientRectangleが0だとエラーになるのです。
エラー内容は、
「ArgumentExceptionはハンドルされませんでした。
四角形 '{X=0,Y=0,Width=0,Height=0}' の幅、または高さの値に 0 を指定することはできません。」
XPで実行すると、エラーにはならず画面のDataGridViewなどが表示されてない状態になります。
その後移動したりすると、表示されます。

どうしてかさっぱりわからず、
新しいプロジェクトで以下のような簡易フォームを作って実行し、
最小化から戻しても何も問題なく「Me.ClientRectangle」に値が入っています。

----------------------------------------------------------------------------------------------------------
Imports System.Drawing.Drawing2D
Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub


Private Sub Form1_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint

' グラデーションの方向
Dim mode As LinearGradientMode = LinearGradientMode.Vertical
' グラデーションを行うブラシ
Dim myLGBrush As LinearGradientBrush = _
New LinearGradientBrush(Me.ClientRectangle, Color.Blue, Color.White, mode)
' 描画
e.Graphics.FillRectangle(myLGBrush, Me.ClientRectangle)

End Sub
End Class
----------------------------------------------------------------------------------------------------------


何かわかることがあれば教えていただけないでしょうか。
引用返信 編集キー/
■61994 / inTopicNo.2)  Re[1]: 最小化から戻るときのClientRectangleについて
□投稿者/ すべり (1回)-(2011/09/14(Wed) 17:18:53)
No61991 (Maranello さん) に返信
> 問題は、最小化したあとタスクバーから復帰する際だけ起こります。
> 最小化から復帰する際、MyBase.Paintが動くのですが
> その時点の「Me.ClientRectangle」の内容がすべて0になってしまっており、

Me.ClientRectangleがすべて0の時は、イベントの処理をスキップするようにするとどうなりますか?
引用返信 編集キー/
■61996 / inTopicNo.3)  Re[2]: 最小化から戻るときのClientRectangleについて
□投稿者/ Maranello (2回)-(2011/09/14(Wed) 19:46:50)
No61994 (すべり さん) に返信
> ■No61991 (Maranello さん) に返信
>>問題は、最小化したあとタスクバーから復帰する際だけ起こります。
>>最小化から復帰する際、MyBase.Paintが動くのですが
>>その時点の「Me.ClientRectangle」の内容がすべて0になってしまっており、
>
> Me.ClientRectangleがすべて0の時は、イベントの処理をスキップするようにするとどうなりますか?

返信ありがとうございます。

イベントをスキップすると、最終的には正しく表示されるのですが
表示の時点で一瞬各コントロールが真っ黒になってから表示されてしまいます。
(不自然な感じ)

無理やりスキップするため描画できてなくて(黒く見える?)、
ある程度ほかのものが表示し終わった後にまたPaintが走って最後はうまく表示されているのでは
ないかと思っていますが・・・

ただ、開発途中までは最小化からの戻しの際、普通にうまくいっていたのですが、
いつからか、なにかがきっかけで通常より早くPaintが動くようになってしまった?のかなと思ったりしています。


CPUはi7-2600です。

最小化から戻るときに、0の状態でPaintが反応しないというのがベストではあるんですが
まったく検討が付かず、、、。

引用返信 編集キー/
■62001 / inTopicNo.4)  Re[3]: 最小化から戻るときのClientRectangleについて
□投稿者/ shu (992回)-(2011/09/15(Thu) 08:08:56)
No61996 (Maranello さん) に返信

ResizeかSizeChangedイベントでAddHandler,RemoveHandlerするとどうでしょう?
引用返信 編集キー/
■62003 / inTopicNo.5)  Re[4]: 最小化から戻るときのClientRectangleについて
□投稿者/ Maranello (3回)-(2011/09/15(Thu) 10:10:41)
No62001 (shu さん) に返信
> ■No61996 (Maranello さん) に返信
>
> ResizeかSizeChangedイベントでAddHandler,RemoveHandlerするとどうでしょう?

すみません、これは

AddHandler MyBase.Paint, AddressOf frmMain_Paint
を、OnResizeの中に書くということでしょうか?

ひとまず上記をいれてみましたが、通常のフォームのサイズ変更などで
相当繰り返しPaintが呼ばれるようになってしまいました。

RemoveHandlerについてはなぜ必要なのか、どこにどのように使うのかが分かっていません。
もう少し補足をいただけませんでしょうか。
引用返信 編集キー/
■62005 / inTopicNo.6)  Re[5]: 最小化から戻るときのClientRectangleについて
□投稿者/ shu (993回)-(2011/09/15(Thu) 11:48:32)
No62003 (Maranello さん) に返信

> AddHandler MyBase.Paint, AddressOf frmMain_Paint
> を、OnResizeの中に書くということでしょうか?
>
> ひとまず上記をいれてみましたが、通常のフォームのサイズ変更などで
> 相当繰り返しPaintが呼ばれるようになってしまいました。

 AddHandler Me.Paint, AddressOf Form1_Paint
だけではどんどんイベントが増えてしまいます。


こっちの環境で再現できないので、憶測ですがこれでどう?

    Private Sub Form1_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize
        RemoveHandler Me.Paint, AddressOf Form1_Paint
        If Me.WindowState <> FormWindowState.Minimized Then
            AddHandler Me.Paint, AddressOf Form1_Paint
        End If
    End Sub

引用返信 編集キー/
■62006 / inTopicNo.7)  Re[6]: 最小化から戻るときのClientRectangleについて
□投稿者/ Maranello (4回)-(2011/09/15(Thu) 12:29:52)
No62005 (shu さん) に返信
> ■No62003 (Maranello さん) に返信
>
>>AddHandler MyBase.Paint, AddressOf frmMain_Paint
>>を、OnResizeの中に書くということでしょうか?
> >
>>ひとまず上記をいれてみましたが、通常のフォームのサイズ変更などで
>>相当繰り返しPaintが呼ばれるようになってしまいました。
>
> AddHandler Me.Paint, AddressOf Form1_Paint
> だけではどんどんイベントが増えてしまいます。
>
>
> こっちの環境で再現できないので、憶測ですがこれでどう?
>
> Private Sub Form1_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize
> RemoveHandler Me.Paint, AddressOf Form1_Paint
> If Me.WindowState <> FormWindowState.Minimized Then
> AddHandler Me.Paint, AddressOf Form1_Paint
> End If
> End Sub

OnResizeに入れてみました。
無事に0ではない値がRectangleに入るようになりました。
ありがとうございます。

が、
まだ表示する際に黒い部分がはっきり出てしまいます。
(要するに0をスキップしたときと変わらない)

ここから先は本来の質問ではない、追加の質問になってしまいますが、
もしお時間あれば、この先を読んで、なにか分かることがあれば教えていただけませんか?

これは、フォーム上のコントロールの個数分、Paintが走ってしまうからなんでしょうか?
デバッグモードで動かすと徐々にフォームのコントロールが表示されていくのが分かります。

ちなみに、Windows7のOS設定で、システムのプロパティからパフォーマンスの
「ウインドウを最大化や最小化するときにアニメーションで表示する」
のチェックをはずしてあります。
このチェックが入っていると、アニメーションでずーんと出てくるのでその最中に描画され
見ている側としてはあまり気にならないのですが。。

パッっと出るようにしていると、黒塗りの部分が徐々に描画されていっているのが
はっきりと分かってしまいます。
DataGridViewのCellPaintingが途中に入るので(表示セルの数だけ動く)、
それに時間をとられて余計にそう見えてしまうのかもしれません。。。

フォームをなるべく一瞬でぱっと表示できるようなそういう解決策はないでしょうか。
またはDataGridViewのCellPaintingを高速化するような手段など、、、

ちなみにDataGridViewは1行ごとにVerticalでグラデーションをつけている感じです。
(全体の背景ではない)

こうしてみたらどうか、等ありましたら、なんでもいいので教えてください。
引用返信 編集キー/
■62014 / inTopicNo.8)  Re[7]: 最小化から戻るときのClientRectangleについて
□投稿者/ shu (994回)-(2011/09/15(Thu) 17:28:53)
No62006 (Maranello さん) に返信

> DataGridViewのCellPaintingが途中に入るので(表示セルの数だけ動く)、
> それに時間をとられて余計にそう見えてしまうのかもしれません。。。
FormのPaintよりこっちを抑制した方がいいんじゃないかな?
引用返信 編集キー/
■62040 / inTopicNo.9)  Re[8]: 最小化から戻るときのClientRectangleについて
□投稿者/ Maranello (5回)-(2011/09/16(Fri) 13:42:19)
No62014 (shu さん) に返信
> ■No62006 (Maranello さん) に返信
>
>>DataGridViewのCellPaintingが途中に入るので(表示セルの数だけ動く)、
>>それに時間をとられて余計にそう見えてしまうのかもしれません。。。
> FormのPaintよりこっちを抑制した方がいいんじゃないかな?

私もDataGridViewの処理をどうにかして減らせれば全体が高速化されると思っています。
抑制というのは、なにかよい方法がありますでしょうか。

今現在は、DataGridViewのセルごとにPaintが走る状態です。
デザイン的に全体を一つの背景(グラデーション)にするのは避けたいのですがそれしかないでしょうか。
せめて1行ずつPaintができればと思っていますが、そうなると枠をあとからまた書く必要があるのか等
描画についてまだまだ知識が足りない状態で、
なにか少しでもヒントをいただければ助かります。

よろしくお願いします。
引用返信 編集キー/
■62041 / inTopicNo.10)  Re[9]: 最小化から戻るときのClientRectangleについて
□投稿者/ ヒークン (6回)-(2011/09/16(Fri) 14:40:20)
2011/09/16(Fri) 14:50:12 編集(投稿者)

No62040 (Maranello さん) に返信

> 今現在は、DataGridViewのセルごとにPaintが走る状態です。
> デザイン的に全体を一つの背景(グラデーション)にするのは避けたいのですがそれしかないでしょうか。

よく理解できていない点があるのですが、
行毎に背景色をグラデーション表示にしたいのだと思いますが、グラデーションにする理由は何でしょうか?
引用返信 編集キー/
■62054 / inTopicNo.11)  Re[10]: 最小化から戻るときのClientRectangleについて
□投稿者/ Maranello (6回)-(2011/09/16(Fri) 21:54:42)
No62041 (ヒークン さん) に返信
> 2011/09/16(Fri) 14:50:12 編集(投稿者)
>
> ■No62040 (Maranello さん) に返信
>
>>今現在は、DataGridViewのセルごとにPaintが走る状態です。
>>デザイン的に全体を一つの背景(グラデーション)にするのは避けたいのですがそれしかないでしょうか。
>
> よく理解できていない点があるのですが、
> 行毎に背景色をグラデーション表示にしたいのだと思いますが、グラデーションにする理由は何でしょうか?

返信ありがとうございます。

グラデーションにする理由は見た目のデザインです。(グラデーションといっても非常に薄い感じの色合いです)
行ごとにするのはなぜか?ということでしょうか?
それも見た目のデザインでしています。
どうしても速度が解決できない場合は、DataGridView全体をひとつのグラデーションにするのも
致し方ないかなとは思っていますが。。。
引用返信 編集キー/
■62055 / inTopicNo.12)  Re[11]: 最小化から戻るときのClientRectangleについて
□投稿者/ ヒークン (7回)-(2011/09/17(Sat) 06:22:16)
No62054 (Maranello さん) に返信

> グラデーションにする理由は見た目のデザインです。(グラデーションといっても非常に薄い感じの色合いです)
> 行ごとにするのはなぜか?ということでしょうか?
> それも見た目のデザインでしています。

なるほど、分かりました。
例えば、DataGridViewのスクロールが発生するとPaintも走ると思いますが、
その際はちらつき感はないのでしょうか?
もし、今回の問題がDataGridViewのPaintによるものなのであれば、
DataGridViewのグラデーションを行わないようにすれば問題が出なくなると思うので、
一度試してみては如何でしょうか。

私は、DataGridViewTextBoxColumnやDataGridViewTextBoxCellを継承したものを複数列使い、
セルの特定文字のハイライト表示を行っていますが、特に描画のちらつき等や、
最小化から戻る時の違和感は感じていません。
(PaintはDataGridViewTextBoxCellの継承クラスで行っています。)

試していませんが、例えば、最小化状態から復帰するまでの間に、SuspendLayoutやResumeLayoutを
組み合わせて使ってみるのも一つの方法かもしれません。
引用返信 編集キー/
■62056 / inTopicNo.13)  Re[9]: 最小化から戻るときのClientRectangleについて
□投稿者/ shu (996回)-(2011/09/17(Sat) 08:17:56)
No62040 (Maranello さん) に返信

> 私もDataGridViewの処理をどうにかして減らせれば全体が高速化されると思っています。
> 抑制というのは、なにかよい方法がありますでしょうか。
高速化はとりあえずおいといて今回の現象の原因を特定するためにDataGridViewのPaintをすべて
止めてしまった場合に今回の現象は再現されなくなるのかをまず調べて変化がまったくなければ
別のところに原因があると考えないといけないと思います。


> 今現在は、DataGridViewのセルごとにPaintが走る状態です。
> デザイン的に全体を一つの背景(グラデーション)にするのは避けたいのですがそれしかないでしょうか。
> せめて1行ずつPaintができればと思っていますが、そうなると枠をあとからまた書く必要があるのか等
> 描画についてまだまだ知識が足りない状態で、
> なにか少しでもヒントをいただければ助かります。
最小化からの復元以外のとき特に描画に問題がないのならいままでに出てきた内容をDataGridViewのPaintに
適用してみてはどうでしょう?

引用返信 編集キー/
■62066 / inTopicNo.14)  Re[12]: 最小化から戻るときのClientRectangleについて
□投稿者/ Maranello (7回)-(2011/09/17(Sat) 20:28:05)
No62055 (ヒークン さん) に返信

土曜日なのに返事ありがとうございます。

> なるほど、分かりました。
> 例えば、DataGridViewのスクロールが発生するとPaintも走ると思いますが、
> その際はちらつき感はないのでしょうか?

スクロールの際もCellPaintingは走ります。
その際は特にちらつきは感じませんでした。(遅いPCでも試しました)


> もし、今回の問題がDataGridViewのPaintによるものなのであれば、
> DataGridViewのグラデーションを行わないようにすれば問題が出なくなると思うので、
> 一度試してみては如何でしょうか。

本当ですね。まずそれをしてないのがおかしいと思い、先ほどしてみました。
完全にCellPaintingをコメントにして実行しましたが、
最小化からの復帰時は結局黒いちらつきが見えてしまいました。
(ということはDataGridViewのPaintよりほかに問題がある可能性が高い)

OnPaintがボタンコントロールの数だけ動いたりしてるようなのでその辺なのか、、、
最小化からの復帰も条件が特殊?(アニメーションなし設定+Windows7)ですので
でももっといろいろと試せることがありそうだと思っております。
まだやってみます。


> 私は、DataGridViewTextBoxColumnやDataGridViewTextBoxCellを継承したものを複数列使い、
> セルの特定文字のハイライト表示を行っていますが、特に描画のちらつき等や、
> 最小化から戻る時の違和感は感じていません。
> (PaintはDataGridViewTextBoxCellの継承クラスで行っています。)

勉強不足でして、継承はまだまだ使いこなせていません。

> 試していませんが、例えば、最小化状態から復帰するまでの間に、SuspendLayoutやResumeLayoutを
> 組み合わせて使ってみるのも一つの方法かもしれません。

この「SuspendLayout」「ResumeLayout」を調べて試してみます。
ありがとうございます。
引用返信 編集キー/
■62067 / inTopicNo.15)  Re[10]: 最小化から戻るときのClientRectangleについて
□投稿者/ Maranello (8回)-(2011/09/17(Sat) 20:30:25)
No62056 (shu さん) に返信


> 高速化はとりあえずおいといて今回の現象の原因を特定するためにDataGridViewのPaintをすべて
> 止めてしまった場合に今回の現象は再現されなくなるのかをまず調べて変化がまったくなければ
> 別のところに原因があると考えないといけないと思います。
>

他の方への返信でも書きましたが、
まずそれをしてないのがおかしいと思い、先ほどしてみました。
完全にCellPaintingをコメントにして実行しましたが、
最小化からの復帰時は結局黒いちらつきが見えてしまいました。

ということで、shuさんのおっしゃるとおり、
最小化からの復帰時に、フォーム内が黒くちらつくのは、
DataGridViewのPaintよりほかに問題がある可能性が高そうです。

皆さんからのヒントで少しずつでも進めていっています。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -