




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、By yfqGtk+/Glade编程(一)简介1Gtk+/Glade编程(二)-入门 6Gtk+/Glade编程(三) 菜单和工具栏12Gtk+/Glade 编程(四)布局管理 19Gtk+/Glade编程(一)简介By unanao<sunjianjiao> 本文是我学习GTK+和glade3进行图形界面编程的一点学习心得的整理,主要是使用GTK+/Glade编程的文档较少,而且没有说名如何将二者联系 起来,以及二者之间的关系。本文通过比较使用Glade和不使用Glade进行GUI编程进行比较,找出二者的异同,从
2、而可以为学习使用Glade进行 GUI设计提供一点学习思路。一、 什么是GTK+ 首先,GTK+并不是一门编程语言,而是一个开发工具套件,或者说是一个开发库,用来进行跨平台GUI应用程序的开发,Linux,Windows或其它平台都能使用GTK+。GTK+ 就好比Windows上的MFC 和Win32 API,JAVA 上的Swing和SWT,或者Qt(KDE 使用的Linux下GUI开发套件)。 尽管GTK+是用纯C语言编写的,但是提供了其它各种语言的捆绑,允许程序员选择自己喜欢的开发语言来开发GTK+ 应用程序,比如C+
3、, Python,Perl, PHP,Ruby等等。 GTK+ 开发套件基于三个主要的库:Glib,Pango和ATK,当然我们只需关心如何使用GTK+ 即可,GTK+ 自己负责与这三个库打交道。Glib 封装了大部分可移植的 C 库函数(允许你的代码移植到Windows 和Linux 上运行)。使用C 或C+时,将大量使用Glib 库函数,在我们用C 语言的具体实现过程中我会详细解释它们。高级语言如Python 和Ruby 却不用担心Glib 的使用,因为它们有自己的标准库提供了相应的功能。
4、60; GTK+ 及相关的库时按照面向对象设计思想来实现的,至于这时如何实现的现在并不重要,不同的编程语言有不同的实现方法,重要的是要知道GTK+ 使用面向对象编程技术即可(是的,即使是C 实现的)。每一个GTK+ 的GUI元素都是由一个或许多个“widgets”对象构成的。所有的widgets都从基类GtkWidget派生。例如,应用程序的主窗口是GtkWindow类widget,窗口的工具条是GtkToolbar类widget。一个GtkWindow是一个GtkWidget,但一个GtkWidget并不是一个GtkWindow,子类widgets 继承自父类并扩展了父类的功能而
5、成为一个新类,这就是标准的面向对象编程思想。我们可以查阅GTK+参考手册找到widgets直接的继承关系。对于GtkWindow它的继承链看起来像这样:GObject +-GInitiallyUnowned +-GtkObject +-GtkWidget
6、; +-GtkContainer +-GtkBin
7、; +-GtkWindow 因此,GtkWindow继承自GtkBin,GtkBin继承自GtkContainer,等等。在第一个程序中,你不需要担心GtkWidget对象。各widget之间的继承链之所以重要是因为当你查找某个widget的
8、函数,属性和信号时,你应该知道它的父类的函数,属性和信号也被此widget继承了,可以直接使用。在第二部分讲述此实例的代码时, 你能更清楚的认识到这一点。我们来看命名规则,命名规则带来的好处是非常便于使用。我们能够清楚的看出对象或函数是哪个库中的。以Gtk开头的所有对象都是在GTK+中定义的。稍后我们会看到类似Glade XML以Glade开头的是Libglade库对象或函数,GError以G开头的在GLib库定义。所有Widgets类都遵循标准camelcase命名习惯。所有操作函数都以下划线组合小写字母单词命名。如gtk_window_set_title()设置GtkWindow对象的标题
9、属性。 二、Glade Glade是一种开发GTK+ 应用程序的RAD(Rapid Application Development)工具。Glade自身就是一个GTK+应用程序,因为它就是用GTK+ 开发出来的,Glade用来简化UI 控件的设计和布局操作,进行快速开发。Glade的设计初衷是把界面设计与应用程序代码相分离,界面的修改不会影响到应用程序代码,Glade设计的界面保存为glade格式文件,它实际上是一种XML文件。 Glade 起先能根据创建的GUI 自动生成C 语言代码(你仍然能找到此类相关的实例
10、),后来可以利用Libglade库在运行时动态创建界面,到了Glade3 ,这些方法都不赞成使用了。这是因为,Glade需要做的唯一的事就是生成一个描述如何创建GUI的glade文件。这给编程人员提供了更多的灵活性和弹性,避免了用户界面部分微小的改变就要重新编译整个应用程序,同时其语言无关性,几乎所有的编程语言都可以使用Glade。三、Gtk+和Glade 相关开发环境的搭建以Debian 为例:安装对应的包名为:· gtk+:libgtk2.0-dev· gcc:build-essential· glade:glade· make:make·
11、 Devhelp:devhelp#aptitude install libgtk2.0-dev glade build-essential make devhelp注:包的名字可能改变(主要是版本号的改变),如果安装的时候,说找不到哪个包,可以使用aptitude search 包名 (如 aptitude search gtk)四、文档的获得1、Gtk+ Tutors: /devel/gtk-tutorial/stable/ (官方) ftp:/ftp.gtk.o
12、rg/pub/gtk/tutorial (pdf) 初学者的tutors: 2、GtkBuilder /devel/gtk/stable/GtkBuilder.html3、手册 “应用程序” -> "编程"
13、 -> "Devhelp"4、更多文档: /documentation.html四、熟悉Glade1、启动Glade 如果有“Set Options in your project”的窗口,直接关闭即可2、熟悉Glade的主界面 左边的是"Palette" 就像是一个图形编辑程序,可以用它上面的GtkWidgets来设计你的用户界面。中间部分(刚启动时是空白一片)是"Edit
14、or" 所见即所得的编辑器。在右边,上部是"Inspector",下部是widget "Properties" 。Inspector以树形显示当前创建的控件的布局,可以对控件进行选择。我们通过Properties中各项内容来设置widgets的属性,包括设置widgets的信号回调函数。五、编程实现一个简单的窗口: 点击Palette上"Toplevels"分组框中的GtkWindow图标,你会看到一个灰色窗口出现在Glade中间的Editor 区域。这是GtkWindow的工作区
15、0; 窗口管理器(如GNOME)会自动加上窗口标题,关闭按钮等,因此我们编辑时看不见。使用Glade时,我们总是需要首先创建一个顶层窗口,典型的是创建一个GtkWindow。以 "window.glade" 文件名保存工程。这个文件是一个XML文件,你可以在文本编辑器中打开它:<?xml version="1.0"?><interface> <requires lib="gtk+" version="2.16"/> <!- interfa
16、ce-naming-policy project-wide -> <object class="GtkWindow" id="window1"> <child> <placeholder/> </child> </object></interface>你看,这就是一个简单的XML文件,Glade能在修改过程中自动保存到该文件
17、。五、编写一个简单窗口的程序1、使用glade生成的window.glade,编写一个简单窗口的程序/*Then save this file as window.c and compile it using this command(those are backticks, not single quotes): gcc -Wall -g -o window window.c pkg-config -cflags -libs gtk+-2.0 Then execute it using: ./window*/#include <gtk/gtk.h&g
18、t; int main (int argc, char *argv) GtkBuilder *builder; GtkWidget *window; gtk_init (&argc, &argv); builder = gtk_builder_new ();
19、160; gtk_builder_add_from_file (builder, "window.glade", NULL); window = GTK_WIDGET (gtk_builder_get_object (builder, "window1"); gtk_builder_connect_signals (builder, NULL); g_object_unref (G_OBJECT (builder);
20、0; gtk_widget_show_all(window); gtk_main (); return 0;编译:$gcc -o window window.c pkg-config -cflags -libs gtk+-2
21、.0运行:$./window2、不使用glade生成,而是在c代码中直接创建#include <gtk/gtk.h>int main(int argc, char *argv) GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_show(window);
22、 gtk_main(); return 0;总结: 比较1和2,可以发现:使用Glade生成的xml文件进行解析生成GUI· 不需要调用gtk_window_new(直接由xml文件解析创建)· 需要调用GtkBuilder(由GtkBuilder解析xml文件) 所 以可以发现使用Glade设计UI,然后用于Gtk程序中十分容易,但是要想知道各个组建如何使用,如何选择组建,还是要学习Gtk+的文档。虽然 glade可以帮我们完成
23、界面的设计,但是只是界面而已,各个组件的用法还是要参考GTK+的tutors和手册。下面将比较使用glade进行界面设计 和使用gtk+直接编程的区别,从而理解使用gtk+/glade进行编程。Gtk+/Glade编程(二)-入门 <sunjianjiao> 本文将 porgrams”一章中内容采用Glade进行界面设计的方法完成“First porgrams”的例子,并且增加一些解释说明。 由于“Simple example”已经在Gtk+/Glade编程(一)中实现,这里就不再进行实现。一、将窗
24、口放置在屏幕中间主要是窗口属性的设置,在右下角处的“属性”里面进行设置:这样可以从右下角看到窗口对象的名称被设为:“Center”, 窗口的标题被设为“Center”, 长度为:230, 高度:150。保存并且命名为"center.glade"。代码为:#include <gtk/gtk.h>int main(int argc, char *argv) GtkBuilder *builder; GtkWidget *window; gtk_init(&am
25、p;argc, &argv); builder = gtk_builder_new(); gtk_builder_add_from_file(builder, "center.glade", NULL); window = GTK_WIDGET(gtk_builder_get_object(builder, "center"); /用于关闭窗口,也可以在属性的信号中进行设置 g_s
26、ignal_connect(GTK_WINDOW(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show(window); g_object_unref(builder); gtk_main(); return 0;编译: $gcc -o center center.c pkg-config -cflags -li
27、bs gtk+-2.0执行: $./center 点击关闭按钮可以正常关闭。如果不使用Glade进行界面设计及生成,生成窗口并且设置属性的步骤为:#include <gtk/gtk.h>int main(int argc, char *argv) GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVE
28、L); gtk_window_set_title(GTK_WINDOW(window), "center"); /title is "window" gtk_window_set_default_size(GTK_WINDOW(window), 230, 150); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_widge
29、t_show(window); gtk_main(); return 0;对比可知:创建一个组件,使用Gtk+· 需要new一个组件· 通过set进行属性设置使用Glade/Gtk+· 需要在点击生成窗口,· 通过属性设置栏进行属性设置· 利用GtkBuilder将生成的xml文件加入进来即可虽然感觉Glade/Gtk+的步骤更多,但是并没有直接使用Gtk+繁琐,尤其是Glade可以设计所见即所得的界面,使得编码更加方便,更加高效!二、
30、应用程序的图标只需“常规”的设置中,找到“图标”,选择需要设置为图标的图片即可,如下图:其他的设置没有改变,Gtk+的代码与“一、将窗口放置在屏幕中间”的代码相同(如果保存的xml的名字进行了改动,需要修改Gtk+中gtk_builder_add_from_file的文件名)运行结果截图:左上角出现了我们加入的图标,比上面的图都是“X”漂亮多了!_ 三、加 - 减3个子组件,1个“标签”, 2个“按钮”· “标签” ->显示一个整数· “+” , “-”> 增加 或减小标签上的数字。首先设计界面:在“顶层”中选 “窗口”在“容器”中选 “固定的”
31、60; -用于固定按钮和标签,不然加入这些组件的任何一个都会充满整个“窗口”在控制和显示中选“按钮” 和 “标签” (标签是黑色的,不带下划线的“Label”)然后点击 菜单栏最右边的“拖拽并调整工作区部件的大小”,调整“按钮”和“标签的”大小及位置。设置各个组件的属性:设置按钮的标签: 设置标签的属性:最后是Gtk+编程:unanaodebian:/gui/first-programs$ cat dec_inc.c#include <gtk/gtk.h>gint count = 0;gchar buf6;vo
32、id increase(GtkWidget *widget, GtkLabel *label) count+; sprintf(buf, "%d", count); gtk_label_set_text(label, buf);void decrease(GtkWidget *widget, GtkLabel *label) count-; sprintf(buf, "%d&q
33、uot;, count); gtk_label_set_text(label, buf);int main(int argc, char *argv) GtkBuilder *builder; GtkWidget *window; GtkWidget *plus; GtkWidget *minus; GtkWidget *result; gtk_
34、init(&argc, &argv); builder = gtk_builder_new(); gtk_builder_add_from_file(builder, "dec_inc.glade", NULL); window = GTK_WIDGET(gtk_builder_get_object(builder, "window"); plus = GTK_WIDGET(gtk_builder
35、_get_object(builder, "plus"); minus = GTK_WIDGET(gtk_builder_get_object(builder, "minus"); result = GTK_WIDGET(gtk_builder_get_object(builder, "label"); gtk_widget_show_all(window); g_signal_connect
36、(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(plus, "clicked", G_CALLBACK(increase), result); g_signal_connect(minus, "clicked", G_CALLBACK(decrease), result); gtk_main(); r
37、eturn 0;编译:gcc -o dec_inc dec_inc.c pkg-config -cflags -libs gtk+-2.0执行:./dec_inc 通过点击“+”和“-”就可以改变右边数字的值了。四、信号和回调函数 注意这里的回调函数和普通的函数不一样,虽然g_signal_connect只传了一个参数,但是回调函数是两个函数,我开始感觉这个例子写的够笨的, 本来传了一个参数, 回调函数居然写了两个参数, 我就去掉了一个参数, 结果执行结果会报错说传入的参数不是“标签”。 要使一个按钮执行一个动作,我们需设置信号和信号处理
38、函数之间的连接。可以这样使用函数来设置连接:gulong g_signal_connect( gpointer *object, const gchar *name, &
39、#160; GCallback func, gp
40、ointer func_data );第一个参数是要发出信号的构件,第二个参数是你想要连接的信号的名称,第三个参数是信号被捕获时所要调用的函数,第四个参数是你想传递给这个函数的数据。第三个参数指定的函数叫做回调函数:void callback_func( GtkWidget *widget, gpointer&
41、#160; callback_data );第一个参数是一个指向发出信号的构件的指针,第二个参数是一个指向数据的指针,就是 g_signal_connect() 函数的最后一个参数。注意上面回调函数的声明是一种常用的形式,有些构件的特殊信号会用不同的调用参数。另一个调用在形式 helloworld 程序中使用,是:gulong g_signal_connect_swapped( gpointer *object,
42、160; const gchar *name, &
43、#160; GCallback func, gpointer
44、 *slot_object );g_signal_connect_swapped() 和 g_signal_connect() 相同,只是回调函数只用一个参数,一个指向 GTK 对象的指针。所以当使用这个函数连接信号时,回调函数应该是这样的形式void callback_func( GtkObject *object );这个对象常是一个构件。然而我们通常不用函数 g_signal_connect_swapped() 设置连接。它们常被用在只接受一个单独的构件或者对象的回调函数中作为参数,如同我们的 helloworld 示例中那样。拥有两个设置信号连接函数的目的是简单的允许回调函
45、数有不同数目的参数。GTK 库中许多函数仅接受一个单独的构件指针作为其参数,所以对于这些函数你要用 g_signal_connect_swapped(),然而对你自己定义的函数,你需要附加的数据提供给你的回调函数。Gtk+/Glade编程(三) 菜单和工具栏 and Toolbars in GTK+”一章中内容采用Glade进行界面设计的方法完成这一章中的例子,并且增加一些解释说明和学习体会。 Glade进行图形化界面设计真的很给力,我以前也没有进行过图形界面相关的开发,虽然是学习过java,但是不是很喜欢,几乎都是混过去的,最近因为自 己想写一个东西,才开
46、始学习使用glade进行界面设计,发现真的很方便。几乎会了写一个组件乐,其他的都是一样的。一、简单的菜单1、创建一个窗口2、添加菜单 如上图:菜单就在“容器”中,鼠标指的地方。 这个图时已经添加了“菜单”。3、为“退出”菜单设置信号处理。 获得对象:gtk_builder_get_object 信号处理:g_signal_connect 还以获得菜单对象会相对复杂一些,但是Gtk+真是好用,获得的方法居然和其它的组建一模一样,其实想一想这是很正常的事情,只有windows才喜欢复
47、杂的东西,Open Source的思想是K.I.S.S原则。图形界面设计完了,下面编写我们的GTK+程序:#include <gtk/gtk.h>gint main(int argc, char *argv) GtkWidget *window; GtkBuilder *builder; GtkWidget *quit_menu; gtk_init(&argc, &argv); build
48、er = gtk_builder_new(); gtk_builder_add_from_file(builder, "simple-menu.glade", NULL); window = GTK_WIDGET(gtk_builder_get_object(builder, "window"); quit_menu = GTK_WIDGET(gtk_builder_get_object(builder, "imagemenuitem5&
49、quot;); gtk_widget_show_all(window); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(quit_menu, "activate", G_CALLBACK(gtk_main_quit), NULL); gtk_main();
50、0; return 0;编译:$ gcc -o simple-menu simple-menu.c pkg-config -libs -cflags gtk+-2.0执行:$ ./simple-menu 开始写这个程序的时候,忘记写gtk_main()了,结果一执行就退出了,感觉添加菜单会复杂一些,在回宿舍的路上就想是吧return 0 写在gtk_main()的前面了,原来是忘记写gtk_main()了。晚上困了干什么都没效率,所以建议时刻保持充沛的精神,精力充沛的一天比熬夜的 2天更有效果。二、图片菜单和快捷键2.1 设置菜单的图片:在“常规
51、”中,打开“Custom label and image”,在下面有现则图片。2.2 设置快捷键 在“公共中”设置“加速键”,就可以使用Ctrl + q 退出窗口了。2.3 Gtk+程序:unanaodebian:/Experiment/Programming/gui/menu-toolbars$ cat image-shortcuts.c#include <gtk/gtk.h>gint main(int argc, char *argv) GtkWidget *window; GtkBuilder
52、*builder; GtkWidget *quit_menu; gtk_init(&argc, &argv); builder = gtk_builder_new(); gtk_builder_add_from_file(builder, "image-shortcuts.glade", NULL); window = GTK_WIDGET(gtk_builder_get_obje
53、ct(builder, "window"); quit_menu = GTK_WIDGET(gtk_builder_get_object(builder, "quit_menu"); gtk_widget_show_all(window); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signa
54、l_connect(quit_menu, "activate", G_CALLBACK(gtk_main_quit), NULL); gtk_main(); return 0;执行结果图: 三、复选菜单在要添加复选菜单处,右键选择:“Edit”,如“视图”: 在“视图”上右键,选择“Add child check item item”。在窗口中添加“Status bar”编写Gtk+代码:unanaodebian:/Experiment/Gui/menu-toolbars
55、$ cat check-menu.c#include <gtk/gtk.h>void toggle_statusbar(GtkWidget *widget, gpointer *status_bar) if (gtk_check_menu_item_get_active(widget) gtk_widget_show(GTK_WIDGET(status_bar);
56、 else gtk_widget_hide(GTK_WIDGET(status_bar); gint main(int argc, char *argv) GtkWidget *window; GtkBuilder *builder; GtkWidget *quit_menu;
57、160; GtkWidget *status_bar; GtkWidget *tog_stat; gtk_init(&argc, &argv); builder = gtk_builder_new(); gtk_builder_add_from_file(builder, "image-shortcuts.glade", NULL); window = GTK_WIDGET(gtk
58、_builder_get_object(builder, "window"); quit_menu = GTK_WIDGET(gtk_builder_get_object(builder, "quit_menu"); status_bar = GTK_WIDGET(gtk_builder_get_object(builder, "statusbar1"); tog_stat = GTK_WIDGET(gtk_builder_ge
59、t_object(builder, "checkstatus"); g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G_OBJECT(quit_menu), "activate", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(G
60、_OBJECT(tog_stat), "activate", G_CALLBACK(toggle_statusbar), status_bar); gtk_widget_show_all(window); gtk_main(); return 0; 执行结果: 四、工具条 工具条为最长用的功能提供快速访问。 这里省略加窗口、垂直框和菜单。 添
61、加工具条:在toolbar上选择“Edit.”。 选择“Hierarchy” ->"添加",在“Edit Image” 的“保留ID”中选择需要添加的图片。unanaodebian:/Experiment/gui/menu-toolbars$ cat toolbar.c/* * file toolbar.c * brief Simple Toolbar * author unanao <sunjianjiao> * version 0.1 * date 2011-02-27 */#inc
62、lude <gtk/gtk.h>int main(int argc, char *argv) GtkWidget *window; GtkToolItem *quit; GtkBuilder *builder; gtk_init(&argc, &argv); builder = gtk_builder_new();
63、gtk_builder_add_from_file(builder, "toolbar.glade", NULL); window = GTK_WIDGET(gtk_builder_get_object(builder, "window"); quit = GTK_TOOL_ITEM(gtk_builder_get_object(builder, "quit"); gtk_widget_sh
64、ow_all(window); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); /Attention please, here is "clicked" g_signal_connect(quit, "clicked", G_CALLBACK(gtk_main_quit), NULL); gtk_mai
65、n(); return 0;运行结果: 这样点击红色的关闭按钮,就可以关闭这个窗口。五、撤销 重做与四中添加“新建”中的方法相同,添加“撤销”和“重做”按钮。编写代码:unanaodebian:/Experiment/gui/menu-toolbars$ cat undo-redo.c/* * file undo_redo.c * brief Simple Toolbar * author unanao <sunjianjiao> * version 0.1&
66、#160;* date 2011-02-28 */#include <gtk/gtk.h>#include <string.h>#include <stdlib.h>void undo_redo(GtkWidget *widget, gpointer item) static int count = 2; const char *name = gtk_widget_get_name(GTK_WIDGET(widget);
67、0; if (strcmp(name, "undo") = 0) count-; else if (strcmp(name, "redo") = 0) count+ ; els
68、e exit(1); /If the name is not "undo" and "redo" , it means that parameter is error if (count < 0) gtk_widget_set_sensitive(widg
69、et, FALSE); gtk_widget_set_sensitive(item, TRUE); else if (count > 5) gtk_widget_set_sensitive(widget, FALSE);
70、 gtk_widget_set_sensitive(item, TRUE); int main(int argc, char *argv) GtkWidget *window; GtkToolItem *quit; GtkWidget *undo; GtkToolItem *redo;
71、; GtkBuilder *builder; gtk_init(&argc, &argv); builder = gtk_builder_new(); gtk_builder_add_from_file(builder, "toolbar.glade", NULL); window = GTK_WIDGET(gtk_builder_get_object(builder
72、, "window"); quit = GTK_TOOL_ITEM(gtk_builder_get_object(builder, "quit"); undo = (gtk_builder_get_object(builder, "undo"); redo = GTK_TOOL_ITEM(gtk_builder_get_object(builder, "redo");
73、160; /undo = (gtk_builder_get_object(builder, "undo"); /redo = (gtk_builder_get_object(builder, "redo"); /printf below is used for debugging printf("undo: %sn", gtk_widget_get_name(undo);
74、; printf("quit: %sn", gtk_widget_get_name(quit); printf("window: %sn", gtk_widget_get_name(window); gtk_widget_show_all(window); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
75、 /Attention please, here is "clicked" g_signal_connect(quit, "clicked", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(undo, "clicked", G_CALLBACK(undo_redo), redo); g_signal_connect(redo, "clicked", G_CALLBACK(undo_redo), undo); gtk_main(); ret
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 多系统萎缩的临床护理
- 2025编写房屋租赁合同范文
- 《经济计量模型分析与应用》课件
- 邵阳一中联考试卷及答案
- 山西期中考试卷及答案
- 三中一模政治试卷及答案
- 2025简单商铺租赁合同样本
- 砖瓦企业生产调度与物流管理考核试卷
- 生物能源在农业领域的应用与创新考核试卷
- 网络直播平台内容创新与监管考核试卷
- 2024届广东惠城区重点达标名校中考猜题语文试卷含解析
- MOOC 离散系统建模与仿真理论基础-南开大学 中国大学慕课答案
- 杜绝形式主义-从我做起
- 学生牛奶、糕点配送服务承诺及售后服务
- 卡通风幼儿园餐前播报
- 冷库制冷负荷计算表
- 迅雷网盘最最最全影视资源-持续更新7.26
- 中国先锋戏剧研究
- 南山区土地评估咨询报告
- 12、口腔科诊疗指南及技术操作规范
- 国有企业知识产权管理
评论
0/150
提交评论