gpt4 book ai didi

c - 在 Gtk 中重绘小部件

转载 作者:行者123 更新时间:2023-12-01 13:06:03 25 4
gpt4 key购买 nike

我正在尝试使用 gtk_widget_queue_draw 函数重绘 GtkDrawingArea,但小部件没有重绘。

这是代码,gtk_widget_queue_draw 位于按钮按下事件回调函数中。

static gboolean click(GtkWidget *board,GdkEventButton *event,gpointer parentWindow){
static int origen = -1;
static int destino = -1;

if(origen == -1){
mapeo(&origen, event->x, event->y);
}else{
mapeo(&destino, event->x, event->y);
if(!movimiento_fichas(JUGADOR_DOS, origen - 1, destino - 1)){
dialogoMovInvalido(parentWindow); //displays a warning dialog
g_print("%d %d", origen, destino); //debugging console output
origen = -1; destino = -1;
}else{
g_print("%d %d", origen, destino); //debugging console output
gtk_widget_queue_draw(board); //Here's where the redrawing is supossed to occur.
}
}

return 0;
}

暴露事件回调
static gboolean onExposeEvent(GtkWidget *widget,GdkEventExpose *event,gpointer data){
cairo_t *cr;
cairo_surface_t *fondo;
cairo_surface_t *ficha_roja;
cairo_surface_t *ficha_blanca;

gint i,j;

cr = gdk_cairo_create(widget->window);

fondo = cairo_image_surface_create_from_png("interfaz.png");
ficha_roja = cairo_image_surface_create_from_png("ficha_roja.png");
ficha_blanca = cairo_image_surface_create_from_png("ficha_blanca.png");

cairo_set_source_surface(cr, fondo, 0, 0);
cairo_paint(cr);

for(i=0; i<24; i++){
if(tablero[i].player == JUGADOR_UNO){
cairo_set_source_surface(cr, ficha_blanca, posiciones[i].x, posiciones[i].y);
for(j=1; j<=tablero[i].num; j++){
cairo_paint(cr);
cairo_set_source_surface(cr, ficha_blanca, posiciones[i].x, posiciones[i].y);
if(i < 12)
cairo_set_source_surface(cr, ficha_blanca, posiciones[i].x, posiciones[i].y - (j*25));
else
cairo_set_source_surface(cr, ficha_blanca, posiciones[i].x, posiciones[i].y + (j*25));
}
}else if(tablero[i].player == JUGADOR_DOS){
cairo_set_source_surface(cr, ficha_roja, posiciones[i].x, posiciones[i].y);
for(j=1; j<=tablero[i].num; j++){
cairo_paint(cr);
if(i < 12)
cairo_set_source_surface(cr, ficha_roja, posiciones[i].x, posiciones[i].y - (j*25));
else
cairo_set_source_surface(cr, ficha_roja, posiciones[i].x, posiciones[i].y + (j*25));
}
}
}

cairo_destroy(cr);

return 0;
}

暴露事件和按钮按下事件连接(都在创建顶级窗口的函数内)。
  g_signal_connect(G_OBJECT(board),"expose-event",G_CALLBACK(onExposeEvent),NULL);
g_signal_connect(G_OBJECT(board),"button-press-event",G_CALLBACK(click),window);

主功能。
int main(int argc, char *argv[]){
gtk_init(&argc, &argv);

mainWindow(); //Creates the main window

gtk_main();

return 0;
}

最佳答案

由于您没有粘贴所有相关代码,因此无法得出结论性的错误。无论如何,我认为可能有两个错误/误解导致您的问题。

  • 您应该只在 expose-event 中绘图信号处理程序。虽然可以在外部绘图,但此类绘图不会更新,并且可能会因多种原因而完全丢失,包括此类自启动重绘。
  • 重绘将异步发生。 IE。在不同的主循环中运行。如果您以非标准方式运行主循环,这可能会出现问题,例如使用 gtk_events_pending()/gtk_main_iteration() .

  • 最后,检查 board实际上是您打算重绘的小部件。可能是你连接时传递了错误的用户数据 click() .

    关于c - 在 Gtk 中重绘小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3118182/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com