タイトル : 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 するようにするか、あるいは複数のコントロールで 同じフォントインスタンスを共有するなどしてリソースを節約できるかと思います。 |