6月 13

ウィンドウのタイトルを点滅(FlashWindow)させる

ウィンドウのタイトルを点滅させたい場合は
Win32APIの FlashWindowEx APIをコールします。

サンプルコードの前半は同APIを利用するための準備で
ボタンを押すと点滅させています。

点滅後はタイトルが強調表示されたままになります。

何かの処理が完了したことを知らせる場合などに利用します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;   // DllImportのために必要

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        static extern Int32 FlashWindowEx(ref FLASHWINFO pwfi);

        [StructLayout(LayoutKind.Sequential)]
        public struct FLASHWINFO
        {
            public UInt32 cbSize;    // FLASHWINFO構造体のサイズ
            public IntPtr hwnd;      // 点滅対象のウィンドウ・ハンドル
            public UInt32 dwFlags;   // 以下の「FLASHW_XXX」のいずれか
            public UInt32 uCount;    // 点滅する回数
            public UInt32 dwTimeout; // 点滅する間隔(ミリ秒単位)
        }

        
        public const UInt32 FLASHW_STOP = 0;        // 点滅を止める
        public const UInt32 FLASHW_CAPTION = 1;     // タイトルバーを点滅させる
        public const UInt32 FLASHW_TRAY = 2;        // タスクバー・ボタンを点滅させる
        public const UInt32 FLASHW_ALL = 3;         // タスクバー・ボタンとタイトルバーを点滅させる
        public const UInt32 FLASHW_TIMER = 4;       // FLASHW_STOPが指定されるまでずっと点滅させる
        public const UInt32 FLASHW_TIMERNOFG = 12;  // ウィンドウが最前面に来るまでずっと点滅させる

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FLASHWINFO fInfo = new FLASHWINFO();
            fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo));
            fInfo.hwnd = this.Handle;
            fInfo.dwFlags = FLASHW_ALL;
            fInfo.uCount = 5; // 点滅回数
            fInfo.dwTimeout = 0;

            FlashWindowEx(ref fInfo);
        }
    }
}
6月 13

フォームのクライアント領域をスクロールさせる

フォームに沢山のコントロールを配置したい場合や
フォームが小さい場合に
フォームのクライアント領域をスクロールして使いたい場合があります。

その場合は
フォームのAutoScrollプロパティーにtrueを設定してください。

デザイン時に当該プロパティーにtrueを設定して
フォーム上のコントロールを
クライアント領域外へドラッグすると
フォームにスクロールバーが出現します。

【補足】
フォーム内のある部分だけスクロールしたい場合は
スクロールしたい部分にPanelコントロールを配置し、
同じようにAutoScrollプロパティーにtrueを設定します。
すると、Panel上のコントロールがスクロールされます。

form_scroll

this.AutoScroll = true;
6月 13

フォームで押されたボタンの種類を表示元で取得する

下図のようなフォームの表示を例に
フォームで押されたボタンの種類を表示元で取得するサンプルを示します。

Form1よりForm2を呼び出し、
Form2が閉じられた際に
Form2で押されたボタンの種類を
Form1側(表示元)で取得します。

例)

    Form1
    ┏━━━━━━━━━━━┓
    ┃                      ┃
    ┃                      ┃
    ┃┏━━━━┓          ┃
    ┃┃button1 ┃          ┃
    ┃┗━━━━┛          ┃
    ┗━━━━━━━━━━━┛
    button1押下でForm2を表示

            ↓Form2を表示

    Form2
    ┏━━━━━━━━━━━━┓
    ┃                        ┃
    ┃                        ┃
    ┃┏━━━┓  ┏━━━━┓┃
    ┃┃  OK  ┃  ┃ Cancel ┃┃
    ┃┗━━━┛  ┗━━━━┛┃
    ┗━━━━━━━━━━━━┛
    いずれかのボタン押下で閉じる。

【解説】
呼び出し元では、フォームが閉じられた後で
DialogResultプロパティーの値を参照することで
何のボタンが押されたのかを判断します。

呼び先では、各ボタンのDialogResultプロパティーに
DialogResult列挙型の値をあらかじめ設定しておくことで
呼び出し元に最後に押されたボタンの種類を通知します。

//-------------------------------------
// Form1のソース
//-------------------------------------
private void button1_Click(object sender, System.EventArgs e)
{
    Form2 f2 = new Form2();

    // Form2をモーダル表示
    f2.ShowDialog();

    // Form2が閉じられた後、どのボタンが押されたのか判定
    switch( f2.DialogResult )
    {
        case DialogResult.OK:
            MessageBox.Show( "OK", "押されたボタンは" );
            break;
        case DialogResult.Cancel:
            MessageBox.Show( "Cancel", "押されたボタンは" );
            break;
    }
}

//-------------------------------------
// Form2のソース
//-------------------------------------
private void Form2_Load(object sender, System.EventArgs e)
{
    button1.DialogResult = DialogResult.OK;
    button2.DialogResult = DialogResult.Cancel;
}
6月 13

デフォルトボタン/キャンセルボタンを設定する

フォーム上の
デフォルトボタン(Enterキー/Spaceキーで押されるボタン)
キャンセルボタン(ESCキーで押されるボタン)
を設定するには

フォームの
AcceptButton, CancelButtonプロパティーに
それぞれボタン名を指定します。

【補足】
フォーム上に複数のボタンが存在し、
デフォルトボタン以外のボタンがフォーカスを持つ場合は
フォーカスを持つボタンがデフォルトで押されます。

this.AcceptButton = button1;
this.CancelButton = button2;
6月 13

フォームを半透明で表示する

フォームのOpacityプロパティーで透明度を指定します。
0で透明。
1で非透明。
0~1の間で透明度をdouble値で指定します。

フェードイン、フェードアウト処理や
フォームが重なった際に下を見たい場合などに使えます。

// 50%半透明
this.Opacity = 0.5;
6月 13

フォームのサイズを変更不可にする

FormBorderStyleプロパティの値を変更します。

ですが、この方法だと、設定内容によっては
タイトルバーが消えたりしてフォームの外観が変わってしまいます。
外観はそのままでサイズ変更不可にしたい場合は
スマートな方法ではありませんが
フォームの最大サイズと最小サイズを同一に設定してみてください。

具体的には、フォームの以下3つのプロパティの値を
すべて同一にします。
(実行時よりもデザイン時に設定する方が良いかと)

・MaximumSize フォームの最大サイズ
・MinimumSize フォームの最小サイズ
・Size フォームのサイズ

また、サイズ変更のイベントハンドラ内で
常に希望のサイズに補正する方法もあるかと思いますが
試していません。(描画でちらつくかも?)

// タイトルバーと境界線が消え、クライアント領域だけとなります。
this.FormBorderStyle = FormBorderStyle.None;

// ツールウィンドウとなり、タスク切り替え時の対象になりません
this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
6月 13

フォームをタスクバーに表示させない

フォームを表示すると
タスクバーにフォームのアイコンと名称が表示されますが
これを表示したくない場合は
ShowInTaskbarプロパティにfalseを設定します。

【補足】
フォーム表示後に同プロパティにfalseを設定すると
そのタイミングで非表示となります。

最初から非表示にしたい場合はデザイン時に設定しておくか
或いはFormのLoadイベントの中で同プロパティにfalseを設定するか
newした後、Show()或いはShowDialog()する前に
同プロパティにfalseを設定してください。

this.ShowInTaskbar = false;
6月 13

フォームを最大化/最小化/元の大きさに戻す(或いは状態を知る)

WindowStateプロパティーに列挙値を設定します。
フォームの表示状態を知りたい場合は
同プロパティを参照します。

// 最大化
this.WindowState = FormWindowState.Maximized;

// 最小化
this.WindowState = FormWindowState.Minimized;

// 元の大きさと位置に戻す
this.WindowState = FormWindowState.Normal;
6月 13

フォームのタイトルバーを非表示に

FormBorderStyleプロパティの値を
FormBorderStyle.Noneにする方法がありますが
フォームの境界線まで消えてしまってサイズ変更ができなくなってしまいます。

サイズ変更を行いたい場合は
タイトル名のテキストに”"を設定し、
さらにControlBoxプロパティにfalseを設定します。

// 方法1:タイトルバーは消えますがサイズ変更不可になる例
this.FormBorderStyle = FormBorderStyle.None;

// 方法2:サイズ変更可能なままタイトルバーだけ消す例
this.Text = "";
this.ControlBox = false;
6月 13

フォーム右上の最大化/最小化/閉じるボタンを制御する

下記ソースのプロパティを参考にしてください。

なお、最大化ボタンだけ押下不可にしても
ボタンが押せなくなるだけで非表示にななりません。
最大化、最小化、両ボタンを押下不可にして
はじめて両ボタンが非表示になります。

// フォーム右上の最大化ボタンを押下不可にする
this.MaximizeBox = false;

// フォーム右上の最小化ボタンを押下不可にする
this.MinimizeBox = false;

// フォーム右上の最大化/最小化/閉じる各ボタンを非表示に
this.ControlBox = false;