MDIformから最大化ボタンを消すには?

解決


tadakichi  2006-01-30 20:12:35  No: 129940

MDI親フォームの最大化ボタンを消去したいのですが、APIのSetWindowLongを使うと、
最大化時に、フォームの大きさがタスクバーを無視してフルスクリーンサイズに固定されてしまい、
フォーム下部に設置したステータスバーが見えなくなってしまいます。
フォームをタスクバーよりも前面に配置する事も考えたのですが、
やはりタスクバーが見えないと使い勝手の面で納得がいかず、苦戦しております(-"-;A)
環境はVB6.0でWindowsXPです。
どなたかご教授下さいますようお願いします。


魔界の仮面弁士  2006-01-30 22:24:29  No: 129941

> MDI親フォームの最大化ボタンを消去したいのですが、APIのSetWindowLongを使うと、
これですね。
http://web.archive.org/web/20040404032234/galliver.co.jp/writing/msdn/msdn02/index.html

> 最大化時に、フォームの大きさがタスクバーを無視して
最大化ボタンを消した上で、最大化するための手段を残すのも何なので、
システムメニューの[最大化]項目なども取り除いておくとか。

> フォーム下部に設置したステータスバーが見えなくなってしまいます。
MDI フォームへの WM_GETMINMAXINFO メッセージを捕らえて、
MINMAXINFO 構造体の内容を書き換えてみるとか。
http://www.momo-lab.net/inu/bigform.html


tadakichi  2006-01-30 23:57:44  No: 129942

魔界の仮面弁士さん早速のレス有り難うございます。

> 最大化ボタンを消した上で、最大化するための手段を残すのも何なので、
> システムメニューの[最大化]項目なども取り除いておくとか。
最大化に関しては、フォームに色々と乗せすぎたせいで、フォームが大きくなりすぎ、
その関係で、MDIフォームのWindowStateを、初めから最大化にしています。

というわけで、魔界の仮面弁士さんが教えてくださった、MINMAXINFOの構造体の書き換えにチャレンジしてみたいと思います。
でも・・・すぐにはできそうも無いので、じっくり時間をかけてみようかと思います・・・(^▽^;)
でわ、本腰入れて挑戦してきます。

魔界の仮面弁士さん、本当にありがとう御座います。


tadakichi  2006-01-31 03:51:13  No: 129943

遅くなりましたが結果報告です。
どうやらform_load時に最大化ボタンを消していたのが悪かったようで、
スマートではないですが、timerをかませてLoad直後に、最大化ボタンを消すと上手く行きました。
しかし、これだと何らかのアクションでフォームを最小化すると、再びフォームがタスクバーを無視してフルスクリーンサイズに固定されてしまいましたので
MDIFormのResize時にMINMAXINFOの構造体の書き換えを行い、その都度最大化サイズを書き換える事でタスクバーの自動隠しにも対応できました(^^;)
もっといい方法が在りそうだとは思うので、地道に改良していきたいと思います。
重ね重ね、本当に有り難う御座いました。


魔界の仮面弁士  2006-01-31 04:11:26  No: 129944

> その関係で、MDIフォームのWindowStateを、初めから最大化にしています。
試していないのですが、最大化にしておかなければ良いのでは?

WindowState は 通常モードにしておいた上で、フォームのWidth/Heightを
明示的に指定すれば済むような気がします。

それと、タスクバーのサイズや位置の変更にも対応させるために、
SysInfo(システム情報)コントロールを使うのも、一つの手です。

WorkArea** プロパティで、タスクバー領域を除いた画面サイズを得られますし、
SettingChangedイベントで、引数がSPI_SETWORKAREA(=47)になる時を
捉えるようにすれば、タスクバーの変更に即座に対応させる事もできますから。


tadakichi  2006-01-31 19:44:17  No: 129945

何度も、ご指摘有り難うございます。<(*__)>

> 試していないのですが、最大化にしておかなければ良いのでは?
確かに魔界の仮面弁士の仰る通り、最大化にしておかなければ上手く行きました。
でも、今回作成しているソフトは外部機器と連携するようなソフトなのですが、
1280×1024picの解像度でモニターのほぼ全面を使うような大きさになってしまった為、
最大化しないと中途半端な大きさになってしまうのです。
それに、この仕様だけで結構な時間を消費したので、こうなりゃ意地でも最大化で実現していきたいと思ってます(笑

>SysInfo(システム情報)コントロールを使うのも、一つの手です。
早速SettingChangedイベントを使用させて頂きました所、問題なく動作できました。
SysInfoコントロールは非常に使い勝手がよく重宝しそうです。

度重なるご指導、有り難う御座います。


魔界の仮面弁士  2006-01-31 20:06:04  No: 129946

> 1280×1024picの解像度でモニターのほぼ全面を使うような大きさになってしまった為、
> 最大化しないと中途半端な大きさになってしまうのです。

別に最大化せずとも、
  Private Sub MDIForm_Load()
    Me.WindowState = FormWindowStateConstants.vbNormal
    Me.Move 0, 0, 幅 * Screen.TwipsPerPixelX, 高さ * Screen.TwipsPerPixelY
  End Sub
などとして、大きさは自由に制御できるような気がしますが…。


tadakichi  2006-01-31 21:57:02  No: 129947

確かに。最大化でも標準でも、本当はどちらでもいいのです。
むしろ、最大化ボタンを消去したら、最大化しない方が無難ですよね(^^;)
わざわざ最大化にしたのは、どちらかと言えば「見ため的に何となくそうしたかった」というぐらいの理由なので(*^^)ノ
フィーリングに従ったら、えらい苦労してしまいました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加