- - PR -
Formの最大化表示について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-27 15:41
VB.NET2003にてWinアプリを開発しています。
お客様からの以下の要望をもらっています。 1)画面の最大化、最小化ボタンは出したくない 2)タスクバーが見える状態で常に最大化表示する。 Fromのデザイン時のプロパティで、 MaximizeBox を False、 WindowState を Maximized とすると、タスクバーが隠れてディスプレイのデスクトップ領域全体表示となってしまいます。 そこで、調べた結果、デザインではMaximizeBox = Trueとしておき、 FormのLoad時に、MaximizeBox = False とすることで、要望どおり タスクバーは見える状態の、ディスプレイの作業領域での最大化表示とすることができました。 しかし、検索処理などで、ちょっと重い処理(CPU負荷の高い処理)を行うと、 その処理中に画面が勝手に、デスクトップ領域まで広がってしまいます。 なぜこのような動作となってしまうのでしょうか? 防ぐ方法はありますでしょうか? 根本的にMaximizeBox=False、WindowState=Maximizedの組合せは、 デスクトップ領域での最大化となる仕様ということで、防ぎようが無いことなのでしょうか? 仕様なので、無理と言うことであれば、 WindowState=Nomalとして、FormのLoad時にディスプレイの作業領域を算出して SetDesktopBoundsにて大きさを指定しようとしています。 (ただ、これだとFormの枠が表示されてしまうので、できれば避けたいと言う要望名のですが・・・) よろしくお願いします。 | ||||||||
|
投稿日時: 2007-02-27 21:56
質問に対する回答ではありません。
昔、そういうアプリ作ったなぁ。社内のリーダに「そんな使いにくいモノ、本当に大丈夫なんですか?!」と詰め寄ったけど、「お客がそない言うとんやからかまへん」と、相手にしてもらえなかった。 そして、納入後。。。お客のお客、つまり、実際に使う人から、「なんでこんな使いにくい作りにしたんですか?」 *お客→お客の情報システム部→元請け→私 という構図 *「お客の情報システム部」とは話をしたが、「お客」とは話をしてなかった。 発注者がエンド ユーザでない場合、よく、エンド ユーザの意図をくみ上げているか、確認しておく方がいいですよ。 _________________ | ||||||||
|
投稿日時: 2007-02-27 22:21
>Jittaさん
助言ありがとうございます。 確かに、「いったいこの仕様で何がしたいんだ?!」と言う感じです・・・ 当初は、このアプリを使用中のオペレータには、基本的にこれ以外一切何も操作させないということで 「最小化」も「最大化」もできなくし、画面はディスプレイ全体に表示と言う仕様でした。 しかし、結局、タスクバーはないと不便ということになり。 タスクバーを表示したい⇒他のアプリも動かしたい⇒「最小化」とかできたほうがいいんじゃないの?と思うんですけど・・・ お客様と私の間は、Jittaさんの時以上に遠いです。 なので、とりあえず言われるまま作るしかない、っていう状態です。 しかし、あんまり時間をかけるほどの問題じゃないとおもうので、 「仕様なんで無理」って言ってしまいたいんですけどね・・・ | ||||||||
|
投稿日時: 2007-02-28 08:33
タスクバーが隠れるのはWindows的仕様です・・・と言い切ってしまったほうが良さそうですね。 どうしてもタスクバーが隠れるのが嫌なら、タスクバーのプロパティで「タスクバーをほかのウィンドウの手前に表示する」にチェックを付けて運用して下さいと、お客様と交渉している方にお願いして貰いましょう。 | ||||||||
|
投稿日時: 2007-02-28 09:40
何だか解決策が出ていないようですが、
これであれば、"最大化" である必要はないように思えます。 通常表示をデスクトップの作業領域に広げてしまい、MOVE と RESIZE を禁止にすれば良いですよね。 (お客さんは言葉のボキャブラリが少ないため、真の要件を聞き出す必要があります) というより、似たような案件でそのように対応しました。 面倒なのは、タスクバーの位置ですね。 過去のスレッドを漁ってみると、中吉かもしれません。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2007-02-28 10:09
梶さん、じゃんぬねっとさん
返答ありがとうございます。 実は、既に納入済みのアプリなんです。 最初の段階で、作業領域を算出して通常領域を広げると言う形を取っておけばよかったのですが デザインではMaximizeBox = Trueとして、 FormのLoad時に、MaximizeBox = False とする と言う方法で、要望を満たす形で納入してしまったんですよね・・・。 ですので、いつの間にかタスクバーが隠れているという不具合になってしまいました。 作業領域を算出して、通常領域をそのサイズに広げると、 「最大化」だと表示されなかった画面の枠が表示されてしまうのが嫌みたいなのですが・・・ 今回は、仕様であることを説明して、我慢していただくことにします。 ありがとうございました。 | ||||||||
|
投稿日時: 2007-02-28 12:52
何を聞きたかったのかよく分かりませんが、回避したいという事ですよね? Screen.GetWorkingArea() や SystemInformation.WorkingArea 等でデスクトップのワーキングエリアを取得します。 SystemInformation.BorderSize か SystemInformation.Border3DSize のどちらか使い、ウィンドウの枠サイズを取得します。 ウィンドウのサイズを「ワーキングエリア + (枠サイズ * 2)」にし、ウィンドウの左上座標を「ワーキングエリア - 枠サイズ」にします(x, y ともに)。 WndProc をオーバーライドし、WM_SETTINGCHANGE を監視し、タスクバーのサイズ変更、位置変更、ウィンドウ枠サイズの変更に対処します。 タイトルバーを触られてもウィンドウが移動できないようにします。 試していませんが、この手順で Vista や Google のようなワーキングウィンドウのサイズを変えるサイドバーにも対応できるかもしれません。 要は最大化を自分でやってしまうという事ですね。 マルチディスプレイなら更に問題があると思いますが、とりあえずはこんなもんで。 _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2007-02-28 22:23
>囚人 さま
返答ありがとうございます。 自分で最大化の際の動作をやってしまうということですね! タスクバーのサイズ変更などを検知し、その時点のディスプレイの作業領域を取得して、 それにあわせてFormのサイズを取得すると言うことでよろしいでしょうか? 試してみます。 ありがとうございました! |