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

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

ただいまの
回答率

90.50%

  • C#

    7132questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 204

sin777

score 11

新規作成した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();
      }
   }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/17 23:30

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

    キャンセル

checkベストアンサー

0

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

using System.Security.Permissions;

//途中略

        [SecurityPermission(SecurityAction.Demand, 
        Flags = SecurityPermissionFlag.UnmanagedCode)]
        protected override void WndProc(ref Message m)
        {
            const int WM_SIZE = 0x5;
            const int SIZE_MAXIMIZED = 0x2;

            if (m.Msg == WM_SIZE)
            {
                if (m.WParam.ToInt32() == SIZE_MAXIMIZED)
                {
                    WindowState = FormWindowState.Normal;
                    this.Size = this.MaximumSize;
                }
            }

            base.WndProc(ref m);
        }

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/01 21:34

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

    キャンセル

  • 2018/08/01 21: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を移動させると通常サイズに
    なってしまいますが、最大化と通常サイズを切り替えられる様に
    したいと思い、考えていました。

    キャンセル

  • 2018/08/02 13:04 編集

    >例えば、もし最大化した後、通常サイズ(400×400)のウインドウに
    >戻したいと思う時には、どうすればいいのでしょうか。
    >(最大化ボタンを押しても通常サイズに戻らないので)

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

    キャンセル

  • 2018/08/03 00: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さんをベストアンサーとさせていただきます。
    本当に有難う御座いました。

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    C# 複数のTimerを処理する際に、実行されない場合がある

    ボタンを押したときにTimerでボタンの色を変更する処理を作成しています。 下記コードで基本的な動きはできるようになったのですが、 ボタンAとBを交互に素早く押すという動作

  • 受付中

    Visual StudioでHTMLのようなアンカーテキストを使用する方法

    あるリンクをクリックするとそのページ内の特定の位置まで移動する機能を実装したいと思っています。 どういう風なツール、アルゴリズムを用いるべきか教えてください。

  • 解決済

    C#

    C#について解決いたしました。本当に助かりました。またどうぞ宜しくお願いいたします。

  • 解決済

    dynamicがクラスライブラリで使えない

     問題点 以下のようにdynamicな変数xのidという値を出力しようとしています。 Class1をクラスライブラリに入れると動作しなくなりました。 クラスライブラリに入れな

  • 解決済

    C#Formの設定

    実行したいこと C#のFormに関することです ①タイトルバーは表示したままとする ②タイトルバーにある最小化ボタン無効化 ③タイトルバーにある最大化ボタン無効化 ④タイ

  • 解決済

    C# DatagridViewの使い方

    C# DataGridViewについて 1列目の1行目にA、2行目にB、3行目にCと表示したくて下記のようにコーディングしました。 namespace WindowsF

  • 解決済

    IEをオートメーション出来るプログラミング言語(エクセルVBA以外)

    お世話になります。 タイトルの通りです。 IEをマクロで自動制御出来るプログラミング言語を知りたいです。 エクセルVBAで事は足りるのですが、エクセルが付いている事が

  • 解決済

    cabファイルの中身のファイル情報を取得したい。

    前提・実現したいこと cabファイルの中身のファイル情報を、WindowsコマンドもしくはC#で取得したいと考えています。 Windows10のエクスプローラーでcabファイル

同じタグがついた質問を見る

  • C#

    7132questions

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