سؤال

أرغب في استخدام عجلة تمرير الماوس في برنامج 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();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top