2
다음은 무언가를 그릴 때 cairo
을 사용하는 작은 코드입니다. 문제는 cairo로 그린 캔버스가 gtk의 scrolled_window 영역보다 큽니다. 하지만 스크롤 된 창은 스크롤되지 않으므로 캔버스 부분 만 볼 수 있습니다.카이로에서 GtkDrawingArea - 스크롤 가능하게하는 방법
의견이 있으십니까? 내 환경 : MinGW + gtk2.10.11. 보통
#include <gtk/gtk.h>
static gboolean draw_cb (GtkWidget *widget, GdkEventExpose *event)
{
cairo_t *cr;
cr = gdk_cairo_create (widget->window);
cairo_set_source_rgb(cr, 1, 1, 1);
cairo_paint(cr);
cairo_set_source_rgb (cr, 0.42, 0.65, 0.80);
cairo_set_line_width (cr,6);
cairo_rectangle (cr, 30, 30, 100, 100);
cairo_stroke (cr);
cairo_destroy(cr);
return FALSE;
}
int main (int argc, char *argv[])
{
gtk_init (&argc, &argv);
GtkWidget *window;
GtkWidget *sw;
GtkWidget *cr;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_policy((GtkWindow *)window, FALSE, FALSE, FALSE);
sw = gtk_scrolled_window_new (NULL,NULL);
gtk_widget_set_usize(sw, 100, 100);
cr = gtk_drawing_area_new();
gtk_scrolled_window_add_with_viewport(GTK_CONTAINER(sw), cr);
gtk_container_add (GTK_CONTAINER(window), sw);
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
g_signal_connect (cr, "expose-event", G_CALLBACK(draw_cb), NULL);
gtk_widget_show_all (window);
gtk_main();
return 0;
}
그래프를 그리기 전에 그래프의 크기를 알지 못하므로 'gtk_widget_size_request'를 사용하여 그리기 영역의 크기를 설정할 수 없습니다. 당신의 말에 따르면, scrolled_window로 cairo scroll을 만드는 방법은 없습니다. 정말 안좋아. 종종 카이로 그래프가 스크롤 창 영역보다 큽니다. scrolled_window에 맞게 만들려면 그래프의 크기를 조정해야하지만 명확하게 볼 수 없을 정도로 커질 수 있습니다. 더 나은 방법이 없습니까? – warem
도면을 제어하는 경우 도면을 어디에 있는지 알 수 있습니다! 그러므로, 당신은 당신이 디스플레이해야하는 바운딩 사각형을 알고 있습니다. 그리고 그걸로'gtk_widget_size_request'를 호출 할 수 있습니다. 대신 스케일링을 사용하도록 선택하면 사용자는 원하는 크기로 크기를 조정할 수 있습니다. – liberforce
김프와 같은 소프트웨어에서 어떻게 작동하는지 생각해보십시오. 새 이미지를 만들려면 처음에 기본 크기를 정의해야합니다. 캔버스 외부로 그려면 이미지가 커지지 않습니다. 그러나 캔버스에서 그릴 필요가 있다는 것을 알고 있다면 그리기 전에 캔버스를 성장시킬 수 있습니다. 그렇게하면 캔버스가 내용에 맞게 크기를 조정합니다. – liberforce