ラベル ドラッグアンドドロップ の投稿を表示しています。 すべての投稿を表示
ラベル ドラッグアンドドロップ の投稿を表示しています。 すべての投稿を表示

2008年12月26日金曜日

[VC++] VC++で複数コントロールに対する個別のドラッグアンドドロップを受け付ける方法

やたら細かいネーミング。汗


D&D対応のサンプルはWebでも色々あるんだけど。
あのやり方だと、ウィンドウのどこにドロップしても同じになってしまう。


たとえばこんなウィンドウ。


この二つのエディットボックスがそれぞれD&Dを受け付けるようにしたいときの方法。
あくまで一つの方法ですけど。一番簡単なので使っています。


作成環境はVC++6.0なので、.NETとはウィンドウの構成とかはかなり違いますが、基本的に仕組みは同じはず。


まず、リソースエディタでエディットボックスをD&D対応にします。

リソースエディタを起動して、



各対象アイテムの拡張スタイルで「ドラッグドロップを許可」にチェックをつけます。



次に、ウィンドウ画面上でクラスウィザードを表示。



オブジェクトIDでウィンドウのIDを選択すると、PreTranslateMessageという関数名が表示されます。
これをダブルクリックして、下の「メンバ関数」に追加された、PreTranslateMessage関数をダブルクリック。

ソースファイルが開きます。画面が黒いのはほっといてください。


この関数(PreTranslateMessage)は、ウィンドウに飛んでくるすべてのメッセージが実行される前に必ず通る場所です。

なので、ここでメッセージを取得すれば、ウィンドウに飛んでくるほぼすべてのメッセージを取得できます。いじりようによってはウィンドウを閉じられなくも出来る強力な関数ですのでご注意を。


ここに、こんなソースを挿入します。



処理を簡単に箇条書き。
  1. 受け取ったメッセージがWM_DROPFILESの場合
  2. wParamに格納されているパス名データを解析用APIに渡してファイル名を取得
  3. hwndに格納されているメッセージ送信先IDを、対象の2つのEditBoxのID情報と比較し、該当するEditBoxにパス情報を書き込む

と言うものです。

DragQueryFileというAPIは、ファイルの名前を指定したバッファに書き込んでくれる解析用APIです。

これでファイルをD&Dすると、各エディットボックスにファイル名が設定されますよ。

2008年10月18日土曜日

Javaでファイルのドラッグアンドドロップを受け付ける

備忘録。

Javaでファイルのドラッグアンドドロップを受け付けるプログラムです。

珍しくサンプルプログラムまで作りました。
eclipseで作ってましたが、下を適当な名前.javaとかにしてコンパイルすれば動くと思います。
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.event.*;
import java.io.File;

/**
* DandDクラス
* ドラッグアンドドロップテストプログラム
* @author Sakito Yumitsuka
*/
public class DandD extends Frame
{
TextField tf1 = new TextField("ここにドラッグアンドドロップ",30);

/**
* ドラッグアンドドロップウィンドウの設定
*/
public DandD()
{
// ウィンドウ上の設定
this.setTitle("Drag and drop");
this.setSize(350, 90);

// ウィンドウ終了時の動作を指定
this.addWindowListener( new WindowAdapter(){
public void windowClosing(WindowEvent evt) {
System.exit(0);
}});

// 無名クラスでドロップ時の動作を指定
new DropTarget(tf1, new DropTargetAdapter(){
public void drop( DropTargetDropEvent e ) {
try {
Transferable transfer = e.getTransferable();
if ( transfer.isDataFlavorSupported( DataFlavor.javaFileListFlavor ) ) {
e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
java.util.List fileList = (java.util.List)( transfer.getTransferData( DataFlavor.javaFileListFlavor ) );
tf1.setText( ( (File)fileList.get(0) ).getAbsolutePath() );
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
});

setLayout( new FlowLayout() );
add(tf1);

setVisible( true );
}

/**
* @param args
*/
public static void main(String[] args)
{
new DandD();
}
}

こんな感じで。