コントロール (Control)

目次

スレッドを使用する場合には、コントロールの呼び出しに注意が必要です。

クラス階層

  • System.Object
    • System.Windows.Forms.MessageBox
    • System.Windows.Forms.Application
    • System.Windows.Forms.Clipboard
    • System.Windows.Forms.Screen
    • System.MarshalByRefObject
      • System.ComponentModel.Component
        • System.Windows.Forms.CommonDialog
          • System.Windows.Forms.ColorDialog
          • System.Windows.Forms.FileDialog
            • System.Windows.Forms.OpenFileDialog
            • System.Windows.Forms.SaveFileDialog
          • System.Windows.Forms.FolderBrowserDialog
          • System.Windows.Forms.FontDialog
          • System.Windows.Forms.PageSetupDialog
          • System.Windows.Forms.PrintDialog
        • System.Windows.Forms.Control
          • System.Windows.Forms.AxHost
          • System.Windows.Forms.ButtonBase
            • System.Windows.Forms.Button
            • System.Windows.Forms.CheckBox
            • System.Windows.Forms.RadioButton
          • System.Windows.Forms.DataGrid
          • System.Windows.Forms.DataGridView
          • System.Windows.Forms.DataVisualization.Charting.Chart
          • System.Windows.Forms.DateTimePicker
          • System.Windows.Forms.GroupBox
          • System.Windows.Forms.Integration.ElementHost
          • System.Windows.Forms.Label
          • System.Windows.Forms.ListControl
          • System.Windows.Forms.ListView
          • System.Windows.Forms.MdiClient
          • System.Windows.Forms.MonthCalendar
          • System.Windows.Forms.PictureBox
          • System.Windows.Forms.PrintPreviewControl
          • System.Windows.Forms.ProgressBar
          • System.Windows.Forms.ScrollableControl
            • System.Windows.Forms.ContainerControl
              • System.Windows.Forms.Form
              • System.Windows.Forms.PropertyGrid
              • System.Windows.Forms.SplitContainer
              • System.Windows.Forms.ToolStripContainer
              • System.Windows.Forms.ToolStripPanel
              • System.Windows.Forms.UpDownBase (スピンボックス / アップダウン コントロール)
                • System.Windows.Forms.DomainUpDown
                • System.Windows.Forms.NumericUpDown
              • System.Windows.Forms.UserControl
            • System.Windows.Forms.Design.ComponentTray
            • System.Windows.Forms.Panel
            • System.Windows.Forms.ToolStrip
          • System.Windows.Forms.ScrollBar
          • System.Windows.Forms.Splitter
          • System.Windows.Forms.StatusBar
          • System.Windows.Forms.TabControl
          • System.Windows.Forms.TextBoxBase
            • System.Windows.Forms.TextBox
            • System.Windows.Forms.RichTextBox
            • System.Windows.Forms.MaskedTextBox
          • System.Windows.Forms.ToolBar (後継はToolStrip)
          • System.Windows.Forms.TrackBar
          • System.Windows.Forms.TreeView
          • System.Windows.Forms.WebBrowserBase
        • System.Windows.Forms.Menu (メニュー)
        • System.Windows.Forms.Timer
        • System.Windows.Forms.ToolTip
  • System.Windows.Threading.DispatcherObject
    • System.Windows.DependencyObject
      • System.Windows.Freezable
Control Class (System.Windows.Forms) | Microsoft Docs

プロパティ

プロパティ 内容
string Name コントロールの名前
(プログラムの実行時にオブジェクトを評価するためのもの)
string Text コントロールに関連付けられたテキスト

用途は派生クラスによって異なり、たとえばFormではタイトルバーのテキストとして用いられるが、RichTextBoxではコントロール内に表示されるテキストとなる。Remarks - Control.Text Property (System.Windows.Forms) | Microsoft Docs

Object Tag コントロールに関する任意のデータの格納 Control.Tag プロパティ (System.Windows.Forms) | MSDN
int TabIndex コントロールのタブ オーダー (tab order)
bool IsDisposed trueならば、コントロールは破棄されている
bool Enabled trueならば、ユーザーからの操作に応答する
bool Visible trueならば、コントロールとその子コントロールが表示されている
bool Focused trueならば、コントロールにフォーカスがある
bool ContainsFocus trueならば、コントロールまたはその子コントロールにフォーカスがある
bool Capture trueならば、コントロールはマウスをキャプチャしている
Cursor DefaultCursor 既定のカーソル
Cursor Cursor マウスポインタがコントロール上にあるときに表示されるカーソル
bool UseWaitCursor trueならば、待機カーソルを使用する

UIスレッドをブロックする処理はカーソルの変更もブロックするため、別スレッドとしなければこのプロパティへの設定は意味をなさない。またこのプロパティへの設定は、マウス関連のイベントが発生するまで適用されない。よって即座にカーソルを変更するには、CursorプロパティへCursors.WaitCursorを設定する

Point MousePosition スクリーン座標でのマウスカーソルの位置
Control Parent このコントロールの親コントロール

RadioButtonなど他のコントロールに格納されるコントロールは、FindForm()とは異なる値となる

Control TopLevelControl このコントロールの最上位の親コントロール。典型的には、最も外側のForm
ControlCollection Controls コントロールに格納されているコントロールのコレクション
Font Font コントロールで使用されるフォント。既定値はDefaultFontプロパティの値

親コントロールまたはアンビエント プロパティ (ambient property) に有効な値があるならば、DefaultFontより優先される Font - Control.cs

コントロールによっては親コントロールのFontを引き継がないため、個別に設定する必要がある

Keys ModifierKeys 修飾キー (Shift、Ctrl、Alt) の状態 How to: Determine Which Modifier Key Was Pressed | Microsoft Docs

どのキーも押されていなければKeys.None

Point Location このコントロールのコンテナの位置を基準とした、左上の位置
Size Size コントロールのサイズ

このプロパティが返すWidthやHeightに設定しても、コントロールのサイズに作用しない。そのためにはWidthプロパティなどに設定するか、新しく作成したSizeオブジェクトをこのプロパティに設定する

位置とサイズを同時に設定するならば、SetBounds()を用いる

int Width コントロールの幅 (SizeプロパティのWidthと同一)
Size DefaultSize コントロールの既定のサイズ
Size ClientSize コントロールのクライアント領域のサイズ
Rectangle Bounds コントロールのサイズと位置。サイズは非クライアント要素を含む、位置は親コントロール相対
AnchorStyles Anchor 親コントロールのどの辺との距離を一定とするか
(AnchorとDockは排他的で、後に設定されたほうが有効となる)
DockStyle Dock 親コントロールのどの辺に接触させるか
(AnchorとDockは排他的で、後に設定されたほうが有効となる)

同じ辺に複数のコントロールを結合させた場合はZオーダー (Z-order) に従い配置され、追加したものが端に、先のものが押し出される

ContextMenu ContextMenu コントロールに結びつけられているContextMenu。.NET 2.0以降ならば、ContextMenuStripを用いる
ContextMenuStrip ContextMenuStrip コントロールに結びつけられているContextMenuStrip
IntPtr Handle コントロールに結びつけられているウィンドウ ハンドル

これはWindows HWNDの値であり、取得時に作成されていないときは強制的に作成される

ControlBindingsCollection DataBindings コントロールのデータ バインディング
bool DoubleBuffered trueならば、ダブル バッファリングを有効にしてコントロールを描画する
     
プロパティ - Control Class (System.Windows.Forms) | Microsoft Docs

TabIndex

タブで選択されるコントロール順番は、Visual Studioのビュー デザイナーから設定すると簡単です。それには対象のコントロールを含むフォームをビュー デザイナーで開き、それにフォーカスがある状態で、メニューの【表示 → タブ オーダー】にチェックを入れます。そして設定するタブの順に、コントロールをクリックします。Changing the Tab Order of Controls | MSDN

DoubleBuffered

参考

プロパティ バインディング … コントロールのプロパティとアプリケーション設定との拘束

メソッド

メソッド 機能
SuspendLayout() コントロールのレイアウト ロジックを一時的に停止させ、パフォーマンスを向上させる Control.SuspendLayout メソッド (System.Windows.Forms) | MSDN

これはコントロールに複数のコントロールを追加するときに、その都度レイアウトが調整されるのを抑制するためのもので、コントロールの内容の更新には無関係

ResumeLayout(Boolean) コントロールのレイアウト ロジックを再開させる。trueを渡すと、保留中のレイアウト要求の適用を強制する
PerformLayout() コントロールのレイアウト ロジックを、すべての子コントロールに適用するように強制する
WndProc(Message) Windowsメッセージを処理できる
PreProcessMessage(Message) メッセージ ループ内のキーボードや入力メッセージがディスパッチされる前に処理できる
CreateHandle() コントロールのハンドルを作成する
ProcessCmdKey(Message, Keys) コマンドキーを処理する。コマンドキーとはアクセラレータやメニューのショートカットで、通常の入力キーよりつねに優先される

これらのキーを処理するため、メッセージの予備処理中に呼ばれる

ProcessDialogKey(Keys) ダイアログキーを処理する。ダイアログキーとは、TabEnterEscや方向キーなど

これらのキーを処理するため、メッセージの予備処理中に呼ばれる

ProcessDialogChar(Char) ダイアログ文字を処理する
Show() コントロールをユーザーに表示する
Focus() コントロールへ入力フォーカスを設定する

なおFocus()は独自のコントロールで使用するものであり、通常はSelect()を用いる。もしそれが子コントロールならばActiveControlプロパティ、フォームならばActivate()を代わりに用いる。Remarks - Control.Focus Method (System.Windows.Forms) | Microsoft Docs

Select() コントロールをアクティブにできる
SelectNextControl(Control, Boolean, Boolean, Boolean, Boolean) 次のコントロールをアクティブにできる
GetNextControl(Control, Boolean) 子コントロールのタブ オーダーで前または後にあるコントロールを得られる
PointToClient(Point) 指定位置を、クライアント座標へ変換できる
PointToScreen(Point) 指定位置を、画面座標へ変換できる
   
メソッド - Control Class (System.Windows.Forms) | Microsoft Docs

Invoke()

public object Invoke(
    Delegate method
)
Control.Invoke メソッド (System.Windows.Forms) | Microsoft Docs Invoke - Control.cs

コントロールのスレッドをワーカースレッドの処理待ちで停止させると、Invoke()の呼び出しでデッドロックが発生します。

BeginInvoke()

デリゲートを非同期で実行するならば、代わりにBeginInvoke()で呼び出します。c# - What's the difference between Invoke() and BeginInvoke() - Stack Overflow

public IAsyncResult BeginInvoke(
    Delegate method
)
Control.BeginInvoke メソッド (System.Windows.Forms) | Microsoft Docs BeginInvoke - Control.cs

BeginInvoke()で呼び出したmethodの結果を受け取りたいならば、EndInvoke()でそれが返されるまで待たせます。

キー処理

キーの押下に応じて、次の順でメソッドが呼ばれます。

aの押下

  1. OnPreviewKeyDown: A
  2. ProcessCmdKey: A
  3. ProcessDialogKey: A
  4. OnKeyDown: A
  5. ProcessDialogChar: a

Alt + aの押下

  1. OnPreviewKeyDown: Menu, Alt
  2. ProcessCmdKey: Menu, Alt
  3. ProcessDialogKey: Menu, Alt
  4. OnKeyDown: Menu, Alt
  1. OnPreviewKeyDown: A, Alt
  2. ProcessCmdKey: A, Alt
  3. ProcessDialogKey: A, Alt
  4. OnKeyDown: A, Alt
  5. ProcessDialogChar: a

イベント

区分 イベント 発生タイミング
マウス MouseEventHandler MouseDown コントロール上で、マウスボタンが押されたとき
EventHandler Click コントロールが、クリックされたとき (Enterキーなどにより発生することもあるため、マウスによるクリックとは限らない)
MouseEventHandler MouseClick コントロールが、マウスでクリックされたとき
MouseEventHandler MouseDoubleClick コントロールが、マウスでダブルクリックされたとき
MouseEventHandler MouseMove コントロール上で、マウスポインタが移動したとき
MouseEventHandler MouseWheel コントロールにフォーカスがあるときに、マウスホイールが移動したとき
キー PreviewKeyDownEventHandler PreviewKeyDown フォーカスがあるときに、キーが押されたとき (KeyDownより前に発生する)
KeyEventHandler KeyDown フォーカスがあるときに、キーが押されたとき。押されたキーの情報はKeyEventArgsで渡される Control.KeyDown イベント (System.Windows.Forms) | MSDN
ハンドル EventHandler HandleCreated コントロールのハンドルが、作成されたとき
EventHandler HandleDestroyed コントロールのハンドルが、破棄されているとき
ドラッグ&ドロップ DragEventHandler DragEnter コントロールの境界内へドラッグされたとき
DragEventHandler DragOver コントロールの境界内でドラッグされたとき
DragEventHandler DragDrop ドラッグ&ドロップ操作が完了したとき
EventHandler DragLeave コントロールの境界外へドラッグされたとき
  PaintEventHandler Paint コントロールが再描画されるとき
  EventHandler TextChanged Textプロパティの値が変更されるとき
  EventHandler Resize コントロールのサイズが変更されるとき
  EventHandler Move コントロールが移動したとき
  LayoutEventHandler Layout 子コントロールの位置を変更する必要があるとき
イベント - Control Class (System.Windows.Forms) | Microsoft Docs

Click

このイベントではEventArgsしか渡されません。ボタンや位置などのマウスの情報が必要ならば、MouseClickを捕捉します。Remarks - Control.Click Event (System.Windows.Forms) | MSDN

Controlを継承したクラスによって、右クリックやダブルクリックなどへの応答が異なります。Remarks - Control.Click Event (System.Windows.Forms) | MSDN

Clickイベントを発生しないクラス

スタイルにStandardClickが設定されていないコントロールは、このClickイベントを発生させません。このスタイルが設定されているかどうかは、GetStyle()で確認できます。

bool style = GetStyle(ControlStyles.StandardClick);

MouseClick

ハンドラにはMouseEventArgsが渡されます。Control.MouseClick イベント (System.Windows.Forms) | MSDN

コントロール上でマウスがクリックされると、次の順でイベントが発生します。

  1. MouseDown … マウスボタンが押されたとき
  2. Click
  3. MouseClick
  4. MouseUp … マウスボタンが離されたとき
Remarks - Control.MouseClick Event (System.Windows.Forms) | MSDN

続けて2回クリックされたとき、OSによってそれがダブルクリックと認識されると、MouseClickの代わりにMouseDoubleClickが発生します。

MouseEventArgs
プロパティ 内容
MouseButtons Button 押されたマウス ボタン。

(これのMouseButtonsにはFlagsAttribute属性があり、同時に押されることが想定されている)

int Clicks マウス ボタンが押されて離された回数
int Delta マウス ホイールの回転回数

(マウス ホイールのノッチ1つが1移動量に相当)

Point Location マウス イベント生成時のマウスのx座標とy座標

(フォームの左上を基準としたピクセル単位)

int X Location.Xと同じ
int Y Location.Yと同じ
プロパティ - MouseEventArgs クラス (System.Windows.Forms) | MSDN

PreviewKeyDown

このイベントはKeyDownイベントの前に発生し、TabEnterEscや方向キーなど、KeyDownイベントを発生させないキーに対して、そのイベントを発生するように指示できます。

private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Tab:
        case Keys.Enter:
            e.IsInputKey = true; // これらのキーで、KeyDownイベントが発生するようになる
            break;
    }
}

private void button1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Tab:
            break;

        case Keys.Enter:
            break;
    }
}
PreviewKeyDownEventArgs
プロパティ 内容
bool IsInputKey trueならば、通常の入力キー
     
PreviewKeyDownEventArgs クラス (System.Windows.Forms) | MSDN

KeyDown

特定の機能の呼び出しにキーを割り当てるのが目的ならばこのイベントを用いず、その機能のメニュー項目を作成し、それのShortcutKeysプロパティにキーを設定します。なお修飾キーの状態は、静的プロパティであるControl.ModifierKeysから、イベントとは無関係に取得できます。

ちなみに逆にキー入力を発生させるには、SendKeys.Send("{ENTER}")のように、SendKeysから送信します。

HandleCreated

このイベントは、コントロールのハンドルが作成されたときに発生します。Control.HandleCreated Event (System.Windows.Forms) | Microsoft Docs

そしてハンドルはコントロールが最初に表示されるときに作成されるため、FormのLoadに相当するイベントとして使用できます。c# - What is the Form "On_Load" equivalent for Controls? - Stack Overflow

フォーム上に配置されたコントロールでは、次の順でイベントが発生します。

  1. 親フォーム:HandleCreated
  2. 子コントロール:HandleCreated
  3. 親フォーム:Load

ただし親フォームが表示されたときにコントロールのVisibleがfalseだったときは、これがtrueに設定されたときに発生します。

HandleDestroyed

このイベントは、コントロールのハンドルが破棄されているときに発生します。 Control.HandleDestroyed Event (System.Windows.Forms) | Microsoft Docs c# - What event signals that a UserControl is being destroyed? - Stack Overflow

フォーム上に配置されたコントロールでは、次の順でイベントが発生します。

  1. 親フォーム:FormClosing
  2. 親フォーム:FormClosed
  3. 親フォーム:Deactivate
  4. 親フォーム:HandleDestroyed
  5. 子コントロール:HandleDestroyed

コントロールの種類

プロジェクトにコントロールを追加するとき、用途によって異なる形式があります。

  形式 基本クラス 用途
コンポーネント クラス System.ComponentModel.Component Timerのような、UIのないコントロール
カスタム コントロール System.Windows.Forms.Control Buttonのような、UIのあるコントロール
ユーザー コントロール System.Windows.Forms.UserControl 複数のコントロールを配置したコンテナ
Windows フォーム System.Windows.Forms.Form ウィンドウの拡張
c# - What is the difference between User Control, Custom Control and Component? - Stack Overflow

コントロールの描画 (ControlPaintクラス)

描画の禁止

コントロールにBeginUpdate()が実装されているならば、それを呼びます。さもなくばSendMessage()でWM_SETREDRAWを通知します。コントロールの描画を一時的に停止する - .NET Tips (VB.NET,C#...)

MSDN (Microsoft Developer Network) から検索