나는 내 마음에서 조금 벗어날거야.GtkDrawingArea - 드로어 블 (Drawable) 만드는 법?
카이로를 사용하여 GTK 양식에 간단한 그래픽을 그리려는 중입니다. IA__gdk_cairo_create :
#include <stdio.h>
#include <gtk/gtk.h>
#include <cairo.h>
GtkWidget* window;
GtkWidget* darea;
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 390, 240);
darea = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), darea);
cairo_t *cr;
cr = gdk_cairo_create(darea->window);
cairo_rectangle(cr, 0, 0, 100, 100);
cairo_fill(cr);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
이
에 실패했습니다. 나는 tutorial hereGDK-CRITICAL ** 컴파일하지만 나에게주는 주장`GDK_IS_DRAWABLE (당김) '는 segfault의 다음
에서 찾고 있었어요
그래서 다음과 같이, 내 코드를 변경 한 카이로의 호출이 노출 이벤트 내부에서 발생했다.
#include <stdio.h>
#include <gtk/gtk.h>
#include <cairo.h>
GtkWidget* window;
GtkWidget* darea;
static gboolean
on_expose_event(GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{
cairo_t *cr;
cr = gdk_cairo_create(darea->window);
cairo_rectangle(cr, 0, 0, 100, 100);
cairo_fill(cr);
}
int main(int argc, char **argv)
{
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size(GTK_WINDOW(window), 390, 240);
darea = gtk_drawing_area_new();
gtk_container_add(GTK_CONTAINER(window), darea);
g_signal_connect(darea, "expose-event",
G_CALLBACK(on_expose_event), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
왜 이렇게 수정 되었습니까? 나의 이해의 다시 : 노출은 다음과 같습니다 가
g_signal_connect(darea, "expose-event", G_GCALLBACK(on_expose_event), NULL);
프로그램을 알려줍니다 '는 다음, 이벤트가 darea에 어떻게 노출 on_expose_event 호출 할 때'. null은 사용할 함수에 대한 추가 정보의 구조체에 대한 포인터를 전달할 수있는 곳입니다.
및
static gboolean
on_expose_event(GtkWidget *widget,
GdkEventExpose *event,
gpointer data)
{
는 on_expose_event가가 노출 이벤트는 노출 이벤트에 대한 정보를 포함하는 구조체에 대한 포인터이기 때문에이 경우 andin, 이벤트가 일어난 위젯에 대한 포인터를 전달하고 있음을 의미 추가하고자하는 다른 정보의 구조체에 대한 포인터.
자, 이제 폼에 두 개의 버튼이 있고, 하나는 그림 영역에 빨간색 원을 그리고 다른 하나는 파란색 사각형을 그립니다. 이렇게하는 방법입니다 - 각 버튼 클릭 이벤트는 'mode'변수를 변경하고 gtk_widget_queue_draw()를 호출 한 다음 expose_events가 모드가 무엇인지에 따라 그릴 내용을 결정합니다. 예제 코드 : http://pastebin.com/7ZvwcCXb – dwjohnston
네, 저에게 맞는 것 같습니다. – ptomato
예전에는 더블 버퍼링을 설정하거나 저장 언더 (save unders)를 사용하도록 설정할 수 있었지만, GTK에서는 가능하다고 가정합니다. 창을 픽스맵에 복사 한 다음 필요에 따라 다시 복사 할 수도 있습니다. 그러나 XLib와 Motif에서 무언가를 그렸다면 그 무언가를 숨기고 펼치면 아무 것도 나의 그림을 되 찾을 수 없습니다. –