C++->C#の違いの覚書13
- Clipboardクラスによるクリップボードの使い方は以下のとおり
Clipboard.SetDataObject( "これをコピー", true );//第1パラメータのみなら該アプリ限定
//Bitmap bm = new Bitmap( "xxx.bmp" );
//Clipboard.SetDataObject( bm, true );IDataObject data = Clipboard.GetDataObject();
if( data.GetDataPresent( typeof(string) ){
string str = (string)data.GetData( typeof(string) );
//Bitmap bmp = (Bitmap)data.GetData( typeof(Bitmap) );
//bmp.Save(@"C:\xxx.bmp");
}
- D&Dターゲットとしてコントロールを有効にするには、AllowDropプロパティをtrueにすればよく、処理するイベントは以下の通り
- DragDrop:ドロップターゲット上でマウスボタンが離されたときに発生
- DragEnter:D&D操作の進行中に、AllowDropプロパティがtrueに設定されているコントロール上にmousePointerが入ってきた際
- DragLeave:DragEnterの後、mousePointerがコントロールの外に出た際
- DragOver:D&D操作中に、コントロールの上をmousePointerが移動した際
- DragEnter->DragOver->DragDrop or DragLeaveとなる
- GiveFeedBack:mousePointerのスタイルを変更することによって、D&D操作についての視覚的なフィードバックを示す
- QueryContinueDrag:D&D操作中に発生し、D&D操作を取り消すかどうかをロジックが判断するために使用する
- 以上よりドロップに対応するには、DragOverイベントとDragDropイベントを処理することになる
DragOverはD&D操作を修正する機会を得るイベントである - DragEnterやDragOverイベントではパラメータのDragEventArgsにおける各種プロパティで処理することができる
- 主にReadなプロパティはX(Int),Y(Int),Data(IDataObject),KeyState(0x01:左マウス,0x02:右マウス,0x10:中央マウス
0x04:ShiftKey, 0x08:CtrlKey,0x20:AltでANDされている) - WriteなプロパティはEffectでDragDropEffect列挙体(All,Copy,Link,Move,None,Scroll)を指定して、アプリに情報を伝える
- ファイルドロップのみを受け付ける単純なアプリなら以下でよい
- 主にReadなプロパティはX(Int),Y(Int),Data(IDataObject),KeyState(0x01:左マウス,0x02:右マウス,0x10:中央マウス
private void xxx_DragOver( object sender,System.Windows.Forms.DragEventArgs e ){
// ファイルドロップ操作のみサポート
if( e.Data.GetDataPresent( DataFormats.FileDrop ) ){
e.Effect = DragDropEffects.Copy;
}
}
private void xxx_DragDrop( object sender, System.Windows.Forms.DragEventArgs e ){
if( e.Data.GetDataPresent( DataFormats.FileDrop ) ){
string[] strDropFiles = (string[])e.Data.GetData( DataFormats.FileDrop );
StreamReader stre = new StreamReader( strFiles[0], Encoding.Default );
this.txtXXX.Clear();
this.txtXXX.Text = stre.ReadToEnd();
stre.Close();
}
}
private void xxx_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e){
string strxxx = "これをドロップ";
DragDropEffects dde = xxx.DoDragDrop( strxxx, DragDropEffects.Copy );//これ戻らず
if( DragDropEffects.None == dde ){
MessageBox.Show( "D&Dはキャンセルされました" );
}
}
//D&D進行中の処理をしたい場合はQueryContinueDragイベントで処理する
private void xxx_QueryContinueDrag( object sender, System.Windows.Forms.QueryContinueDragEventArgs e ){
//e.Action = DragAction.(Continue|Cancel|Drop);
//if( e.EscapePressed ==
//if( e.KeyState ==
}