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

目立たないでフォームのスケーリングをする方法

環境/言語:[Windows, XP、VB.NET(VS2002)]
分類:[.NET]

こんにちは 平ちゃんです。

いつもお世話さまです。また宜しくお願いします。

フォーム(Form1)に ”Windows フォーム デザイナで生成した” コントロールが沢山あります。

同じイメージでフォームをスケーリングしたいので(例えば1.125倍)
Me.Font = New Font(Me.Font.FontFamily, Me.Font.SizeInPoints * 1.125F)
Me.Scale(1.125F)

と Form1_Load イベントの先頭に書きますと、サイズはOKですが、
スケーリング途中の見苦しい画面が表示され気になります。
これは ”Windows フォーム デザイナで生成した” サイズで表示した後でスケーリングしている為と思います。

ならばとForm1のコンストラクタ に書きますと、見苦しい画面とさらにサイズが大きくなります。 (1.125 * 1.125 位)

何故スケーリングするかと言うと色々な解像度のモニターでも画面上の大きさをある程度同じにするためです。
アプリケーション起動時に解像度を読み込みスケーリングさせる予定です。

見苦しくなくスケーリングする方法をご存知の方すみませんが、ご教授の程宜しくお願いします。
SuspendLayout
■No9397に返信(中 博俊さんの記事)

ご回答 有難うございます。

> SuspendLayout
>

私もこの辺りかな と思いまして、色々試行錯誤していますが、思ったような結果が出ません。
引き続き試行錯誤し要点が煮詰まったら(できるかなあ?)質問させていただきます。
宜しくおねがいします。
■No9400に返信(平ちゃんさんの記事)

こんにちは 
自己レスです。

試行錯誤の結果です。

”Windows フォーム デザイナで生成した” コードはいじらない。
 ここをいじると、デザイナのご機嫌を損なうと勝手にコードが変更される。


スケーリング時の画面を良く見るとGroupBox1内のコントロールがサイズ変更しながら最終値に落ち着いているのが目障りなので、デザイン時にMe.GroupBox1.Visible = False とします。


次にForm1_Load イベントの先頭に

Me.SuspendLayout()
Me.Font = New Font(Me.Font.FontFamily, Me.Font.SizeInPoints * 1.125F)
Me.Scale(1.125F)
Me.ResumeLayout(False)
Me.GroupBox1.Visible = True

と書くと良くなりました。
特異な記述でもないので、これで行こうと思っています。


さて質問ですが
改善に役立ったのは Me.GroupBox1.Visible です。
Me.SuspendLayout()、Me.ResumeLayout(False) は在ってもも無くても動作に違いは見られず、単純にオマジナイ的な意味合いで入れています。
”Windows フォーム デザイナで生成した”コード内の SuspendLayout()、ResumeLayout(False) をコメントアウトして実験した結果、同じく動作に違いは見られませんでした。

私が未熟なのはさておき、どんな時に SuspendLayout()、ResumeLayout(False) で効果があるのでしょうか?
宜しくお願いします。
そうそうおまじないとおもえば、おまじないといえるかもしれません。
特に処理を何もしているわけじゃありません。
処理をしないようにしているのです。

MSDNより
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformscontrolclasssuspendlayouttopic.asp
ResumeLayout メソッドが呼び出されるまで、コントロールのレイアウト ロジックを中断します。
> さて質問ですが
> 改善に役立ったのは Me.GroupBox1.Visible です。
> Me.SuspendLayout()、Me.ResumeLayout(False) は在ってもも無くても動作に違いは見られず、単純にオマジナイ的な意味合いで入れています。
> ”Windows フォーム デザイナで生成した”コード内の SuspendLayout()、ResumeLayout(False) をコメントアウトして実験した結果、同じく動作に違いは見られませんでした。
>
> 私が未熟なのはさておき、どんな時に SuspendLayout()、ResumeLayout(False) で効果があるのでしょうか?
> 宜しくお願いします。
>
>

.net マガジン3月号(p.58)に書いてあったのですが、AnchorプロパティとDockプロパティを一時的に無効にしてコントロールのレイアウトを高速化できるそうです。

質問なのですが画面の解像度の取得はどうされたのでしょうか?
こんにちは、じゃんぬねっと です。

■No9411に返信(medakaさんの記事)
> 質問なのですが画面の解像度の取得はどうされたのでしょうか?

普通は Screen クラスからでしょう。

Screen.PrimaryScreen.Bounds.Height
Screen.PrimaryScreen.Bounds.Width



# スレッドに関係のない質問は別スレッドでやりましょう。
2005/03/01(Tue) 11:49:47 編集(投稿者)

■No9412に返信(じゃんぬねっとさんの記事)

■No9410に返信(中博俊さんの記事)

> そうそうおまじないとおもえば、おまじないといえるかもしれません。
> 特に処理を何もしているわけじゃありません。
> 処理をしないようにしているのです。
>
> MSDNより
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformscontrolclasssuspendlayouttopic.asp
> ResumeLayout メソッドが呼び出されるまで、コントロールのレイアウト ロジックを中断します。
>

このMSDNは何回も読みましたが理解できなかったのですが、お蔭様でやっと理解できました。
私のアプリは layoutイベント を使用していなかったので違いが出ないと言う事ですね。
理解の遅さ(悪さ?)を再認識です。





■No9411に返信(medakaさんの記事)

> .net マガジン3月号(p.58)に書いてあったのですが、AnchorプロパティとDockプロパティを一時的に無効にしてコントロールのレイアウトを高速化できるそうです。
>

情報ありがとうございます。参考にさせて頂きます。

> 質問なのですが画面の解像度の取得はどうされたのでしょうか?

■No9412に返信(じゃんぬねっとさんの記事)
> こんにちは、じゃんぬねっと です。
>

> 普通は Screen クラスからでしょう。
>
> Screen.PrimaryScreen.Bounds.Height
> Screen.PrimaryScreen.Bounds.Width
>

フォローありがとうございます。
只私の場合は Screen.PrimaryScreen.WorkingArea.Size です。
似たようなものでしょうか?




ーーーーーーーーーーーーーーーーーーーーー
ーーーーーーーーーーーーーーーーーーーーー

大分いい所まできまして、もう少し状態です。
すみませんが、ご教授ねがいます。

Me.Font = New Font(Me.Font.FontFamily, Me.Font.SizeInPoints * 1.125F)
Me.Scale(1.125F)

でフォームに含まれるコントロールのフォントの大きさも上手くスケーリングされているのですが、フォーム自体のText (フォームのタイトル)の文字サイズが変更されませんので小さく感じます。
欲張りみたいですがフォームのタイトルの文字サイズも同様に変更したいのです。。。。
> このMSDNは何回も読みましたが理解できなかったのですが、お蔭様でやっと理解できました。
> 私のアプリは layoutイベント を使用していなかったので違いが出ないと言う事ですね。
> 理解の遅さ(悪さ?)を再認識です。

Layoutイベントを実行しているのはあなただけではありませんよ?
どんなつくりをしているか分かりませんが、びっくりするほどの効果は無いからじゃないでしょうか?
また、それを打ち消すくらいの処理をしているのか。

全体像が見えないのでわかりしぇーーん
2005/03/01(Tue) 20:01:55 編集(投稿者)

■No9414に返信(中博俊さんの記事)

>
> Layoutイベントを実行しているのはあなただけではありませんよ?


う〜ん 意味深なメッセージを.....と言う事で再度 MSDN です。
MSDNより
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformscontrolclasssuspendlayouttopic.asp
確かにここの使用例にはLayoutイベントはありません。という事は私が Layoutイベントをコーディングしなくても、ちゃんと効果があると

言うことですね。という事は「Layoutイベントを実行しているのは私だけではない」という事か。うん なるほど納得。

> Layoutイベントを実行しているのはあなただけではありませんよ?
これはさらに 「もっと言うと Layoutイベントに限らず イベントを実行しているのはあなただけではありませんよ? 例えばあなたがフ

ォームのPaint イベントを書かなくとも、あなたの出したメッセージボックスが終了した後をちゃんと私が再描画していますよ。」と解釈

してもまあ大きく外れてないと言う事でしょうか。

こういった基本的な事を深く考えてなかったので大変勉強になりました。


> どんなつくりをしているか分かりませんが、びっくりするほどの効果は無いからじゃないでしょうか?
> また、それを打ち消すくらいの処理をしているのか。
>
> 全体像が見えないのでわかりしぇーーん

これに関しましては大した作りはしていません。小さなアプリです。従って効果は解りません。
実際に MSDN の使用例を動作させて見ましたが、違いが全く解りません。
しかし、解らないだけで効果はあると信じましょう。

基本的な大事な事を教わりました。有難うございました。

フォームのタイトルの文字サイズの件がまだ未解決ですが、良しとして解決済みとします。
解決済み!
> フォームのタイトルの文字サイズの件がまだ未解決ですが、良しとして解決済みとします。

フォームのタイトルバーはWindowsが管理しているので、かなり難しいと思います。本当のタイトルバーを表示しないようにして、偽物のタイトルバーを自作する方法なら簡単にできそうです。
2005/03/02(Wed) 12:13:09 編集(投稿者)

■No9438に返信(管理人さんの記事)
>>フォームのタイトルの文字サイズの件がまだ未解決ですが、良しとして解決済みとします。
>
> フォームのタイトルバーはWindowsが管理しているので、かなり難しいと思います。本当のタイトルバーを表示しないようにして、偽物のタイトルバーを自作する方法なら簡単にできそうです。

管理人様 はじめまして。
掲示板だけでなく、このサイトのメルマガやインストーラの研究、Tips 等等 大変にお世話になっています。今後とも宜しくお願いします。

わざわざのご回答有難うございます。
フォームのクライアント領域外に偽物のタイトルバーを作るのは私のレベルではまだまだの気がしますが、チャレンジしてみます。
ユーザには、「こんなものです」ですましました。
解決済み!

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