「マウスイベント」の編集履歴(バックアップ)一覧はこちら
「マウスイベント」(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&act=open&pageid=82&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 <GL/freeglut/freeglut.h><br />
#include <stdlib.h><br />
#include <string><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<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<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->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->DrawStringW(10,60,(wchar_t *)wstr.c_str());<br />
wstr=L"ホイールのスクロール:";<br />
_itow(wheel,buf,10);<br />
wstr+=buf;<br />
font->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 && state == GLUT_DOWN)<br />
{<br />
M_left=true;<br />
}else if(button == GLUT_LEFT_BUTTON && state == GLUT_UP)<br />
{<br />
M_left=false;<br />
}<br />
if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)<br />
{<br />
M_right=true;<br />
}else if(button == GLUT_RIGHT_BUTTON && state == GLUT_UP)<br />
{<br />
M_right=false;<br />
}<br />
if(button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)<br />
{<br />
M_middle=true;<br />
}else if(button == GLUT_MIDDLE_BUTTON && 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(&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&act=open&pageid=82&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&act=open&pageid=82&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 <GL/freeglut/freeglut.h><br />
#include <stdlib.h><br />
#include <string><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<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<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->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->DrawStringW(10,60,(wchar_t *)wstr.c_str());<br />
wstr=L"ホイールのスクロール:";<br />
_itow(wheel,buf,10);<br />
wstr+=buf;<br />
font->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 && state == GLUT_DOWN)<br />
{<br />
M_left=true;<br />
}else if(button == GLUT_LEFT_BUTTON && state == GLUT_UP)<br />
{<br />
M_left=false;<br />
}<br />
if(button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)<br />
{<br />
M_right=true;<br />
}else if(button == GLUT_RIGHT_BUTTON && state == GLUT_UP)<br />
{<br />
M_right=false;<br />
}<br />
if(button == GLUT_MIDDLE_BUTTON && state == GLUT_DOWN)<br />
{<br />
M_middle=true;<br />
}else if(button == GLUT_MIDDLE_BUTTON && 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(&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>