### 顏色選擇 Color Selection
顏 色選擇(color selection)構件是一個用來交互式地選擇顏色的構件。這個組合構件讓用戶通過操縱RGB值(紅綠藍)和HSV值(色度、飽和度、純度)來選擇顏 色。這是通過調整滑動條(sliders)的值或者文本輸入構件的值,或者從一個色度/飽和度/純度條上選擇相應的顏色來實現的。你還可以通過它來設置顏 色的透明性。看下面的代碼例子:

~~~
/*File:color.c
*Date:2014-01-05
*Author:sjin
*Mail:413977243@qq.com
*/
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <glib.h>
GtkWidget *colorseldlg = NULL;
GtkWidget *drawingarea = NULL;
GdkColor color;
/*顏色改變處理信號*/
void color_changed_cb(GtkWidget *widget,GtkColorSelection *colorsel)
{
GdkColor ncolor;
gtk_color_selection_get_current_color(colorsel,&ncolor);
gtk_widget_modify_bg(drawingarea,GTK_STATE_NORMAL,&ncolor);
}
/*繪圖區事件處理函數*/
gint area_event(GtkWidget *widget,GdkEvent *event,gpointer client_data)
{
gint handled = FALSE;
gint response;
GtkColorSelection *colorsel;
/*檢查是否收到鼠標按鍵按下*/
if(event->type == GDK_BUTTON_PRESS){
handled = TRUE;
/*創建顏色選擇對話框*/
if(colorseldlg == NULL){
/*創建一個孤立的顏色選擇構件,并需要將其放在某個對話框*/
colorseldlg = gtk_color_selection_dialog_new("選擇背景顏色");
}
/*獲取顏色選擇構件*/
colorsel = GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(colorseldlg)->colorsel);
gtk_color_selection_set_previous_color(colorsel,&color);
gtk_color_selection_set_current_color(colorsel,&color);
gtk_color_selection_set_has_palette(colorsel,TRUE);
/*為color_changed 信號設置回調函數,將用戶數據設置為顏色選擇構件*/
g_signal_connect(GTK_OBJECT(colorsel),"color_changed",G_CALLBACK(color_changed_cb),(gpointer)colorsel);
/*顯示對話框*/
response = gtk_dialog_run(GTK_DIALOG(colorseldlg));
if(response == GTK_RESPONSE_OK){
/*獲取當前顏色,并保存到color中*/
gtk_color_selection_get_current_color(colorsel,&color);
}else{
/*設置成原來的顏色*/
gtk_widget_modify_bg(drawingarea,GTK_STATE_NORMAL,&color);
}
gtk_widget_hide(colorseldlg);
}
/*只有返回True,才能彈出顏色選擇控件*/
return handled;
}
/*關閉、退出事件處理函數*/
gint destroy_window(GtkWidget *widget,GdkEvent *event,gpointer client_data)
{
gtk_main_quit();
return TRUE;
}
int main( int argc, char *argv[] )
{
/* GtkWidget 是構件的存儲類型 */
GtkWidget *window;
GtkWidget *button;
/* 這個函數在所有的 GTK 程序都要調用。參數由命令行中解析出來并且送到該程序中*/
gtk_init (&argc, &argv);
/* 創建一個新窗口 */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/*設置窗口標題*/
gtk_window_set_title(GTK_WINDOW(window),"My first program helloworld!");
/**/
gtk_window_set_policy(GTK_WINDOW(window),TRUE,TRUE,TRUE);
/* 當窗口收到 "delete_event" 信號 (這個信號由窗口管理器發出,通常是“關閉”
* 選項或是標題欄上的關閉按鈕發出的),我們讓它調用在前面定義的 destroy_window() 函數。
* 傳給回調函數的 data 參數值是 NULL,它會被回調函數忽略。*/
g_signal_connect (GTK_OBJECT(window), "delete_event",G_CALLBACK (destroy_window), (gpointer)window);
/*創建繪圖區,設置尺寸,捕捉鼠標按鍵事件*/
drawingarea = gtk_drawing_area_new();
color.red = 0;
color.blue = 65535;
color.green = 0;
/*設置背景顏色*/
gtk_widget_modify_bg(drawingarea,GTK_STATE_NORMAL,&color);
/*設定繪圖區域的大小*/
gtk_widget_set_size_request(GTK_WIDGET(drawingarea),200,200);
/*設置成按鈕事件*/
gtk_widget_set_events(drawingarea,GDK_BUTTON_PRESS_MASK);
g_signal_connect(GTK_OBJECT(drawingarea),"event",GTK_SIGNAL_FUNC(area_event),(gpointer)drawingarea);
gtk_container_add(GTK_CONTAINER(window),drawingarea);
/* 最后一步是顯示新創建的按鈕和窗口 */
gtk_widget_show (drawingarea);
gtk_widget_show (window);
/* 所有的 GTK 程序必須有一個 gtk_main() 函數。程序運行停在這里
* 等待事件 (如鍵盤事件或鼠標事件) 的發生。*/
gtk_main ();
return 0;
}
~~~
### 文件選擇 File Selections
文件選擇(file selection)構件是一種快速、簡單的顯示文件對話框的方法。它帶有“Ok”、“Cancel”、“Help”按鈕,可以極大地減少編程時間。看下面的代碼:

~~~
/*File:color.c
*Date:2014-01-05
*Author:sjin
*Mail:413977243@qq.com
*/
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <glib.h>
/*獲得文件名,并將它打印到控制臺上*/
void file_ok_sel(GtkWidget *w,GtkFileSelection *fs)
{
g_print("%s\n",gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs)));
}
int main( int argc, char *argv[] )
{
/* GtkWidget 是構件的存儲類型 */
GtkWidget *filew;
/* 這個函數在所有的 GTK 程序都要調用。參數由命令行中解析出來并且送到該程序中*/
gtk_init (&argc, &argv);
/*創建一個新的文件選擇構件*/
filew = gtk_file_selection_new("文件選擇對話框");
g_signal_connect (GTK_OBJECT(filew), "destroy",G_CALLBACK (gtk_main_quit), NULL);
/*為ok_button按鈕設置回調函數,鏈接到file_ok_sel 函數*/
g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button),"clicked",G_CALLBACK(file_ok_sel),filew);
/*為cancel_button設置回調函數*/
g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->cancel_button),"clicked",G_CALLBACK(gtk_main_quit),filew);
/*設置文件名,不如這個一個文件保存對話框,我們給了一個缺省文件名*/
gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew),"1111.png");
gtk_widget_show (filew);
/* 所有的 GTK 程序必須有一個 gtk_main() 函數。程序運行停在這里
* 等待事件 (如鍵盤事件或鼠標事件) 的發生。*/
gtk_main ();
return 0;
}
~~~