Wednesday 9 June 2010

@Lập trình GUI với GTK trong Linux...



Lập trình GUI với GTK trong Linux...
khanhduy301 khanhduy301 đang offline 12-25-2009, 04:47 PM




Hôm nay thi xong đồ họa nên quyết định nghỉ xả hơi.
Ngồi rảnh rảnh, không biết làm chi nên ngồi tìm tòi Linux chơi và quyết định code 1 chương trình có GUI trên Linux.
Sau khi tìm hiểu thì mình quyết định dùng thư viện GTK để lập trình GUI.
Mặc định thì các thư viện core của GTK đã được đính kèm (GNOME xài cái này mà )
Nhưng thư viện SDK của nó thì không được đính kèm nên các bạn có thể download thêm thong qua CLI sau:

Code:
sudo apt-get install libgtk2.0-dev
-Còn công cụ dùng để hỗ trợ cho việc lập trình trong Ubuntu thì các bạn có thể dùng KDevelop.
-Trình biên dịch mình dùng là g++.

Các bước cơ bản để tạo 1 cửa sổ trong Ubuntu:

Code:
int main(int argc, char **argv)

{
//Init GTK:
//Khởi tạo, - chắc giống như WinMain đó :D.
gtk_init(&argc, &argv);
//Khai báo biến cửa sổ:
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
//Set thuộc tính boder:
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
//Set Title:
gtk_window_set_title(GTK_WINDOW(window), "Linux GUI - Hello World!!!");
//Set chiều dài, rộng:
gtk_window_resize(GTK_WINDOW(window), 500, 500);

//Show Window:
gtk_widget_show(window);
//Gtk Main Loop: (giống như glMainLoop() đó :P).
gtk_main();
return 0;
};
Để đăng ký hàm callback cho 1 event, bạn có thể dùng hàm:
Code:
g_signal_connect(instance, detailed_signal, handler, data);
-> Trong đó, instance là đối tượng (object) mà bạn cần bắt sự kiện.

-> detailed_signal: là tên Event.

-> Handler: Hàm Callback.

-> Data: chưa cần quan tâm .

Các bạn có thể tham khảo thêm ở trang:

Code:
 http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect
-Để add thêm 1 đối tượng lên form, bạn dùng hàm: gtk_container_add().
-> Chi tiết:
Code:
 http://library.gnome.org/devel/gtk/unstable/GtkContainer.html#gtk-container-add
-> Đừng quên gọi hàm gtk_widget_show() cho đối tượng này nhé.

- Tất cả các hàm đều có hướng dẫn chi tiết trên:
Code:
 http://library.gnome.org
-Sau đây là đoạn code ví dụ đơn giản của mình code.
-> Nhiệm vụ của nó là cho phép người dùng Browser đến 1 file và mở nó. Nội dung file sẽ được hiển thị trên Textbox.

- Hình minh họa:


Code:
#include 
#include
#include
#include

//Khai bao bien:
GtkWidget *GlobalForm = NULL;
GtkWidget *GlobalTextBox001 = NULL;

//Khai bao ham:
void Destroy(void);
void browseButtonClicked(GtkButton *button, gpointer user_data);
void exitButtonClicked(GtkButton *button, gpointer user_data);
void aboutButtonClicked(GtkButton *button, gpointer user_data);

//Trien khai ham:
int main(int argc, char **argv)
{
//Init GTK:
gtk_init(&argc, &argv);

//Khoi tao cua so main:
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
GlobalForm = window;
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
gtk_window_set_title(GTK_WINDOW(window), "Linux GUI - Hello World!!!");
gtk_window_resize(GTK_WINDOW(window), 500, 500);

//Add Fixed:
GtkWidget *fixedForm = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(window), fixedForm);
gtk_widget_show(fixedForm);

//Add TextBox:
GtkWidget *scrollTextBox001 = gtk_scrolled_window_new(NULL, NULL);
GtkWidget *TextBox001 = gtk_text_view_new();
GlobalTextBox001 = TextBox001;
gtk_container_add(GTK_CONTAINER(scrollTextBox001), TextBox001);
gtk_fixed_put(GTK_FIXED(fixedForm), scrollTextBox001, 0, 0);
gtk_widget_set_size_request(TextBox001, 360, 500);
gtk_widget_show(scrollTextBox001);
gtk_widget_show(TextBox001);

//Add Button Open File:
GtkWidget *browseButton = gtk_button_new_with_label("Browse Files");
gtk_widget_set_size_request(browseButton, 145, 50);
gtk_fixed_put(GTK_FIXED(fixedForm), browseButton, 390, 0);
g_signal_connect(GTK_OBJECT(browseButton), "clicked", G_CALLBACK(browseButtonClicked), NULL);
gtk_widget_show(browseButton);

//Add Exit Button:
GtkWidget *exitButton = gtk_button_new_with_label("Exit");
gtk_widget_set_size_request(exitButton, 145, 50);
gtk_fixed_put(GTK_FIXED(fixedForm), exitButton, 390, 450);
g_signal_connect(GTK_OBJECT(exitButton), "clicked", G_CALLBACK(exitButtonClicked), NULL);
gtk_widget_show(exitButton);

//Add About Button:
GtkWidget *aboutButton = gtk_button_new_with_label("About");
gtk_widget_set_size_request(aboutButton, 145, 50);
gtk_fixed_put(GTK_FIXED(fixedForm), aboutButton, 390, 390);
g_signal_connect(GTK_OBJECT(aboutButton), "clicked", G_CALLBACK(aboutButtonClicked), NULL);
gtk_widget_show(aboutButton);



//Khai bao ham su kien Destroy Window:
g_signal_connect(GTK_OBJECT(window), "destroy", G_CALLBACK(Destroy), NULL);
//Show:
gtk_widget_show(window);

//Test coi Su Kien co xay ra ko?
/*GtkWidget *dialog = gtk_dialog_new();
gtk_window_set_title(GTK_WINDOW(dialog), "For Debug Only");
gtk_window_resize(GTK_WINDOW(dialog), 300,300);
gtk_widget_show(dialog);*/

gtk_main();
return 0;
}

void browseButtonClicked(GtkButton *button, gpointer user_data)
{
GtkWidget *dialog = gtk_file_chooser_dialog_new ("Browse File",
GTK_WINDOW(GlobalForm),
GTK_FILE_CHOOSER_ACTION_OPEN,
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,NULL);
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
{
char *filename;
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
gtk_window_set_title(GTK_WINDOW(GlobalForm), filename);

//Doc File:
FILE *f = NULL;
f = fopen(filename, "rt");
int iFileSize = 0;
fseek(f, 0, SEEK_END);
iFileSize = ftell(f);
char *buff = new char[iFileSize + 1];
memset(buff, NULL, iFileSize + 1);
fseek(f, 0, SEEK_SET);

fread(buff, 1, iFileSize, f);
fclose(f);

//Display On Textbox:
GtkTextBuffer *TextBuffer001 = gtk_text_buffer_new(NULL);
gtk_text_buffer_set_text(GTK_TEXT_BUFFER(TextBuffer001), buff, strlen(buff));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(GlobalTextBox001), GTK_TEXT_BUFFER(TextBuffer001));

//open_file (filename);
delete [] buff;
g_free (filename);
}
gtk_widget_destroy (dialog);

return;
};
void aboutButtonClicked(GtkButton *button, gpointer user_data)
{
GtkWidget *AboutForm = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(AboutForm), "About this program...");
gtk_window_resize(GTK_WINDOW(AboutForm), 300, 300);
//Add Fixed:
GtkWidget *fixed = gtk_fixed_new();
gtk_container_add(GTK_CONTAINER(AboutForm), fixed);
gtk_widget_show(fixed);

//Load hinh anh:
GtkWidget *Image001 = gtk_image_new_from_file("logo.jpg");
gtk_fixed_put(GTK_FIXED(fixed), Image001, 10, 10);
gtk_widget_show(Image001);

//Add Lable:
GtkWidget *Label1 = gtk_label_new_with_mnemonic("Le Nguyen Khanh Duy - 0711070");
gtk_fixed_put(GTK_FIXED(fixed), Label1, 45, 250);
gtk_widget_show(Label1);

gtk_widget_show(AboutForm);
return;
};
void exitButtonClicked(GtkButton *button, gpointer user_data)
{
gtk_main_quit();
return;
};

void Destroy(void)
{
gtk_main_quit();
return;
};

Thân,

- Virusvn.com -

No comments:

Post a Comment