fragment/常用函数/gtk_functions.c
2021-08-29 00:02:47 +08:00

235 lines
12 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//`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;
}/*}}}*/