添加鼠标事件以更改简单圆圈的颜色[关闭]

Posted

技术标签:

【中文标题】添加鼠标事件以更改简单圆圈的颜色[关闭]【英文标题】:adding mouse event to change the color of simple circle [closed] 【发布时间】:2020-04-29 00:00:16 【问题描述】:

我画了一个圆圈并尝试添加鼠标事件,这会改变圆圈的颜色我找不到好的来源

这是整个代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define window_width  1080  
#define window_height 720 
void drawFilledSun() 
    //static float angle;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0, 0, -10);
    int i, x, y;
    double radius = 0.30;
    //glColor3ub(253, 184, 19);     
    glColor3ub(255, 0, 0);
    double twicePi = 2.0 * 3.142;
    x = 0, y = 0;
    glBegin(GL_TRIANGLE_FAN); //BEGIN CIRCLE
    glVertex2f(x, y); // center of circle
    for (i = 0; i <= 20; i++) 
        glVertex2f(
            (x + (radius * cos(i * twicePi / 20))), (y + (radius * sin(i * twicePi / 20)))
        );
    
    glEnd(); //END

void main_loop_function() 
    int c;
    drawFilledSun();
    glutSwapBuffers();
    c = getchar();

void GL_Setup(int width, int height) 
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glEnable(GL_DEPTH_TEST);
    gluPerspective(45, (float)width / height, .1, 100);
    glMatrixMode(GL_MODELVIEW);

int main(int argc, char** argv) 
    glutInit(&argc, argv);
    glutInitWindowSize(window_width, window_height);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutCreateWindow("GLUT Example!!!");
    glutIdleFunc(main_loop_function);
    GL_Setup(window_width, window_height);
    glutMainLoop();

【问题讨论】:

这段代码有什么问题? 有什么问题?您是否在问如何编写鼠标按钮/运动回调?弄清楚你想问什么并将其编辑到问题中。 我可以用两种方式制作圆圈,这段代码正在工作我想添加添加鼠标事件的功能,改变圆圈的颜色我找不到方法 在问题中指定你想做什么。 我也有这个问题,如果你能帮助我感谢***.com/questions/61490759/simple-pallet-for-colors@genpfault 【参考方案1】:

为太阳的红绿蓝颜色分量添加一个数组和一个颜色索引:

int color_i = 0;
GLubyte color[][3] =  255, 0, 0 , 253, 184, 19 ;

使用颜色数组设置颜色属性

void drawFilledSun() 
     // [...]

     glColor3ubv(color[color_i]);

去掉main_loop_function中的getchar,它会阻止窗口响应。但请致电glutPostRedisplay 持续更新窗口:

void main_loop_function() 
    drawFilledSun();
    glutSwapBuffers();
    glutPostRedisplay();

使用glutDisplayFunc 而不是glutIdleFunc 并添加glutMouseFunc 回调:

int main(int argc, char** argv) 
    // [...]

    glutDisplayFunc(main_loop_function);
    glutMouseFunc( mouseFunc );

在鼠标回调中改变颜色索引:

void mouseFunc(int button, int state, int x, int y)

    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) 
        color_i = (color_i == 0) ? 1 : 0;
    


看例子:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define window_width  1080  
#define window_height 720

int color_i = 0;
GLubyte color[][3] =  255, 0, 0 , 253, 184, 19 ;

void drawFilledSun() 
    //static float angle;
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0, 0, -10);
    int i, x, y;
    double radius = 0.30;
    glColor3ubv(color[color_i]);
    double twicePi = 2.0 * 3.142;
    x = 0, y = 0;
    glBegin(GL_TRIANGLE_FAN); //BEGIN CIRCLE
    glVertex2f(x, y); // center of circle
    for (i = 0; i <= 20; i++) 
        glVertex2f(
            (x + (radius * cos(i * twicePi / 20))), (y + (radius * sin(i * twicePi / 20)))
        );
    
    glEnd(); //END


void main_loop_function() 
    drawFilledSun();
    glutSwapBuffers();
    glutPostRedisplay();


void GL_Setup(int width, int height) 
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glEnable(GL_DEPTH_TEST);
    gluPerspective(45, (float)width / height, .1, 100);
    glMatrixMode(GL_MODELVIEW);


void mouseFunc(int button, int state, int x, int y)

    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) 
        color_i = (color_i == 0) ? 1 : 0;
    


int main(int argc, char** argv) 
    glutInit(&argc, argv);
    glutInitWindowSize(window_width, window_height);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutCreateWindow("GLUT Example!!!");
    glutDisplayFunc(main_loop_function);
    glutMouseFunc( mouseFunc );
    GL_Setup(window_width, window_height);
    glutMainLoop();

【讨论】:

【参考方案2】:

GLFW提供了一些你需要的回调函数如glfwSetCursorPosCallback

在这种情况下,您可以在绘图时通过if 分支简单地检查它,main_loop_function 在您的代码中。剩下的工作是关于 C/C++ 的,有很多途径可以到达它,例如kbhit

顺便说一句,使用几种命名风格并不优雅。

【讨论】:

以上是关于添加鼠标事件以更改简单圆圈的颜色[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Mapbox 鼠标悬停圆圈以使用特征状态更改颜色

使用动态鼠标悬停事件抓取网站

在三个js中使用鼠标悬停更改网格颜色

发生鼠标悬停事件时如何更改饼图的颜色

如何在鼠标事件上更改 QML 的 TableView 中一行的颜色?

Java Swing:在鼠标悬停时更改背景颜色