マウスイベント

「マウスイベント」の編集履歴(バックアップ)一覧はこちら

マウスイベント」(2014/12/29 (月) 12:54:08) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<p><strong>マウスイベントです。<br /> glut ではマウスホイールは対応していませんでしたが<br /> freeglut ではマウスホイールのスクロールを検出できます。</strong></p> <p> <img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&amp;act=open&amp;pageid=82&amp;file=mouse.png" /></p> <table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td> <p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br /> #include &lt;GL/freeglut/freeglut.h&gt;<br /> #include &lt;stdlib.h&gt;<br /> #include &lt;string&gt;<br /> using namespace std;</p> <p>wstring wstr=L"";<br /> wchar_t buf[255];</p> <p>#define WIDTH 400<br /> #define HEIGHT 320</p> <p>int MouseX,MouseY;<br /> bool M_left=false;<br /> bool M_right=false;<br /> bool M_middle=false;<br /> int wheel;</p> <p>class GLFONT<br /> {<br /> public:<br />  HFONT Hfont;<br />  HDC Hdc;<br />  GLFONT(wchar_t *fontname, int size);<br />  void DrawStringW(int x,int y,wchar_t *format, ...);<br /> };<br /> //コンストラクタ フォント作成<br /> GLFONT::GLFONT(wchar_t *fontname, int size)<br /> {<br />  Hfont = CreateFontW(<br />         size,      //フォント高さ<br />         0,       //文字幅<br />         0,       //テキストの角度<br />         0,       //ベースラインとx軸との角度<br />         FW_REGULAR,     //フォントの太さ<br />         FALSE,      //イタリック体<br />         FALSE,      //アンダーライン<br />         FALSE,      //打ち消し線<br />         SHIFTJIS_CHARSET,   //文字セット<br />         OUT_DEFAULT_PRECIS,   //出力精度<br />         CLIP_DEFAULT_PRECIS,  //クリッピング精度<br />         ANTIALIASED_QUALITY,  //出力品質<br />         FIXED_PITCH | FF_MODERN, //ピッチとファミリー<br />         fontname);     //書体名</p> <p> Hdc = wglGetCurrentDC();<br />  SelectObject(Hdc, Hfont);<br /> }<br /> //ワイド文字列の描画<br /> void GLFONT::DrawStringW(int x,int y,wchar_t *format, ...)<br /> {<br />  wchar_t buf[256];<br />  va_list ap;<br />  int Length=0;<br />  int list=0;<br />  <br />  //ポインタがNULLの場合は終了<br />  if ( format == NULL )<br />   return;</p> <p> //文字列変換<br />  va_start(ap, format);<br />  vswprintf_s(buf, format, ap);<br />  va_end(ap);</p> <p> Length = wcslen(buf);<br />  list = glGenLists(Length);<br />  for( int i=0; i&lt;Length; i++ ){<br />   wglUseFontBitmapsW(Hdc, buf[i], 1, list + (DWORD)i);<br />  }</p> <p> glDisable(GL_LIGHTING);<br />  glRasterPos2i(x, y);<br />  //ディスプレイリストで描画<br />  for( int i=0; i&lt;Length; i++ )<br />  {<br />   glCallList(list + i);<br />  }<br />  glEnable(GL_LIGHTING);<br />  //ディスプレイリスト破棄<br />  glDeleteLists(list, Length);<br />  list = 0;<br />  Length = 0;<br /> }</p> <p>GLFONT *font;</p> <p>void display(void)<br /> {<br />  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />  glColor4f(0.0f, 0.0f, 1.0f, 1.0f);<br />  wstr=L"マウス位置 X:";<br />  _itow(MouseX,buf,10);<br />  wstr+=buf;<br />  wstr+=L" Y:";<br />  _itow(MouseY,buf,10);<br />  wstr+=buf;<br />  font-&gt;DrawStringW(10,30,(wchar_t *)wstr.c_str());<br />  wstr=L"押されているボタン:";<br />  if(M_left)wstr+=L"左 ";<br />  if(M_middle)wstr+=L"中 ";<br />  if(M_right)wstr+=L"右 ";<br />  font-&gt;DrawStringW(10,60,(wchar_t *)wstr.c_str());<br />  wstr=L"ホイールのスクロール:";<br />  _itow(wheel,buf,10);<br />  wstr+=buf;<br />  font-&gt;DrawStringW(10,90,(wchar_t *)wstr.c_str());<br />  glutSwapBuffers();<br /> }<br /> void idle(void)<br /> {<br />  glutPostRedisplay();<br /> }<br /> void Init(){<br />  glClearColor(1.0, 1.0, 1.0, 1.0);<br />  glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);<br />  font = new GLFONT(L"MS明朝", 24);<br /> }<br /> //マウス(クリック)<br /> void mouse(int button, int state, int x, int y)<br /> {<br />  if(button == GLUT_LEFT_BUTTON &amp;&amp; state == GLUT_DOWN)<br />  {<br />   M_left=true;<br />  }else if(button == GLUT_LEFT_BUTTON &amp;&amp; state == GLUT_UP)<br />  {<br />   M_left=false;<br />  }<br />  if(button == GLUT_RIGHT_BUTTON &amp;&amp; state == GLUT_DOWN)<br />  {<br />   M_right=true;<br />  }else if(button == GLUT_RIGHT_BUTTON &amp;&amp; state == GLUT_UP)<br />  {<br />   M_right=false;<br />  }<br />  if(button == GLUT_MIDDLE_BUTTON &amp;&amp; state == GLUT_DOWN)<br />  {<br />   M_middle=true;<br />  }else if(button == GLUT_MIDDLE_BUTTON &amp;&amp; state == GLUT_UP)<br />  {<br />   M_middle=false;<br />  }<br /> }</p> <p>//ドラッグ<br /> void drag(int x, int y)<br /> {<br />  MouseX=x;<br />  MouseY=y;<br /> }</p> <p>//パッシブ<br /> void passive(int x, int y)<br /> {<br />  MouseX=x;<br />  MouseY=y;<br /> }<br /> //ホイール<br /> void MouseWheel(int wheel_number, int direction, int x, int y)<br /> {<br />  if(direction==1){wheel++;}else{wheel--;}<br /> }<br /> int main(int argc, char *argv[])<br /> {<br />  glutInitWindowPosition(100, 100);<br />  glutInitWindowSize(WIDTH, HEIGHT);<br />  glutInit(&amp;argc, argv);<br />  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />  glutCreateWindow("マウスイベント");<br />  glutDisplayFunc(display);<br />  glutMouseFunc(mouse);<br />  glutMotionFunc(drag);<br />  glutPassiveMotionFunc(passive);<br />  glutMouseWheelFunc ( MouseWheel ) ;//ホイールコールバック<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  return 0;<br /> }</p> </td> </tr></tbody></table><p> </p>
<p><strong>マウスイベントです。<br /> glut ではマウスホイールは対応していませんでしたが<br /> freeglut ではマウスホイールのスクロールを検出できます。</strong></p> <p> <img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&amp;act=open&amp;pageid=82&amp;file=mouse.png" /></p> <table border="1" cellpadding="1" cellspacing="1" style="width:100px;"><tbody><tr><td>ファイル</td> </tr><tr><td><a href="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=82&amp;file=main.cpp"> main.cpp</a></td> </tr></tbody></table><p>main.cpp</p> <table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> #pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br /> #include &lt;GL/freeglut/freeglut.h&gt;<br /> #include &lt;stdlib.h&gt;<br /> #include &lt;string&gt;<br /> using namespace std;</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> wstring wstr=L"";<br /> wchar_t buf[255];</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> #define WIDTH 400<br /> #define HEIGHT 320</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> int MouseX,MouseY;<br /> bool M_left=false;<br /> bool M_right=false;<br /> bool M_middle=false;<br /> int wheel;</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> class GLFONT<br /> {<br /> public:<br />  HFONT Hfont;<br />  HDC Hdc;<br />  GLFONT(wchar_t *fontname, int size);<br />  void DrawStringW(int x,int y,wchar_t *format, ...);<br /> };<br /> //コンストラクタ フォント作成<br /> GLFONT::GLFONT(wchar_t *fontname, int size)<br /> {<br />  Hfont = CreateFontW(<br />         size,      //フォント高さ<br />         0,       //文字幅<br />         0,       //テキストの角度<br />         0,       //ベースラインとx軸との角度<br />         FW_REGULAR,     //フォントの太さ<br />         FALSE,      //イタリック体<br />         FALSE,      //アンダーライン<br />         FALSE,      //打ち消し線<br />         SHIFTJIS_CHARSET,   //文字セット<br />         OUT_DEFAULT_PRECIS,   //出力精度<br />         CLIP_DEFAULT_PRECIS,  //クリッピング精度<br />         ANTIALIASED_QUALITY,  //出力品質<br />         FIXED_PITCH | FF_MODERN, //ピッチとファミリー<br />         fontname);     //書体名</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">  Hdc = wglGetCurrentDC();<br />  SelectObject(Hdc, Hfont);<br /> }<br /> //ワイド文字列の描画<br /> void GLFONT::DrawStringW(int x,int y,wchar_t *format, ...)<br /> {<br />  wchar_t buf[256];<br />  va_list ap;<br />  int Length=0;<br />  int list=0;<br />  <br />  //ポインタがNULLの場合は終了<br />  if ( format == NULL )<br />   return;</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">  //文字列変換<br />  va_start(ap, format);<br />  vswprintf_s(buf, format, ap);<br />  va_end(ap);</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">  Length = wcslen(buf);<br />  list = glGenLists(Length);<br />  for( int i=0; i&lt;Length; i++ ){<br />   wglUseFontBitmapsW(Hdc, buf[i], 1, list + (DWORD)i);<br />  }</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">  glDisable(GL_LIGHTING);<br />  glRasterPos2i(x, y);<br />  //ディスプレイリストで描画<br />  for( int i=0; i&lt;Length; i++ )<br />  {<br />   glCallList(list + i);<br />  }<br />  glEnable(GL_LIGHTING);<br />  //ディスプレイリスト破棄<br />  glDeleteLists(list, Length);<br />  list = 0;<br />  Length = 0;<br /> }</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> GLFONT *font;</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> void display(void)<br /> {<br />  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />  glColor4f(0.0f, 0.0f, 1.0f, 1.0f);<br />  wstr=L"マウス位置 X:";<br />  _itow(MouseX,buf,10);<br />  wstr+=buf;<br />  wstr+=L" Y:";<br />  _itow(MouseY,buf,10);<br />  wstr+=buf;<br />  font-&gt;DrawStringW(10,30,(wchar_t *)wstr.c_str());<br />  wstr=L"押されているボタン:";<br />  if(M_left)wstr+=L"左 ";<br />  if(M_middle)wstr+=L"中 ";<br />  if(M_right)wstr+=L"右 ";<br />  font-&gt;DrawStringW(10,60,(wchar_t *)wstr.c_str());<br />  wstr=L"ホイールのスクロール:";<br />  _itow(wheel,buf,10);<br />  wstr+=buf;<br />  font-&gt;DrawStringW(10,90,(wchar_t *)wstr.c_str());<br />  glutSwapBuffers();<br /> }<br /> void idle(void)<br /> {<br />  glutPostRedisplay();<br /> }<br /> void Init(){<br />  glClearColor(1.0, 1.0, 1.0, 1.0);<br />  glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);<br />  font = new GLFONT(L"MS明朝", 24);<br /> }<br /> //マウス(クリック)<br /> void mouse(int button, int state, int x, int y)<br /> {<br />  if(button == GLUT_LEFT_BUTTON &amp;&amp; state == GLUT_DOWN)<br />  {<br />   M_left=true;<br />  }else if(button == GLUT_LEFT_BUTTON &amp;&amp; state == GLUT_UP)<br />  {<br />   M_left=false;<br />  }<br />  if(button == GLUT_RIGHT_BUTTON &amp;&amp; state == GLUT_DOWN)<br />  {<br />   M_right=true;<br />  }else if(button == GLUT_RIGHT_BUTTON &amp;&amp; state == GLUT_UP)<br />  {<br />   M_right=false;<br />  }<br />  if(button == GLUT_MIDDLE_BUTTON &amp;&amp; state == GLUT_DOWN)<br />  {<br />   M_middle=true;<br />  }else if(button == GLUT_MIDDLE_BUTTON &amp;&amp; state == GLUT_UP)<br />  {<br />   M_middle=false;<br />  }<br /> }</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> //ドラッグ<br /> void drag(int x, int y)<br /> {<br />  MouseX=x;<br />  MouseY=y;<br /> }</p> <p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;"> //パッシブ<br /> void passive(int x, int y)<br /> {<br />  MouseX=x;<br />  MouseY=y;<br /> }<br /> //ホイール<br /> void MouseWheel(int wheel_number, int direction, int x, int y)<br /> {<br />  if(direction==1){wheel++;}else{wheel--;}<br /> }<br /> int main(int argc, char *argv[])<br /> {<br />  glutInitWindowPosition(100, 100);<br />  glutInitWindowSize(WIDTH, HEIGHT);<br />  glutInit(&amp;argc, argv);<br />  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />  glutCreateWindow("マウスイベント");<br />  glutDisplayFunc(display);<br />  glutMouseFunc(mouse);<br />  glutMotionFunc(drag);<br />  glutPassiveMotionFunc(passive);<br />  glutMouseWheelFunc ( MouseWheel ) ;//ホイールコールバック<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  return 0;<br /> }</p> </td> </tr></tbody></table><p> </p>

表示オプション

横に並べて表示:
変化行の前後のみ表示: