DragEventArgs.KeyState プロパティ
マウス ボタンの状態と同様に、Shift、Ctrl、Alt の各キーの現在の状態を取得します。
Public ReadOnly Property KeyState As Integer
[C#]
public int KeyState {get;}
[C++]
public: __property int get_KeyState();
[JScript]
public function get KeyState() : int;
プロパティ値
Shift、Ctrl、Alt の各キー、およびマウス ボタンの現在の状態。
解説
ドラッグ アンド ドロップ操作の効果を特定のキーの状態に依存させることができます。たとえば、ドラッグ アンド ドロップ操作中に Ctrl キーまたは Shift キーが押されたとき、データをコピーまたは移動するかどうかを決定できます。
KeyState プロパティで設定されたビットは、操作中に押されたキーまたはマウス ボタンを識別します。たとえば、マウスの左ボタンが押された場合は、 KeyState プロパティの最初のビットが設定されます。ビットごとの AND 演算子を使用して任意のキー状態を調べることができます。
特定のイベントに対して設定されたビットを次の表に示します。
ビット | キー |
---|---|
1 | マウスの左ボタン |
2 | マウスの右ボタン |
4 | Shift キー |
8 | Ctrl キー |
16 | マウスの中央ボタン |
32 | Alt キー |
使用例
[Visual Basic, C#, C++] 2 つの ListBox コントロールの間でドラッグ アンド ドロップ操作を実行する例を次に示します。この例では、ドラッグ アクションが開始したときに DoDragDrop メソッドが呼び出されます。ドラッグ操作は、 MouseDown イベント実行中のマウス位置から SystemInformation.DragSize を超えてマウスが移動したときに開始されます。 IndexFromPoint メソッドは、 MouseDown イベントで、ドラッグする項目のインデックスを判別するために使用します。
[Visual Basic, C#, C++] この例では、ドラッグ アンド ドロップ操作でカスタム カーソルを使用する方法についても示します。この例では、2 つのカーソル ファイル (3dwarro.cur
と 3dwno.cur
) がアプリケーション ディレクトリ内に存在していることを想定しています。なお、それぞれのファイルはドラッグ用のカスタム カーソルとドロップなしのカスタム カーソルを表します。カスタム カーソルは、 UseCustomCursorsCheck
CheckBox がオンになっている場合に使用されます。カスタム カーソルは、 GiveFeedback イベント ハンドラで設定されます。
[Visual Basic, C#, C++] キーボードの状態は、右側の ListBox の DragOver イベント ハンドラで評価されます。ドラッグ操作の内容は、Shift キー、Ctrl キー、Alt キー、または Ctrl + Alt キーの状態によって決まります。ドロップが発生する ListBox 内の位置は、 DragOver イベント時にも判定されます。ドロップするデータが String でない場合は、 DragEventArgs.Effect が DragDropEffects.None に設定されます。最後に、ドロップのステータスが DropLocationLabel
Label に表示されます。
[Visual Basic, C#, C++] 右側の ListBox にドロップするデータは、 DragDrop イベント ハンドラで判定されます。また、 String 値が ListBox の該当する場所に追加されます。ドラッグ操作がフォームの範囲を超えて移動した場合、ドラッグ アンド ドロップ操作は QueryContinueDrag イベント ハンドラでキャンセルされます。
[Visual Basic, C#, C++] DragEventArgs クラスの使用方法を次のコード例に示します。コード例全体については、 DoDragDrop メソッドのトピックを参照してください。
Private Sub ListDragTarget_DragOver(ByVal sender As Object, ByVal e As DragEventArgs) Handles ListDragTarget.DragOver
' Determine whether string data exists in the drop data. If not, then
' the drop effect reflects that the drop cannot occur.
If Not (e.Data.GetDataPresent(GetType(System.String))) Then
e.Effect = DragDropEffects.None
DropLocationLabel.Text = "None - no string data."
Return
End If
' Set the effect based upon the KeyState.
If ((e.KeyState And (8 + 32)) = (8 + 32) And _
(e.AllowedEffect And DragDropEffects.Link) = DragDropEffects.Link) Then
' KeyState 8 + 32 = CTL + ALT
' Link drag and drop effect.
e.Effect = DragDropEffects.Link
ElseIf ((e.KeyState And 32) = 32 And _
(e.AllowedEffect And DragDropEffects.Link) = DragDropEffects.Link) Then
' ALT KeyState for link.
e.Effect = DragDropEffects.Link
ElseIf ((e.KeyState And 4) = 4 And _
(e.AllowedEffect And DragDropEffects.Move) = DragDropEffects.Move) Then
' SHIFT KeyState for move.
e.Effect = DragDropEffects.Move
ElseIf ((e.KeyState And 8) = 8 And _
(e.AllowedEffect And DragDropEffects.Copy) = DragDropEffects.Copy) Then
' CTL KeyState for copy.
e.Effect = DragDropEffects.Copy
ElseIf ((e.AllowedEffect And DragDropEffects.Move) = DragDropEffects.Move) Then
' By default, the drop action should be move, if allowed.
e.Effect = DragDropEffects.Move
Else
e.Effect = DragDropEffects.None
End If
' Gets the index of the item the mouse is below.
' The mouse locations are relative to the screen, so they must be
' converted to client coordinates.
indexOfItemUnderMouseToDrop = _
ListDragTarget.IndexFromPoint(ListDragTarget.PointToClient(New Point(e.X, e.Y)))
' Updates the label text.
If (indexOfItemUnderMouseToDrop <> ListBox.NoMatches) Then
DropLocationLabel.Text = "Drops before item #" & (indexOfItemUnderMouseToDrop + 1)
Else
DropLocationLabel.Text = "Drops at the end."
End If
End Sub
[C#]
private void ListDragTarget_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
{
// Determine whether string data exists in the drop data. If not, then
// the drop effect reflects that the drop cannot occur.
if (!e.Data.GetDataPresent(typeof(System.String))) {
e.Effect = DragDropEffects.None;
DropLocationLabel.Text = "None - no string data.";
return;
}
// Set the effect based upon the KeyState.
if ((e.KeyState & (8+32)) == (8+32) &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) {
// KeyState 8 + 32 = CTL + ALT
// Link drag and drop effect.
e.Effect = DragDropEffects.Link;
} else if ((e.KeyState & 32) == 32 &&
(e.AllowedEffect & DragDropEffects.Link) == DragDropEffects.Link) {
// ALT KeyState for link.
e.Effect = DragDropEffects.Link;
} else if ((e.KeyState & 4) == 4 &&
(e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) {
// SHIFT KeyState for move.
e.Effect = DragDropEffects.Move;
} else if ((e.KeyState & 8) == 8 &&
(e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy) {
// CTL KeyState for copy.
e.Effect = DragDropEffects.Copy;
} else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) {
// By default, the drop action should be move, if allowed.
e.Effect = DragDropEffects.Move;
} else
e.Effect = DragDropEffects.None;
// Get the index of the item the mouse is below.
// The mouse locations are relative to the screen, so they must be
// converted to client coordinates.
indexOfItemUnderMouseToDrop =
ListDragTarget.IndexFromPoint(ListDragTarget.PointToClient(new Point(e.X, e.Y)));
// Updates the label text.
if (indexOfItemUnderMouseToDrop != ListBox.NoMatches){
DropLocationLabel.Text = "Drops before item #" + (indexOfItemUnderMouseToDrop + 1);
} else
DropLocationLabel.Text = "Drops at the end.";
}
[C++]
private:
void ListDragTarget_DragOver(Object* /*sender*/,
System::Windows::Forms::DragEventArgs* e)
{
// Determine whether string data exists in the drop data. If not, then
// the drop effect reflects that the drop cannot occur.
if (!e->Data->GetDataPresent(__typeof(System::String))) {
e->Effect = DragDropEffects::None;
DropLocationLabel->Text = S"None - no string data.";
return;
}
// Set the effect based upon the KeyState.
if ((e->KeyState & (8+32)) == (8+32) &&
(e->AllowedEffect & DragDropEffects::Link) == DragDropEffects::Link)
{
// KeyState 8 + 32 = CTL + ALT
// Link drag and drop effect.
e->Effect = DragDropEffects::Link;
} else if ((e->KeyState & 32) == 32 &&
(e->AllowedEffect & DragDropEffects::Link) == DragDropEffects::Link)
{
// ALT KeyState for link.
e->Effect = DragDropEffects::Link;
} else if ((e->KeyState & 4) == 4 &&
(e->AllowedEffect & DragDropEffects::Move) == DragDropEffects::Move)
{
// SHIFT KeyState for move.
e->Effect = DragDropEffects::Move;
} else if ((e->KeyState & 8) == 8 &&
(e->AllowedEffect & DragDropEffects::Copy) == DragDropEffects::Copy)
{
// CTL KeyState for copy.
e->Effect = DragDropEffects::Copy;
} else if ((e->AllowedEffect & DragDropEffects::Move) == DragDropEffects::Move)
{
// By default, the drop action should be move, if allowed.
e->Effect = DragDropEffects::Move;
} else
e->Effect = DragDropEffects::None;
// Get the index of the item the mouse is below.
// The mouse locations are relative to the screen, so they must be
// converted to client coordinates.
indexOfItemUnderMouseToDrop =
ListDragTarget->IndexFromPoint(
ListDragTarget->PointToClient(Point(e->X, e->Y)));
// Updates the label text.
if (indexOfItemUnderMouseToDrop != ListBox::NoMatches) {
DropLocationLabel->Text =
String::Concat(S"Drops before item # ",
__box( (indexOfItemUnderMouseToDrop + 1)));
} else
DropLocationLabel->Text = S"Drops at the end.";
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ
参照
DragEventArgs クラス | DragEventArgs メンバ | System.Windows.Forms 名前空間