tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: Resizeイベントが複数回発生する
投稿日: 2016/12/16(Fri) 10:41
投稿者魔界の仮面弁士
> AncherやDockを試しましたが
※Ancher → Anchor

レイアウトにもよりますが、TableLayoutPanel などの
レイアウト用パネルコントロールを併用してみるのは如何でしょうか。


> その後フォームレイアウトがぐっちゃぐちゃになります。

『c.Height = CInt(c.Height * ScaleChg)』などとしていますが、
座標情報は整数のため、丸め誤差の関係上、フォームを
元のサイズに戻したときに、以前と同じ位置に復元されない可能性があります。

前回の Bounds 情報に対してリサイズを測るのではなく、
基準となる最初のレイアウト情報を保持しておき、
それと比較して座標計算を行った方が安全です。

今回は FixedSingle なので僅かな差異にしかなりませんが、
Sizable のまま 1 ドットずつゆっくりリサイズした場合などでは
問題が顕現しやすくなります。


> Resizeイベントが複数回(3〜5回)発生して

手元の環境では、最大化最小化のケースでは再現しませんでしたが、
そもそも、Resize や Layout は連続して発生しうるものです。

その時々で Me.Bounds.ToString() は同じ値でしょうか?
それとも違うサイズでしょうか?

環境によっては、リサイズ時にアニメーション効果を伴うものがあり、
それが影響している可能性があります。あるいは PC 側の
グラフィック性能に依存するのかも知れませんが。


それと、複数のコントロールのレイアウトを変更する場合は、
SuspendLayout メソッド/ResumeLayout メソッドも有効です。
ただし Dock 指定されたコントロールや、子コントロールを含むコントロールが
無い場合には、これを呼び出しても変わり映えしないかも知れません。
http://dobon.net/vb/dotnet/control/suspendlayout.html


> Q1.フォーム最大状態→フォーム通常サイズ化 時は1回だけ処理を
>   行うようにするにはどうすれば良いでしょう?
> Q2.この際だから大人しくAncherとDockを理解したほうがよいものでしょうか?

最初の Resize 発生時に Application.Idle イベントを AddHandler し、
その Idle イベント内でサイズ調整するようにします。重複呼び出しを
防ぐため、Idle イベント内では、自身を直ちに RemoveHandler してください。

もしくは、ResizeEnd が使える可能性もあります。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=60076&KLOG=100
ただし ResizeBegin/End は、フォーム移動時にも通知されるのでご注意ください。

これらのコード例としては、下記が参考になるかと思います。
http://dobon.net/vb/dotnet/form/preventcontrolresize.html



> Dim ScaleChg As Double = CDbl(Me.Width / bufWidth)  '倍率
「Integer / Integer」は常に Double 型なので、CDbl は冗長です。


> For Each c As Control In Me.Controls
この場合、フォーム直下に貼ったコントロールのみが対象になり、
Panel 等の下に貼った子階層コントロールはリサイズされませんが
その点は問題無いでしょうか。


> c.Top = CInt(c.Top * ScaleChg)
> c.Left = CInt(c.Left * ScaleChg)
> c.Height = CInt(c.Height * ScaleChg)
> c.Width = CInt(c.Width * ScaleChg)
4 回に分けてセットするのではなく、
SetBounds メソッドもしくは Bounds プロパティを用いて
1 回にまとめる事をお奨めします。


> c.Font = New Font(c.Font.FontFamily, _
>       CInt(CDbl(c.Font.Size) * ScaleChg), c.Font.Style)
Font は IDisposable なので、頻繁に作成することは問題が生じるかも知れません。

現時点で問題ないようであれば、ガベージコレクトまかせでも良いですが、
長時間の連続実行時などで問題が出るようなら、新しいフォントをセットした後で
古い物を明示的に Dispose するようにするか、あるいは複数のコントロールで
同じフォントインスタンスを共有するなどしてリソースを節約できるかと思います。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。