質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

1536閲覧

作成したformを移動させるとウインドウサイズが変わる

sin777

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/07/16 12:13

新規作成したformの最大化ボタンを押すと
400×400のウインドウサイズになるように設定しました。
実行させて、最大化ボタンを押すと400×400のウインドウサイズになりますが、
そのままのサイズでマウスで移動させると、ウィンドウが小さくなります。(起動した時の大きさ)
最大化した状態で移動させたいのですが、どの様にすればいいのでしょうか。

※最大化した時のサイズは、form1プロパティのMaximumSizeに400,400と入れました。

C#

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp4 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

最大化はデスクトップのクライアント領域をいっぱいいっぱい使って表示するモードに切り替えるという動作になります
で、Vista以降だとウィンドウタイトルな場所をドラッグしてデスクトップの一番上端にマウスポインタが到達すると波紋が広がります
その状態でドロップすると最大化し、逆に最大化状態でタイトルバーをドラッグすると最大化が解除されます
なので、ドラッグするとサイズが元に戻るというのは最大化が解除されたため起こる現象です
その為、最大化が解除されたイベントハンドラを用意してその時に最大化したときのウィンドウサイズにリサイズする処理を入れればとりあえずは大きさが変わらないようにはできるはずです
また、最大化解除のイベントハンドラ内でウィンドウ上でのマウスポインタの座標と最大化時のウィンドウの座標を保持し、解除後のウィンドウ位置を計算して移動させる必要が出てくるかと思います

投稿2018/07/16 14:12

len_souko

総合スコア1337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sin777

2018/07/17 14:30

アドバイス有難う御座います。ネット等調べてみてチャレンジしてみます。
guest

0

ベストアンサー

例えば、フォームサイズ変更時に、WindowStateがMaximized(最大化)の場合に、WindowStateをNormal(通常)に戻し、WindowサイズをMaximumSizeに設定する、という方法はどうでしょう。
これはFormのSizeChangedイベントで捕捉できますが、今回のようなケースだと、通常状態のフォームのサイズが最大化フォームのサイズと同じになってしまう場合があり、この時に意図しない動作が発生するかも知れません。
この場合、WndProcでWM_SIZEメッセージを検知することにより、最大化状態を検知できますので、これを利用したサンプルを作成してみました。

C#

1 2using System.Security.Permissions; 3 4//途中略 5 6 [SecurityPermission(SecurityAction.Demand, 7 Flags = SecurityPermissionFlag.UnmanagedCode)] 8 protected override void WndProc(ref Message m) 9 { 10 const int WM_SIZE = 0x5; 11 const int SIZE_MAXIMIZED = 0x2; 12 13 if (m.Msg == WM_SIZE) 14 { 15 if (m.WParam.ToInt32() == SIZE_MAXIMIZED) 16 { 17 WindowState = FormWindowState.Normal; 18 this.Size = this.MaximumSize; 19 } 20 } 21 22 base.WndProc(ref m); 23 }

もしかしたら、フォームの最大化→通常という動作が一瞬発生するため、ちらつきが出るかも知れません。

投稿2018/08/01 06:05

編集2018/08/01 06:13
kenshirou

総合スコア772

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sin777

2018/08/01 12:34

回答有難うございます。 さっそくサンプルをコピーして実行してみました。 最大化した後、formを移動させてもformサイズが変わらず 移動出来たので、感動しました。有難う御座います。 例えば、もし最大化した後、通常サイズ(400×400)のウインドウに 戻したいと思う時には、どうすればいいのでしょうか。 (最大化ボタンを押しても通常サイズに戻らないので)
sin777

2018/08/01 12:54

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1: Form { public Form1() { InitializeComponent(); Initialize(); } public int sss = 0; public int wf = 0; //最大化ボタンのOn・Off private void Initialize() { base.ResizeBegin += OnResizeBegun; base.Resize += OnResized; base.ResizeEnd += OnResizeEnded; } private void OnResizeBegun(object sender, EventArgs e) { //MessageBox.Show("[" + System.DateTime.Now.ToString() + "] OnResizeBegun"); } private void OnResized(object sender, EventArgs e) { //MessageBox.Show("[" + System.DateTime.Now.ToString() + "] OnResized"); if (base.WindowState == FormWindowState.Normal) this.Size = new Size(300, 300); sss = 0; //if (base.WindowState == FormWindowState.Minimized) //MessageBox.Show("最小化のタイミング"); if (base.WindowState == FormWindowState.Maximized) //MessageBox.Show("最大化のタイミング"); this.MaximizedBounds = new Rectangle(1400, 30, 500, 800); sss = 1; } private void OnResizeEnded(object sender, EventArgs e) { //MessageBox.Show("[" + System.DateTime.Now.ToString() + "] OnResizeEnded"); if (wf == 0) { //MessageBox.Show("Normalです"); this.Size = new Size(300, 300); } if (wf == 1) { //MessageBox.Show("最大化です"); this.Bounds = new Rectangle(1400, 30, 500, 800); } } } } http://www.geocities.jp/kandou_quester/Knowledge/Programming/CSharp/_resize_of_form.html のサイトを参考にし、(そのままですが)作成しようとしていました。 最大化ボタンを押した後、formを移動させると通常サイズに なってしまいますが、最大化と通常サイズを切り替えられる様に したいと思い、考えていました。
kenshirou

2018/08/02 04:38 編集

>例えば、もし最大化した後、通常サイズ(400×400)のウインドウに >戻したいと思う時には、どうすればいいのでしょうか。 >(最大化ボタンを押しても通常サイズに戻らないので) この質問の意味が良く理解できませんでした。 上記でいう「最大化」とは、ウィンドウ全体をフルスクリーン表示すること(またはその状態)でしょうか?(フォームのMaximumSizeが設定されている場合、スクリーン左上に固定された、MaximumSizeのウインドウが開く) それとも、フォームのMaximumSizeプロパティに設定したサイズになることでしょうか? ※ちなみに、今回私が提示したコードは、いわゆる「なんちゃって最大化」のため、最大化の操作を行った場合でも、MaximumSizeのサイズになった通常表示モードになります。
sin777

2018/08/02 15:59

返事が遅くなりすみません。また、 質問が解りにくてすみませんでした。 一応、自己解決しました。 private int wf = 1; protected override void WndProc(ref Message m) { const int WM_SIZE = 0x5; if (m.Msg == WM_SIZE) { if (wf == 0) { wf = 1; WindowState = FormWindowState.Normal; this.Size = this.MaximumSize; } else { wf = 0; WindowState = FormWindowState.Normal; this.Size = new Size(400, 400); } } base.WndProc(ref m); と言う感じで、wfの値が0ならMaximumSizeのサイズになった通常表示モード、 wfの値が1なら(400×400)サイズの通常表示モードに切り替え出来る様にしました。 (最大化ボタンを押すたびに変わる様にしました) 今は最小化ボタンを押すと最大化ボタンを押した時と同じ動作をしているので、 通常の最小化の動作になる様にチャレンジしています。 kenshirouさんのお陰でタイトルにある疑問は解決出来ましたので、 kenshirouさんをベストアンサーとさせていただきます。 本当に有難う御座いました。
guest

0

それがWindowsの仕様です
マウスで移動させないようにすればいいんじゃないでしょうか

投稿2018/07/16 15:01

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問