cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

openFrameworksでマウスボタンのdoubleClickを拾う方法

OFは標準では、mouseのダブルクリックを拾ってくれません。ofEasyCamなどに実装があるので、真似すれば簡単なのですが、すぐ忘れてしまうのでまとめておきます。
(ちなみに、マウスホイールのスクロールはOF0.9から標準搭載されました。めでたい。)

  • doubleClickEventなど適当な名前のofEventを作る
  • mouseReleased関数の中に、前回マウスリリースしてからの時間を計測するルーチンを足して、イベントをnotifyする.ほぼofEasyCamのコードそのままです。
  • mouseDoubleClickedとか適当な名前の関数を作る。
  • setupでdoubleClickEventとmouseDoubleClickedを繋ぐイベントリスナーを登録しておく。

main.cpp

#include "ofMain.h"
#include "ofApp.h"

//========================================================================
int main( ){
	ofSetupOpenGL(1024,768,OF_WINDOW);			// <-------- setup the GL context

	// this kicks off the running of my app
	// can be OF_WINDOW or OF_FULLSCREEN
	// pass in width and height too:
	ofRunApp(new ofApp());

}

ofApp.cpp

#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
	lastTap = 1000;
	ofAddListener(doubleClickEvent, this, &ofApp::mouseDoubleClicked);
}

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

}

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

}

//--------------------------------------------------------------
void ofApp::mouseReleased(ofMouseEventArgs& mouse){
	static const unsigned long doubleclickTime = 400;
	unsigned long curTap = ofGetElapsedTimeMillis();
	if (lastTap != 0 && curTap - lastTap < doubleclickTime) {
		ofNotifyEvent(doubleClickEvent, mouse);
		return;
	}
	lastTap = curTap;
}

//--------------------------------------------------------------
void ofApp::mouseDoubleClicked(ofMouseEventArgs& mouse) {
	cout << "double clicked." << endl;
}

ofApp.h

#pragma once

#include "ofMain.h"

class ofApp : public ofBaseApp{

	public:
		void setup();
		void update();
		void draw();

		void mouseReleased(ofMouseEventArgs& mouse);
		void mouseDoubleClicked(ofMouseEventArgs& mouse);
		ofEvent<ofMouseEventArgs&> doubleClickEvent;
		unsigned long lastTap;
};

簡単だけどコピペが面倒くさいので、これぐらい標準で組み込んでおいてほしいな・・・。

今日の漫画

阿部潤先生の今のところの最高傑作。嫌なことはご飯を食べて忘れてしまおう。期間限定1巻無料お試し中。お勧めです。





忘却のサチコ 4 (ビッグコミックス)

忘却のサチコ 4 (ビッグコミックス)