6月 13

無効にする(操作できなくする)

コントロールやフォームを無効にし、
操作ができないようにします。
Enabledプロパティーにfalseを設定します。

フォームに適用した場合は
フォーム上のすべてのコントロールがDisable(無効)状態となり
フォームの移動、最小化など、全ての操作ができなくなります。

コントロールに適用した場合、
そのコントロールが淡色表示されて
一切の操作ができなくなります。(触れません)

textBox1.Enabled = false;
6月 13

背景色を変更する

BackColorプロパティーにて
コントロールやフォームの背景色を変更します。

// 名称指定:明るい青
textBox1.BackColor = Color.LightBlue;

// RGB値指定:赤
// 3つのパラメータがそれぞれ順に赤、緑、青を表します。
// 0~255の範囲で値を指定します。
// 16進数では00~FF
textBox1.BackColor = Color.FromArgb(0xFF,0,0);

// システムカラー:スクロールバーの色
textBox1.BackColor = Color.FromKnownColor(KnownColor.ScrollBar);

// 名称指定:緑(名称はKnownColor 列挙体のメンバと同一)
textBox1.BackColor = Color.FromName( "Green" );
6月 13

エクスプローラーなどからのファイルのドラッグ&ドロップを受け取る

エクスプローラーなどからのドラッグ&ドロップを受け取るコードの例です。
ここではListBoxにファイルをドロップすると
その一覧を表示するようにしてみます。

例ではListBoxですが方法は同じなので
Formや他のコントロールにも応用できます。

まず準備として
ListBoxのAllowDropプロパティーをTrueに設定し、ドロップを受付可能にします。

次に、ListBoxのDragEnterとDragDropイベントハンドラを追加します。
(イベント一覧のそれぞれの項目をダブルクリックすれば雛形が自動的に追加されます)

DragEnterイベントは
ファイルをドラッグ中のマウスポインタが
コントロールのクライアント領域上に移動された時に発生します。

DragDropイベントは
ドロップ操作が完了した時に発生します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void listBox1_DragEnter(object sender, DragEventArgs e)
        {
            // ドラッグ中のデータ形式がファイルであれば受け付ける
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                // ドラッグ中のデータ一覧を取得
                string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
                foreach (string file in files)
                {
                    if (!System.IO.File.Exists(file))
                    {
                        // ファイルが存在しない、またはファイル以外(フォルダなど)
                        return;
                    }
                }

                // コピー可能を設定
                e.Effect = DragDropEffects.Copy;
            }
        }

        private void listBox1_DragDrop(object sender, DragEventArgs e)
        {
            // ドラッグ&ドロップされたファイル
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

            // ListBoxにファイル一覧を追加
            listBox1.Items.AddRange(files);
        }
    }
}

Vista環境での注意点

Vista環境では注意が必要です。
例えば、管理者権限でVisualStudioを起動し
デバッグモードで実行されたアプリは同じく管理者権限となりますが
ここへ非管理者権限のエクスプローラーなどからドラッグ&ドロップしようとしても
そもそもDragEnterイベントが発生しません。
どうやら低い権限から高い権限への操作は許されないようです。

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;