プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

C++/CLIでフォームのタイトルバーのダブルクリックで最大化させない。

この記事は2018年08月06日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. 最大化を禁止する方法
  3. おわりに

Microsoft Visual C++/CLI Step by Step (Step by Step Developer) (English Edition)

Microsoft Visual C++/CLI Step by Step (Step by Step Developer) (English Edition)

1. はじめに

こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。

今回は業務で使用しているC++/CLIの話です。
ユーザへの通知用にフォームでダイアログ画面を作成しました。
メッセージを表示するラベルと、ダイアログを閉じるOKボタンだけのシンプルな画面にしました。
ダイアログのサイズ変更を禁止するため、フォームのConrolBoxプロパティをfalseにしました。
これによりタイトルバーの最小化ボタン、最大化ボタン、閉じるボタンが表示されなくなり、ダイアログを最大化できなくなると考えてました。
ところがタイトルバーをダブルクリックすると、ダイアログが最大化してしまうと報告があり、対応を調査しました。

目次へ

2. 最大化を禁止する方法

調べてみるとConrolBoxプロパティの設定だけでは、タイトルバーのダブルクリックによる最大化は禁止されませんでした。
タイトルバーのダブルクリックによる最大化を禁止する方法としては、次の3つがあるようです。

  1. MaximizeBoxプロパティをfalseに設定する。
  2. そのフォームに対するWM_NCLBUTTONDBLCLK メッセージを無視する。
  3. そのフォームに対するサイズ変更イベントで、最大化された時に元の状態に戻す。

2, 3の方法は実装が必要となるため、今回はプロパティの変更だけでよい1の方法を採用しました。

MaximizeBoxプロパティをfalseに設定すると、最大化に関する動作が禁止になるようで、

  • 最大化ボタンは非表示
  • ショートカットキー"Win + ↑"による最大化が禁止
  • タイトルバーのダブルクリックによる最大化が禁止

となります。

同様にMinimizeBoxプロパティをfalseに設定した場合は、最小化に関する動作が禁止になります。

参考ですが、2のWM_NCLBUTTONDBLCLKメッセージを無視する方法です。
以下のメソッドをダイアログのフォームに実装してください。

#define WM_NCLBUTTONDBLCLK  (0xA3)

/// ウィンドウプロシージャ
virtual void WndProc(Message% m) override
{
    // 非クライアント領域内でマウスの左ボタンがダブルクリックされた場合
    if (m.Msg == WM_NCLBUTTONDBLCLK)
    {
        m.Result = IntPtr::Zero;
        return;
    }
    Form::WndProc(m);
}

3のサイズ変更イベントを利用する方法です。
ダイアログのサイズ変更イベントのイベントハンドラとして呼び出してください。
サンプルでは、最小化された時も元の状態に戻すようにしています。

/// サイズ変更イベントのイベントハンドラ
private: System::Void Form_SizeChanged(Object^ sender, EventArgs^ e)
{
    // ウィンドウの状態が最大化、または最小化された場合
    if ((this->WindowState == FormWindowState::Maximized) ||
        (this->WindowState == FormWindowState::Minimized))
    {
        // 通常の状態に戻します。
        this->WindowState = FormWindowState::Normal;
    }
}

API Reference
ControlBoxプロパティ
MaximizeBoxプロパティ

目次へ

3. おわりに

ダイアログが表示されたとき、元の画面の内容を確認しようとして、ダイアログのタイトルバーをドラッグした時に誤ってダブルクリックとなり発覚しました。
てっきりConrolBoxプロパティの設定で、最大化禁止になったと思い込んでいました。

転職を本気で考えている方向けのプログラミングスクール!【WebCampPRO】

世界でいちばん簡単なVisualC++のe本 標準C++とC++/CLIの基本と考え方がわかる本

世界でいちばん簡単なVisualC++のe本 標準C++とC++/CLIの基本と考え方がわかる本

紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。

目次へ


私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。

また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688

目次へ