マウスイベント

マウスイベントです。
glut ではマウスホイールは対応していませんでしたが
freeglut ではマウスホイールのスクロールを検出できます。

 

ファイル
main.cpp

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#include <GL/freeglut/freeglut.h>
#include <stdlib.h>
#include <string>
using namespace std;

wstring wstr=L"";
wchar_t buf[255];

#define WIDTH 400
#define HEIGHT 320

int MouseX,MouseY;
bool M_left=false;
bool M_right=false;
bool M_middle=false;
int wheel;

class GLFONT
{
public:
 HFONT Hfont;
 HDC Hdc;
 GLFONT(wchar_t *fontname, int size);
 void DrawStringW(int x,int y,wchar_t *format, ...);
};
//コンストラクタ フォント作成
GLFONT::GLFONT(wchar_t *fontname, int size)
{
 Hfont = CreateFontW(
        size,      //フォント高さ
        0,       //文字幅
        0,       //テキストの角度
        0,       //ベースラインとx軸との角度
        FW_REGULAR,     //フォントの太さ
        FALSE,      //イタリック体
        FALSE,      //アンダーライン
        FALSE,      //打ち消し線
        SHIFTJIS_CHARSET,   //文字セット
        OUT_DEFAULT_PRECIS,   //出力精度
        CLIP_DEFAULT_PRECIS,  //クリッピング精度
        ANTIALIASED_QUALITY,  //出力品質
        FIXED_PITCH | FF_MODERN, //ピッチとファミリー
        fontname);     //書体名

 Hdc = wglGetCurrentDC();
 SelectObject(Hdc, Hfont);
}
//ワイド文字列の描画
void GLFONT::DrawStringW(int x,int y,wchar_t *format, ...)
{
 wchar_t buf[256];
 va_list ap;
 int Length=0;
 int list=0;
 
 //ポインタがNULLの場合は終了
 if ( format == NULL )
  return;

 //文字列変換
 va_start(ap, format);
 vswprintf_s(buf, format, ap);
 va_end(ap);

 Length = wcslen(buf);
 list = glGenLists(Length);
 for( int i=0; i<Length; i++ ){
  wglUseFontBitmapsW(Hdc, buf[i], 1, list + (DWORD)i);
 }

 glDisable(GL_LIGHTING);
 glRasterPos2i(x, y);
 //ディスプレイリストで描画
 for( int i=0; i<Length; i++ )
 {
  glCallList(list + i);
 }
 glEnable(GL_LIGHTING);
 //ディスプレイリスト破棄
 glDeleteLists(list, Length);
 list = 0;
 Length = 0;
}

GLFONT *font;

void display(void)
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
 wstr=L"マウス位置 X:";
 _itow(MouseX,buf,10);
 wstr+=buf;
 wstr+=L" Y:";
 _itow(MouseY,buf,10);
 wstr+=buf;
 font->DrawStringW(10,30,(wchar_t *)wstr.c_str());
 wstr=L"押されているボタン:";
 if(M_left)wstr+=L"左 ";
 if(M_middle)wstr+=L"中 ";
 if(M_right)wstr+=L"右 ";
 font->DrawStringW(10,60,(wchar_t *)wstr.c_str());
 wstr=L"ホイールのスクロール:";
 _itow(wheel,buf,10);
 wstr+=buf;
 font->DrawStringW(10,90,(wchar_t *)wstr.c_str());
 glutSwapBuffers();
}
void idle(void)
{
 glutPostRedisplay();
}
void Init(){
 glClearColor(1.0, 1.0, 1.0, 1.0);
 glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);
 font = new GLFONT(L"MS明朝", 24);
}
//マウス(クリック)
void mouse(int button, int state, int x, int y)
{
 if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
 {
  M_left=true;
 }else if(button == GLUT_LEFT_BUTTON && state == GLUT_UP)
 {
  M_left=false;
 }
 if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
 {
  M_right=true;
 }else if(button == GLUT_RIGHT_BUTTON && state == GLUT_UP)
 {
  M_right=false;
 }
 if(button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)
 {
  M_middle=true;
 }else if(button == GLUT_MIDDLE_BUTTON && state == GLUT_UP)
 {
  M_middle=false;
 }
}

//ドラッグ
void drag(int x, int y)
{
 MouseX=x;
 MouseY=y;
}

//パッシブ
void passive(int x, int y)
{
 MouseX=x;
 MouseY=y;
}
//ホイール
void MouseWheel(int wheel_number, int direction, int x, int y)
{
 if(direction==1){wheel++;}else{wheel--;}
}
int main(int argc, char *argv[])
{
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(WIDTH, HEIGHT);
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
 glutCreateWindow("マウスイベント");
 glutDisplayFunc(display);
 glutMouseFunc(mouse);
 glutMotionFunc(drag);
 glutPassiveMotionFunc(passive);
 glutMouseWheelFunc ( MouseWheel ) ;//ホイールコールバック
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return 0;
}

 

最終更新:2014年12月29日 12:54
添付ファイル