C++->C#の違いの覚書13


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");
}

    • クリップボードに保存されている形式を取得するにはIDataObject.GetFormatsメソッドを用いる手もある
      結構色んな方法があるんで、必要があれば調べる
    • クリップボードに複数の形式で保存しておくと、利用するアプリケーション側で適切な形式になる可能性が高くなる
      よってSetData( "xxx" );だけでなくSetData(DataFormats.Html, "

      xxx

      ")も含めるといい
  • 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)を指定して、アプリに情報を伝える
      • ファイルドロップのみを受け付ける単純なアプリなら以下でよい


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();
}
}

    • D&Dのソース側の場合はD&Dがマウスボタンが押されている間続くので、D&Dの開始地点はMouseDownで行い
      DoDragDropメソッドにD&D処理を任せるが、該メソッドはD&Dが完了/取り消しされるまで戻ってこない


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 ==
}