استخدام عجلة التمرير بالماوس في GLUT
-
08-06-2019 - |
سؤال
أرغب في استخدام عجلة تمرير الماوس في برنامج OpenGL GLUT الخاص بي لتكبير المشهد وتصغيره؟كيف يمكنني فعل ذلك؟
المحلول 2
لاحظ أن الجليلة تخمة نيت روبن المكتبة لا تدعم عجلة التمرير.ولكن، تطبيقات لاحقة من GLUT مثل FreeGLUT يفعل.
يعد استخدام عجلة التمرير في FreeGLUT أمرًا بسيطًا للغاية.هنا هو كيف:
قم بتعريف وظيفة رد الاتصال التي سيتم استدعاؤها عند تمرير عجلة التمرير.هذا هو النموذج الأولي:
void mouseWheel(int, int, int, int);
قم بتسجيل رد الاتصال باستخدام وظيفة GLUT (المجانية). غلوتMouseWheelFunc().
glutMouseWheelFunc(mouseWheel);
تحديد وظيفة رد الاتصال.المعلمة الثانية تعطي اتجاه التمرير.قيم +1 للأمام، -1 للخلف.
void mouseWheel(int button, int dir, int x, int y)
{
if (dir > 0)
{
// Zoom in
}
else
{
// Zoom out
}
return;
}
هذا كل شيء!
نصائح أخرى
رد الاتصال glutMouseWheelFunc الخاص بـ Freeglut يعتمد على الإصدار وغير موثوق به في X.استخدم وظيفة الماوس القياسية واختبر الزرين 3 و4.
ملاحظات OpenGlut على حالة glutMouseWheelFunc:
نظرًا لعدم وجود معلومات حول الماوس ، من المستحيل تنفيذ ذلك بشكل صحيح على X في هذا الوقت.إن استخدام هذه الوظيفة يحد من قابلية نقل التطبيق الخاص بك.(هذه الميزة تعمل على X ، وليس بشكل موثوق.) يتم تشجيعك على استخدام الإبلاغ القياسي والموثوق للماوس ، بدلاً من أحداث العجلات.
استخدام تقارير الماوس GLUT القياسية:
#include <GL/glut.h>
<snip...>
void mouse(int button, int state, int x, int y)
{
// Wheel reports as button 3(scroll up) and button 4(scroll down)
if ((button == 3) || (button == 4)) // It's a wheel event
{
// Each wheel event reports like a button click, GLUT_DOWN then GLUT_UP
if (state == GLUT_UP) return; // Disregard redundant GLUT_UP events
printf("Scroll %s At %d %d\n", (button == 3) ? "Up" : "Down", x, y);
}else{ // normal button event
printf("Button %s At %d %d\n", (state == GLUT_DOWN) ? "Down" : "Up", x, y);
}
}
<snip...>
glutMouseFunc(mouse);
وكما ذكر البروتوكول الاختياري، فإن الأمر "بسيط للغاية".لقد كان مخطئًا فحسب.
لاحظ الحالة 3 و4 في بيان التبديل أدناه في رد الاتصال بنقرة الماوس
glutMouseFunc(mouseClick);
...
void mouseClick(int btn, int state, int x, int y) {
if (state == GLUT_DOWN) {
switch(btn) {
case GLUT_LEFT_BUTTON:
std::cout << "left click at: (" << x << ", " << y << ")\n";
break;
case GLUT_RIGHT_BUTTON:
std::cout << "right click at: (" << x << ", " << y << ")\n";
break;
case GLUT_MIDDLE_BUTTON:
std::cout << "middle click at: (" << x << ", " << y << ")\n";
break;
case 3: //mouse wheel scrolls
std::cout << "mouse wheel scroll up\n";
break;
case 4:
std::cout << "mouse wheel scroll down\n";
break;
default:
break;
}
}
glutPostRedisplay();
}