2012-09-19 3 views
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; 
    } 

답변

5

, 당신은 두 가지 선택을 그릴 때 :

  1. 중 사용 가능한 크기에 적응하는 그려진 내용을 원하고, 당신이 그
  2. 에 대한 cairo_scale를 사용하거나 사용자가 스크롤 뷰를 사용 , 당신이하고있는 것처럼.

경우 2에서 카이로는 한계를 벗어나는 것을 알 수있는 방법이 없습니다. 그리고 경우에 따라서는 한계를 벗어나는 작업이 원하는 작업 일 수도 있습니다. 여기에서 누락 된 부분은 도면 영역의 크기를 설정하는 것입니다. 이것은 gtk_widget_set_size_request을 사용하여 수행 할 수 있습니다.

+0

그래프를 그리기 전에 그래프의 크기를 알지 못하므로 'gtk_widget_size_request'를 사용하여 그리기 영역의 크기를 설정할 수 없습니다. 당신의 말에 따르면, scrolled_window로 cairo scroll을 만드는 방법은 없습니다. 정말 안좋아. 종종 카이로 그래프가 스크롤 창 영역보다 큽니다. scrolled_window에 맞게 만들려면 그래프의 크기를 조정해야하지만 명확하게 볼 수 없을 정도로 커질 수 있습니다. 더 나은 방법이 없습니까? – warem

+0

도면을 제어하는 ​​경우 도면을 어디에 있는지 알 수 있습니다! 그러므로, 당신은 당신이 디스플레이해야하는 바운딩 사각형을 알고 있습니다. 그리고 그걸로'gtk_widget_size_request'를 호출 할 수 있습니다. 대신 스케일링을 사용하도록 선택하면 사용자는 원하는 크기로 크기를 조정할 수 있습니다. – liberforce

+0

김프와 같은 소프트웨어에서 어떻게 작동하는지 생각해보십시오. 새 이미지를 만들려면 처음에 기본 크기를 정의해야합니다. 캔버스 외부로 그려면 이미지가 커지지 않습니다. 그러나 캔버스에서 그릴 필요가 있다는 것을 알고 있다면 그리기 전에 캔버스를 성장시킬 수 있습니다. 그렇게하면 캔버스가 내용에 맞게 크기를 조정합니다. – liberforce

관련 문제