LoginSignup
7
4

More than 3 years have passed since last update.

[OF] dragEvent ファイルのパスを取得

Last updated at Posted at 2017-04-08

今回はopenframeworksのdragEventという機能について書いていきたいと思います。
dragEventなんてあったっけ?という方もいられると思いますがofApp.hの下の方にございますので要チェック。
以外と便利なんですよこれが!

dragEventで何ができるの?

dragしたフォルダの絶対パスを取得することができます。
何のこっちゃ?という方もいるかもしれませんが、パスとはそのフォルダがどこにあるのかという情報です。

C:/User/ユーザー名/~~ ていう感じで書かれるやつですね!

ofImageとかofVideoPlayerとかでファイルを準備するときsetup関数内でファイル名を入力すると思いますが、要はあれもファイルの居場所を教えてあげているということです。
あれはopenframeworks内で自動的にdataフォルダ内を見るように相対パスが設定されているのでファイル名だけの短い文で設定ができるようになってるんですね。
実際に上記のようなC:/User~~から始まるパスで設定してあげてもきちんと参照できるので、もし参照したいファイルがdataフォルダ内に置けないケースがある場合は絶対パスで指定してあげれば問題なしです!

ちょっと話がそれましたが実際に使い方と、何に使えるのかを見ていきましょう!

使い方

OF標準のdragEvent関数は
"アプリケーションウィンドウにファイルをドラッグ&ドロップする" とよばれる関数です。

ofApp.h
void dragEvent(ofDragInfo dragInfo);
ofApp.cpp
void dragEvent(ofDragInfo dragInfo){

for(int i = 0;i < dragInfo.files.size(); i++){

ofLog() << dragInfo.files[i];

}

ofLog() << dragInfo.position.x;
ofLog() << dragInfo.position.y;
ofLog() << dragInfo.position.z;

}

上記をコピペして試しに適当なファイルをドロップしてみてください。
ドロップされたファイルのパスとドロップした位置がコンソール画面に表示されるはずですよ!

なぜfor文で回しているのか疑問に思われましたでしょうか?お察しが良い。
それは複数のファイルをドロップすることを考慮しているからなのです!
試しに複数ファイルを同時にドロップしてみてください。順にパスが表示されていくと思います。

実用方

範囲内に画像をドロップするとその範囲内にドロップした画像が表示されるプログラムです。

ofApp.h

void setup();
void update();
void draw();
void keyReleased(int key);
void dragEvent(ofDragInfo dragInfo);

ofImage img;
int posX,posY,width,height;

ofApp.cpp
//--------------------------------------------------------------
void ofApp::setup(){

//位置と大きさ、何でもいいです笑
    posX = 100;
    posY = 100;
    width = 200,
    height = 200;

}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){

    ofNoFill();
    ofSetColor(0);
    ofDrawRectangle(posX, posY, width, height);
    ofFill();


    ofSetColor(255);
    if(img.isAllocated()){//画像が読み込めているか確認
        img.draw(posX, posY, width, height);//表示!!
    }
}

//--------------------------------------------------------------
void ofApp::keyReleased(int key){
    if(img.isAllocated()) img.clear();//読み込んだ画像のクリア
}

//--------------------------------------------------------------
void ofApp::dragEvent(ofDragInfo dragInfo){ 

    for(int i =0;i< dragInfo.files.size();i++){

//ドロップした位置が指定範囲内かチェックします。
        if(posX <= dragInfo.position.x &&
           posY <= dragInfo.position.y &&
           dragInfo.position.x <= posX + width &&
           dragInfo.position.y <= posX + height)
        {
            img.load(dragInfo.files[i]);//指定範囲内だったら画像を読み込む。

        }

    }

}

これでドラッグ&ドロップで画像を読み込めるプログラムができました。
しかも指定範囲内かどうかもチェックしています!
こういう "一定範囲内ドロップでほにゃららする" みたいなのって意外と需要があったりするので覚えておくと便利ですよ!

もっといいサンプル思いつけばよかったですがまだまだ自分も未熟なので...すみません笑

是非使ってみてください!
自分プログラムめっちゃできるやん...!て気分になれると思いますよ笑(僕はなりました)

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4