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

如何用X显示一幅xpm位图

    来源: 互联网  发布时间:2015-07-11

    本文导语:  1、如何用X显示一幅xpm位图(在xpm位图在文件中) 如XGetImage等用法。 最好有源码。不要qt 2、那有X函数库资下载 | 好像X函数的资料好少啊,不晓得这里可否找到你想要的链接? http://www.linuxli...

1、如何用X显示一幅xpm位图(在xpm位图在文件中)
如XGetImage等用法。
最好有源码。不要qt

2、那有X函数库资下载

|
好像X函数的资料好少啊,不晓得这里可否找到你想要的链接?
http://www.linuxlinks.com/Software/Programming/Libraries/Graphics/index.shtml

(小声:)用GTK来实现不晓得可否符合你的要求?

|
Pixmaps are data structures that contain pictures. These pictures can be used in various places, but most commonly as icons on the X desktop, or as cursors. 

A pixmap which only has 2 colors is called a bitmap, and there are a few additional routines for handling this common special case. 

To understand pixmaps, it would help to understand how X window system works. Under X, applications do not need to be running on the same computer that is interacting with the user. Instead, the various applications, called "clients", all communicate with a program which displays the graphics and handles the keyboard and mouse. This program which interacts directly with the user is called a "display server" or "X server." Since the communication might take place over a network, it's important to keep some information with the X server. Pixmaps, for example, are stored in the memory of the X server. This means that once pixmap values are set, they don't need to keep getting transmitted over the network; instead a command is sent to "display pixmap number XYZ here." Even if you aren't using X with GTK currently, using constructs such as Pixmaps will make your programs work acceptably under X. 

To use pixmaps in GTK, we must first build a GdkPixmap structure using routines from the GDK layer. Pixmaps can either be created from in-memory data, or from data read from a file. We'll go through each of the calls to create a pixmap. 


GdkPixmap *gdk_bitmap_create_from_data( GdkWindow *window,
                                        gchar     *data,
                                        gint       width,
                                        gint       height );

This routine is used to create a single-plane pixmap (2 colors) from data in memory. Each bit of the data represents whether that pixel is off or on. Width and height are in pixels. The GdkWindow pointer is to the current window, since a pixmap's resources are meaningful only in the context of the screen where it is to be displayed. 


GdkPixmap *gdk_pixmap_create_from_data( GdkWindow *window,
                                        gchar     *data,
                                        gint       width,
                                        gint       height,
                                        gint       depth,
                                        GdkColor  *fg,
                                        GdkColor  *bg );

This is used to create a pixmap of the given depth (number of colors) from the bitmap data specified. fg and bg are the foreground and background color to use. 


GdkPixmap *gdk_pixmap_create_from_xpm( GdkWindow   *window,
                                       GdkBitmap  **mask,
                                       GdkColor    *transparent_color,
                                       const gchar *filename );


|
XPM format is a readable pixmap representation for the X Window System. It is widely used and many different utilities are available for creating image files in this format. The file specified by filename must contain an image in that format and it is loaded into the pixmap structure. The mask specifies which bits of the pixmap are opaque. All other bits are colored using the color specified by transparent_color. An example using this follows below. 


GdkPixmap *gdk_pixmap_create_from_xpm_d( GdkWindow  *window,
                                         GdkBitmap **mask,
                                         GdkColor   *transparent_color,
                                         gchar     **data );

Small images can be incorporated into a program as data in the XPM format. A pixmap is created using this data, instead of reading it from a file. An example of such data is 


/* XPM */
static const char * xpm_data[] = {
"16 16 3 1",
"       c None",
".      c #000000000000",
"X      c #FFFFFFFFFFFF",
"                ",
"   ......       ",
"   .XXX.X.      ",
"   .XXX.XX.     ",
"   .XXX.XXX.    ",
"   .XXX.....    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .........    ",
"                ",
"                "};

When we're done using a pixmap and not likely to reuse it again soon, it is a good idea to release the resource using gdk_pixmap_unref(). Pixmaps should be considered a precious resource, because they take up memory in the end-user's X server process. Even though the X client you write may run on a powerful "server" computer, the user may be running the X server on a small personal computer. 

Once we've created a pixmap, we can display it as a GTK widget. We must create a GTK pixmap widget to contain the GDK pixmap. This is done using 


GtkWidget *gtk_pixmap_new( GdkPixmap *pixmap,
                           GdkBitmap *mask );

The other pixmap widget calls are 


guint gtk_pixmap_get_type( void );

void  gtk_pixmap_set( GtkPixmap  *pixmap,
                      GdkPixmap  *val,
                      GdkBitmap  *mask );

void  gtk_pixmap_get( GtkPixmap  *pixmap,
                      GdkPixmap **val,
                      GdkBitmap **mask);

gtk_pixmap_set is used to change the pixmap that the widget is currently managing. Val is the pixmap created using GDK. 


|
The following is an example of using a pixmap in a button. 


/* example-start pixmap pixmap.c */

#include 


/* XPM data of Open-File icon */
static const char * xpm_data[] = {
"16 16 3 1",
"       c None",
".      c #000000000000",
"X      c #FFFFFFFFFFFF",
"                ",
"   ......       ",
"   .XXX.X.      ",
"   .XXX.XX.     ",
"   .XXX.XXX.    ",
"   .XXX.....    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .XXXXXXX.    ",
"   .........    ",
"                ",
"                "};


/* when invoked (via signal delete_event), terminates the application.
 */
gint close_application( GtkWidget *widget,
                        GdkEvent  *event,
                        gpointer   data )
{
    gtk_main_quit();
    return(FALSE);
}


/* is invoked when the button is clicked.  It just prints a message.
 */
void button_clicked( GtkWidget *widget,
                     gpointer   data ) {
    g_print( "button clickedn" );
}

int main( int   argc,
          char *argv[] )
{
    /* GtkWidget is the storage type for widgets */
    GtkWidget *window, *pixmapwid, *button;
    GdkPixmap *pixmap;
    GdkBitmap *mask;
    GtkStyle *style;
    
    /* create the main window, and attach delete_event signal to terminating
       the application */
    gtk_init( &argc, &argv );
    window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
    gtk_signal_connect( GTK_OBJECT (window), "delete_event",
                        GTK_SIGNAL_FUNC (close_application), NULL );
    gtk_container_set_border_width( GTK_CONTAINER (window), 10 );
    gtk_widget_show( window );

    /* now for the pixmap from gdk */
    style = gtk_widget_get_style( window );
    pixmap = gdk_pixmap_create_from_xpm_d( window->window,  &mask,
                                           &style->bg[GTK_STATE_NORMAL],
                                           (gchar **)xpm_data );

    /* a pixmap widget to contain the pixmap */
    pixmapwid = gtk_pixmap_new( pixmap, mask );
    gtk_widget_show( pixmapwid );

    /* a button to contain the pixmap widget */
    button = gtk_button_new();
    gtk_container_add( GTK_CONTAINER(button), pixmapwid );
    gtk_container_add( GTK_CONTAINER(window), button );
    gtk_widget_show( button );

    gtk_signal_connect( GTK_OBJECT(button), "clicked",
                        GTK_SIGNAL_FUNC(button_clicked), NULL );

    /* show the window */
    gtk_main ();
          
    return 0;
}
/* example-end */


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 如何在windows下的DOS窗口中显示utf-8字符(CMD命令提示符终端显示utf-8字符)
  • 收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 关于Android平台:手机马达驱动提供给android的接口有哪些?
  • windows下cmd命令行显示UTF8字符设置(CHCP命令)
  • 我安装了个linux系统, 发现linux系统的显示器的显示有点小,于是我就在显示器上把大小调了一下,本想着这样会影响xp系统的显示效果,实际上没有应响xp的显示效果,这是为什么?
  • javascript eval换成document.write 显示原型
  • 收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 因无意删除一些文件,ubuntu系统无法启动,请求高手远程帮助
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • 不显示删除回复显示所有回复显示星级回复显示得分回复 集群服务器下相同文件夹下文件同时更新[问题点数:100分]
  • linux下nm命令(显示可执行文件的符号信息)介绍以及常见nm命令用法举例
  • 不显示删除回复显示所有回复显示星级回复显示得分回复 ubuntu 安装mysql源码失败,好像是没有找到hostent_data的定义。急~~~~~~~~~~
  • Linux下用ntpdate同步时间及date显示设置时间
  • Mozilla 浏览器,中文字不能正常显示,显示的是一些方块,方块包含该字的编码:9D56,如何让它正常显示。
  • linux下free命令显示的内存使用情况分析
  • 不显示删除回复显示所有回复显示星级回复显示得分回复 诚心请教Linux一道面试题(shell编程)
  • Linux/CentOS/fedora下vim显示的字符编码设置
  • 关于在QT环境下加载gif图片的问题(可以显示,但是只有使用终端启动可执行文件才能显示,双击执行却不显示)这是为什么?
  • CSS控制长文本内容显示(截取的地方用省略号代替)
  • 为什么JSP在JB6.0中显示正常(中文可以显示),但在IE6.0中无法正常显示(中文全为乱码)???
  • 不显示删除回复显示所有回复显示星级回复显示得分回复 ubuntu10.04 安装 mysql4.0 源码出错,提示gethostbyname_r的参数数量不对
  • Linux下显示器显示不正常
  • 不显示删除回复显示所有回复显示星级回复显示得分回复 gdb调试无法定位段错误 求救


  • 站内导航:


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

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

    浙ICP备11055608号-3