当前位置:  技术问答>linux和unix

gtk图像显示+滚动条请教

    来源: 互联网  发布时间:2015-10-09

    本文导语:  最近在进行linux下的glade和gtk编程。遇到一个棘手的问题,特向高手请教! 需求如下: 滚动显示矢量大地图,要求能够缩放。 问题如下: 我构造了一个滚动窗口,在上面加了一个drawingarea,显示一个大矢量图,我的...

最近在进行linux下的glade和gtk编程。遇到一个棘手的问题,特向高手请教!

需求如下:
滚动显示矢量大地图,要求能够缩放。
问题如下:
我构造了一个滚动窗口,在上面加了一个drawingarea,显示一个大矢量图,我的做法是先把矢量图画在pixmap上,然后显示。因为矢量图很大,而滚动窗口的滚动条是根据drawingarea大小判断的(在程序里我用gtk_widget_set_size_request指定大小这样滚动条就能正确显示)。现在我的矢量图要求能够放大,也就是说矢量图可能达到20000*10000那么大,这个时候我用gtk_widget_set_size_request(drawingarea1,20000,10000)系统会报错。我察看了一下内存,在gtk_widget_set_size_request(drawingarea1,2000,1000)时用了7M内存。如果达到5000*4000就用了36M内存。这样内存消耗实在太大。
请教如下:
是不是我的做法有问题,我该怎么正确显示滚动条。

附加代码如下:
callbacks.c:

gboolean
DrawConfigE                            (GtkWidget       *widget,
                                        GdkEventConfigure *event,
                                        gpointer         user_data)//config事件
{
ReadRegionListData();
ReadCurveListData();
ReadRoadRiverListData();

if (pixmap)
     g_object_unref (pixmap);
   pixmap = gdk_pixmap_new (widget->window,widget->allocation.width,widget->allocation.height, -1);
gdk_draw_rectangle (pixmap,widget->style->white_gc,1,0,0,widget->allocation.width,widget->allocation.height);
int i=0,j=0;
GtkPoint * pointsregion;


GdkGC *gc;
GdkColor color;
gc=gdk_gc_new(widget->window);
/*color.red=0xffff;
color.green=0;
color.blue=0;
gdk_color_alloc(gdk_colormap_get_system(),&color);
gdk_gc_set_foreground(gc,&color);
*/
Point3D tempp;
for(;iblack_gc,1,pointsregion,regionList.pRegion[i].pointcount);
color.red=65535;
        color.green=0;
        color.blue=0;
        gdk_color_alloc(gdk_colormap_get_system(),&color);
        gdk_gc_set_foreground(gc,&color);

gdk_draw_polygon(pixmap,gc,1,pointsregion,regionList.pRegion[i].pointcount);
}
i=0;
GtkPoint * pointscurve;
for(;iblack_gc,pointscurve  ,pcurveList.pPoints[i].pointcount);
}
//-----------------------roadriver------------------------------------
i=0;
GtkPoint * pointleftroad=NULL,*pointrightroad=NULL;
for(;iblack_gc,pointleftroad  ,proadList.pRoadRiver[i].leftpointcount);

pointrightroad=malloc(sizeof(GtkPoint)*proadList.pRoadRiver[i].rightpointcount);
j=0;
      for(;jstyle->black_gc,pointrightroad  ,proadList.pRoadRiver[i].rightpointcount);

}
   return FALSE;
}


gboolean
DrawExposeE                            (GtkWidget       *widget,
                                        GdkEventExpose  *event,
                                        gpointer         user_data)//expose事件
{
gdk_draw_drawable (widget->window,
     widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
     pixmap,
     event->area.x, event->area.y,
     event->area.x, event->area.y,
     event->area.width, event->area.height);
//printf("%d,%d,%d,%d,%d,%dn",event->area.x, event->area.y,
//      event->area.x, event->area.y,
//      event->area.width, event->area.height);

   return FALSE;
}

interface.c:
create_window1 (void)
{
  GtkWidget *window1;
  GtkWidget *scrolledwindow1;
  GtkWidget *viewport1;
  GtkWidget *drawingarea1;
  
  //GtkAdjustment  *adj1, *adj2;

  window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window1), "window1");

  
  g_signal_connect (G_OBJECT (window1), "delete_event",
                    G_CALLBACK (quit),
                    NULL);
  scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow1),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
 
  gtk_widget_show (scrolledwindow1);
  gtk_container_add (GTK_CONTAINER (window1), scrolledwindow1);  
  
  viewport1 = gtk_viewport_new (NULL, NULL);
  gtk_widget_show (viewport1);  
  
  gtk_container_add (GTK_CONTAINER (scrolledwindow1), viewport1);

  drawingarea1 = gtk_drawing_area_new ();


  
  gtk_widget_show (drawingarea1);
  gtk_container_add (GTK_CONTAINER (viewport1), drawingarea1);
  
  
   gtk_drawing_area_size(GTK_DRAWING_AREA(drawingarea1), 600, 400);

  //gtk_widget_set_size_request(drawingarea1,400,300);
  g_signal_connect ((gpointer) drawingarea1, "configure_event",
                    G_CALLBACK (DrawConfigE),
                    NULL);
  g_signal_connect ((gpointer) drawingarea1, "expose_event",
                    G_CALLBACK (DrawExposeE),
                    NULL); 
       
  /* Store pointers to all widgets, for use by lookup_widget(). */
  GLADE_HOOKUP_OBJECT_NO_REF (window1, window1, "window1");
  GLADE_HOOKUP_OBJECT (window1, scrolledwindow1, "scrolledwindow1");
  GLADE_HOOKUP_OBJECT (window1, viewport1, "viewport1");
  GLADE_HOOKUP_OBJECT (window1, drawingarea1, "drawingarea1");

  return window1;
}

|
你现在用得是scrollwindow吧,用滚动条控件试一下

    
 
 

您可能感兴趣的文章:

  • 【gtk+】初学gtk+,请教一个问题
  • 高分请教,如何能够使GTK能够在gtk生成的窗口里面放一个其它程序的窗口?
  • 请教,motif和gtk各代表什么意思?
  • 请教编译gtk程序
  • 请教如何改变GTK程序界面使用的默认字体??
  • 请教linux下GTK和QT哪个用的更多些?
  • pkg-config --cflags --libs gtk+-2.0问题请教
  • 请教: 关于gtk的安装
  • 请教一下GTK list的用法
  • 请教gtk高手
  • 请教Solaris下怎样才能正确显示gtk程序中控件上的中文??
  • 请教高手:如何用gnome/gtk编写托盘程序
  • 请教在openSUSE Linux11.0下如何源码安装glade3.6.7和gtk+2.0?
  • 请教 gtk编程,nootbook控件切换标签时信号量处理的问题
  • 请教linux下的编程的选择:我听说有gtk+gnome的编程,也有kde里的 什么编程,到底应该选择哪个呢?好象一个是技术好一点,一个是市场占有
  • 请教:gtk怎么把滚动条和drawingarea联起来?盼望有人指点,只有60分了
  • GTK编程~我在hpanel里加了一个4*1table~里面放了四个button~怎么设置可以使四个button之间有一定的距离~设置table 的边框么?请教下怎么让app的界面固定~不能最大化
  • 请教GTK的问题
  • GTK 图像控件显示问题
  • GTK 图像处理
  • linux ,gtk,glade图像界面编程,急急急!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • GTK窗口前端显示及GTK窗口闪烁
  • 关于Gtk程序全屏显示的问题,请高手指点一下!!
  • gtk2.0字体不显示的问题
  • 英文环境下,如何使gtk控件显示中文
  • 老问题一问, 关于如何在gtk中显示中文
  • Gtk 文字列表显示?
  • 如何通过gtk的函数在程序里获取显示器的分辨率????????
  • 请问,使用GTK如何显示标准的浏览文件夹的对话框?HILDON提供吗?
  • gtk_tree_view_column_new_with_attributes设置的title不显示..
  • gtk文档显示的问题
  • 【GTK】 关于 TreeView -- 如何将一行显示加粗?
  • 请问怎么把result_entry=gtk_entry_new()设置为只能显示,不能输入?
  • 请问在GTK下如何在一个WINDOW的区域内并排显示两个DIALOG?
  • gtk中pixmap的内容怎么部分的显示?
  • 如何用V4L2编程接受电视盒采集到的视频信号,以及如何在GTK中实时显示
  • win32 gtk+ 中文显示
  • 一个关于 gtk window 显示的问题,很奇怪
  • GTK编程中文显示的问题
  • Gtk下如何显示bmp图片(帮顶有分)
  • gtk2.0 不能直接显示中文?
  • 关于gtk的目录问题,我的目录是 gtk-2.0/gtk/gtk.h ??
  • Redhat linux9.0 下Gtk+编程的#include <gtk/gtk.h>问题
  • 【重要】gtk+ 编译gtk+的问题,不同于一般gtk的搭建--1000分,问题解决了,开号给分,决不食言!大家都来看看
  • gtk 和 gtk+ 有什么区别?
  • centos5.4中安装gtk时,yum库最新版是gtk2.10,如何更新yum库安装gtk2.12
  • 我使用GTK+2.0写界面程序时,怎么找不到gtk.h文件?
  • GTK+ gtk_tree问题
  • gtk for win 和 gtk for linux 下的程序问题?
  • 用GTK开发的程序如何在没有GTK动态连接库的Linux里运行?
  • 【GTK】GTK中有没有这个widget?
  • 我想学习GTK+2.0,请问如何准备GTK编程环境???


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3