235 lines
12 KiB
C
235 lines
12 KiB
C
//`pkg-config --cflags --libs gtk+-2.0` //编译标志
|
||
#include <gtk/gtk.h> //头文件
|
||
int main(int argc,char *argv[]) //主函数
|
||
{
|
||
gtk_init(&argc,&argv[]);
|
||
GtkWidget *window=gtk_window_new(GTK_WINDOW_TOPLEVEL); //有边框
|
||
GTK_WINDOW_POPUP //无边框
|
||
//控件操作
|
||
gtk_widget_show(window);
|
||
gtk_main();
|
||
return 0;
|
||
}
|
||
void gtk_window_set_title(GtkWindow *window,const gchar *title); //窗口标题
|
||
void gtk_widget_set_size_request(GtkWidget *widget,gint width,gint height); //窗口最小大小
|
||
void gtk_window_set_resizable(GtkWindow *window,gboolean resizable); //窗口伸缩
|
||
void gtk_window_set_position(GtkWindow *window,GtkWindowPosition position); //窗口位置
|
||
GTK_WIN_POS_NONE
|
||
GTK_WIN_POS_CENTER
|
||
GTK_WIN_POS_MOUSE
|
||
GTK_WIN_POS_CENTER_ALWAYS
|
||
GdkPixbuf *gdk_pixbuf_new_from_file(const gchar *filename,GError **error); //创建图片资源
|
||
NULL
|
||
GdkPixbuf *gdk_pixbuf_scale_simple(const GdkPixbuf *src,int dest_width,int dest_height,GdkInterpType interp_type); //设置图片大小
|
||
GDK_INTERP_BILINEAR
|
||
void g_object_unref(GtkObject *object); //释放资源
|
||
GtkWidget *gtk_image_new_from_pixbuf(GdkPixbuf *pixbuf); //通过资源创建图片控件
|
||
void gtk_image_set_from_pixbuf(GtkImage *image,GdkPixbuf *pixbuf); //设置图片控件图片
|
||
void gtk_image_clear(GtkImage *image); //清除图像控件里的图像数据
|
||
GtkWidget *gtk_button_new_with_lable(const gcahr *label); //创建带内容按钮
|
||
void gtk_button_set_label(GtkButton *button,const gchar *label); //设置按钮标签
|
||
const gchar *gtk_button_get_label(GtkButton *button); //获取按钮标签
|
||
void gtk_widget_set_sensitive(GtkWidget *widget,gboolean sensitive); //按钮使能
|
||
void gtk_button_set_image(GtkButton *button,GtkWidget *image); //设置按钮图片
|
||
void gtk_button_set_relief(GtkButton *button,GtkReliefStyle newstyle); //按钮透明度
|
||
GTK_RELIEF_NONE //按钮透明
|
||
void gtk_container_add(GtkContainer *container,GtkWidget *widget); //容器附加控件
|
||
gulong g_signal_connect(gpointer instance,const gchar *detailed_signal,GCallback c_handler,gpointer data); //信号连接回调
|
||
GtkWidget *gtk_hbox_new(gboolean homogeneous,gint spacing); //水平布局
|
||
GtkWidget *gtk_vbox_new(gboolean homogeneous,gint spacing); //垂直布局
|
||
GtkWidget *gtk_label_new(cost gchar *str); //创建标签
|
||
void gtk_label_set_text(GtkLabel *label,const gchar *str); //设置标签内容
|
||
const gchar *gtk_label_get_label(GtkLabel *label); //获取标签内容
|
||
GtkWidget *gtk_table_new(guint rows,guint columns,gboolean homogeneous); //表格布局
|
||
void gtk_table_attach_defaults(GtkTable *table,GtkWidget *widget,guint left_attach,guint right_attach,guint top_attach,guint bottom_attach); //表格布局附加控件
|
||
GtkWidget *gtk_fixed_new(); //固定布局
|
||
void gtk_fixed_put(GtkFixed *fixed,GtkWidget *widget,gint x,gint y); //固定布局附加控件
|
||
GtkWidget *gtk_entry_new(void); //行编辑
|
||
gtk_entry_set_visibility(GtkEntry *entry,gboolean visible); //行编辑显示
|
||
const gchar *gtk_entry_get_text(GtkEngry *entry); //获取行编辑内容
|
||
void gtk_entry_set_text(GtkEngry *entry,const gchar *text); //设置行编辑内容
|
||
"activate" //行编辑触发信号
|
||
GtkWidget *gtk_process_bar_new(); //进度条
|
||
void gtk_process_bar_set_fraction(GtkProgressBar *pbar,gdouble fraction); //设置进度条百分比
|
||
void gtk_process_bar_set_text(GtkProgressBar *pbar,gchar *text); //设置滑槽文本显示
|
||
void gtk_progress_bar_set_orientation(GtkProgressBar *pbar,GtkProgressBarOrientation orientation); //设置进度条移动方向
|
||
GTK_PROGRESS_LEFT_TO_RIGHT
|
||
GTK_PROGRESS_RIGHT_TO_LEFT
|
||
GTK_PROGRESS_BOTTOM_TO_TOP
|
||
GTK_PROGRESS_TOP_TO_BOTTOM
|
||
GtkWidget *gtk_scrolled_window_new(GtkAdjustment *hadjustment,GtkAdjustment *vadjustment); //滚动窗口
|
||
NULL NULL
|
||
void gtk_scolled_window_set_policy(GtkScolledWindow *scrolled_window,GtkPolicyTypehscrollbar_policy,GtkPolicyType vscrollbar_policy); //滚动条出现的方式
|
||
GTK_POLICY_AUTOMATIC
|
||
GTK_POLICY_ALWAYS
|
||
GTK_POLICY_NEVER
|
||
GtkWidget *gtk_clist_new_with_titles(gint columns,gchar *titles[]); //创建列表
|
||
void gtk_clist_set_column_width(GtkCList *clist,gint column,gint width); //设置列宽
|
||
void gtk_clist_set_column_justification(GtkCList *clist,gint column,GtkJustification justification); //对齐方式
|
||
GTK_JUSTIFY_LEFT
|
||
GTK_JUSTIFY_RIGHT
|
||
GTK_JUSTIFY_CENTER
|
||
GTK_JUSTIFY_CENTER
|
||
gint gtk_clist_append(GtkCList *clist,gchar *text[]); //列表添加行
|
||
void gtk_clist_clear(GtkCList *clist); //清空列表所有行
|
||
gint gtk_clist_get_text(GtkCList *clist,gint row,gint column,gchar **text); //获取某行某列内容
|
||
"select_row" //列表行出发信号
|
||
guint g_timeout_add(guint interval,GSourceFunc function,gpointer data); //创建定时器
|
||
gboolean g_source_remove(guint tag); //移除定时器
|
||
void gtk_widget_add_events(GtkWidget *widget,gint events); //控件捕获事件
|
||
GDK_BUTTON_PRESS_MASK
|
||
GDK_BUTTON_RELEASE_MASK
|
||
GDK_BUTTON_MOTION_MASK
|
||
GDK_KEY_PRESS_MASK
|
||
GDK_ENTER_NOTIFY_MASK
|
||
"button_press_event" //鼠标点击事件信号
|
||
"button_release_event" //鼠标释放事件信号
|
||
gboolean callback(GtkWidget *widget,GdkEventButton *event,gpointer data); //鼠标点击事件回调
|
||
event->x,event->y //获取点击坐标值
|
||
event->button //1左键,2中键,3右键
|
||
event->type //双击GDK_2BUTTON_PRESS
|
||
return TRUE;
|
||
"motion_notify_event" //鼠标移动事件信号
|
||
gboolean callback(GtkWidget *widget,GdkEventMotion *event,gpointer data); //鼠标移动事件回调
|
||
event->x,event->y //获取移动坐标值
|
||
return TRUE;
|
||
"key_press_event" //键盘按下事件的信号
|
||
"key_release_event" //键盘释放事件的信号
|
||
gboolean callback(GtkWidget *widget,GdkEventKey *event,gpointer data); //键盘按下事件回调
|
||
event->keyval //获取键值
|
||
return TRUE;
|
||
"expose_event" //曝光事件信号
|
||
gboolean callback(GtkWidget *widget,GdkEventExpose *event,gpointer data); //曝光事件回调
|
||
return FALSE;
|
||
#include <cairo.h> //Cairo绘图头文件
|
||
void gtk_widget_set_app_paintable(GtkWidgte *widget,gboolean app_paintable); //允许窗口绘图
|
||
cairo_t *gtk_cairo_create(GdkDrawable *drawable); //创建Cairo环境
|
||
drawable->window
|
||
void cairo_destroy(cairo_t *cr); //回收资源
|
||
void cairo_set_line_width(cairo_t *cr,double width); //设置线宽
|
||
void cairo_set_source_rgb(cairo_t *cr,double r,double g,double b); //设置颜色,r,g,b从0.0到1.0
|
||
void cairo_move_to(cairo_t *cr,double x,double y); //设置直线起点
|
||
void cairo_line_to(cairo_t *cr,double x,double y); //设置直线终点
|
||
void cairo_rectangle(cairo_t *cr,double x,double y,double width,double height); //设置矩形路径
|
||
void cairo_stroke(cairo_t *cr); //绘制cairo
|
||
void cairo_fill(cairo_t *cr); //填充cairo闭合路径
|
||
void cairo_select_font_face(cairo_t *cr,const char *family,cairo_font_slant_t slant,cairo_font_weight_t weight);
|
||
字体 倾斜 加粗
|
||
void cairo_set_font_size(cairo_t *cr,double size); //设置字体大小
|
||
void cairo_show_text(cairo_t *cr,const char *utf8); //显示字符串
|
||
gdk_cairo_set_source_pixbuf(cairo_t *cr,const GdkPixbuf *pixbuf,double pixbuf_x,double pixbuf_y); //设置画图图片
|
||
void cairo_paint(cairo_t *cr); //绘制图片
|
||
void gtk_widget_queue_draw(GtkWidget *widget); //刷新绘图区域
|
||
void gtk_thread_init(void) //gtk创建线程前调用/*{{{*/
|
||
{
|
||
if(FALSE == g_thread_supported())
|
||
{
|
||
g_thread_init(NULL);
|
||
}
|
||
gdk_threads_init();
|
||
}/*}}}*/
|
||
void *pthread_fun(void *data) //线程函数中操作界面需要封装/*{{{*/
|
||
{
|
||
gdk_threads_enter();
|
||
//一个或多个界面操作函数
|
||
gdk_threads_leave();
|
||
}/*}}}*/
|
||
/* 功能: 设置背景图
|
||
* widget: 主窗口
|
||
* w, h: 图片的大小
|
||
* path: 图片路径
|
||
*/
|
||
static void chang_background(GtkWidget *widget, int w, int h, const gchar *path)/*{{{*/
|
||
{
|
||
gtk_widget_set_app_paintable(widget, TRUE); //允许窗口可以绘图
|
||
gtk_widget_realize(widget);
|
||
|
||
/* 更改背景图时,图片会重叠
|
||
* 这时要手动调用下面的函数,让窗口绘图区域失效,产生窗口重绘制事件(即 expose 事件)。
|
||
*/
|
||
gtk_widget_queue_draw(widget);
|
||
|
||
GdkPixbuf *src_pixbuf = gdk_pixbuf_new_from_file(path, NULL); // 创建图片资源对象
|
||
// w, h是指定图片的宽度和高度
|
||
GdkPixbuf *dst_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR);
|
||
|
||
GdkPixmap *pixmap = NULL;
|
||
|
||
/* 创建pixmap图像;
|
||
* NULL:不需要蒙版;
|
||
* 123: 0~255,透明到不透明
|
||
*/
|
||
gdk_pixbuf_render_pixmap_and_mask(dst_pixbuf, &pixmap, NULL, 128);
|
||
// 通过pixmap给widget设置一张背景图,最后一个参数必须为: FASLE
|
||
gdk_window_set_back_pixmap(widget->window, pixmap, FALSE);
|
||
|
||
// 释放资源
|
||
g_object_unref(src_pixbuf);
|
||
g_object_unref(dst_pixbuf);
|
||
g_object_unref(pixmap);
|
||
}/*}}}*/
|
||
|
||
/* 功能: 设置控件字体大小
|
||
* widget: 需要改变字体的控件
|
||
* size: 字体大小
|
||
* is_button: TRUE代表控件为按钮,FALSE为其它控件
|
||
*/
|
||
static void set_widget_font_size(GtkWidget *widget, int size, gboolean is_button)/*{{{*/
|
||
{
|
||
GtkWidget *labelChild;
|
||
PangoFontDescription *font;
|
||
gint fontSize = size;
|
||
|
||
font = pango_font_description_from_string("Sans"); //"Sans"字体名
|
||
pango_font_description_set_size(font, fontSize*PANGO_SCALE);//设置字体大小
|
||
|
||
if(is_button){
|
||
labelChild = gtk_bin_get_child(GTK_BIN(widget));//取出GtkButton里的label
|
||
}else{
|
||
labelChild = widget;
|
||
}
|
||
|
||
//设置label的字体,这样这个GtkButton上面显示的字体就变了
|
||
gtk_widget_modify_font(GTK_WIDGET(labelChild), font);
|
||
pango_font_description_free(font);
|
||
}/*}}}*/
|
||
|
||
// 给创建好的image重新设计一张图片
|
||
void load_image(GtkWidget *image, const char *file_path, const int w, const int h )/*{{{*/
|
||
{
|
||
gtk_image_clear( GTK_IMAGE(image) ); // 清除图像
|
||
GdkPixbuf *src_pixbuf = gdk_pixbuf_new_from_file(file_path, NULL); // 创建图片资源
|
||
GdkPixbuf *dest_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR); // 指定大小
|
||
gtk_image_set_from_pixbuf(GTK_IMAGE(image), dest_pixbuf); // 图片控件重新设置一张图片(pixbuf)
|
||
g_object_unref(src_pixbuf); // 释放资源
|
||
g_object_unref(dest_pixbuf); // 释放资源
|
||
}/*}}}*/
|
||
|
||
/***********************************************
|
||
* 函数功能:设置窗口显示字体颜色
|
||
* 参数类型:widget:需要改变颜色的控件
|
||
color_buf:设置字体颜色,如"red"、"blue"
|
||
is_button:是否为button
|
||
* 返回类型:成功返回0,失败返回-1
|
||
* 维护记录:2013-12-18 by lihuibo
|
||
***********************************************/
|
||
int sungtk_widget_set_font_color(GtkWidget *widget, const char *color_buf, gboolean is_button)/*{{{*/
|
||
{
|
||
if(widget == NULL && color_buf==NULL)
|
||
return -1;
|
||
|
||
GdkColor color;
|
||
GtkWidget *labelChild = NULL;
|
||
sungtk_color_get(color_buf, &color);
|
||
if(is_button == TRUE){
|
||
labelChild = gtk_bin_get_child(GTK_BIN(widget));//取出GtkButton里的label
|
||
gtk_widget_modify_fg(labelChild, GTK_STATE_NORMAL, &color);
|
||
gtk_widget_modify_fg(labelChild, GTK_STATE_SELECTED, &color);
|
||
gtk_widget_modify_fg(labelChild, GTK_STATE_PRELIGHT, &color);
|
||
}else{
|
||
gtk_widget_modify_fg(widget, GTK_STATE_NORMAL, &color);
|
||
}
|
||
return 0;
|
||
}/*}}}*/
|
||
|