// image_viewer.c : Основной файл приложения
//
#include "image_viewer.h"
/*#pragma comment(lib,"gthread-2.0.lib")
#pragma comment(lib,"gtk-win32-2.0.lib")
#pragma comment(lib,"glib-2.0.lib")
#pragma comment(lib,"gobject-2.0.lib")
#pragma comment(lib,"gdk-win32-2.0.lib")
#pragma comment(lib,"gdk_pixbuf-2.0.lib")
#pragma comment(lib,"pango-1.0.lib")
#pragma comment(lib,"pangowin32-1.0.lib")
#pragma comment(lib,"intl.lib")
#pragma comment(lib,"pangocairo-1.0.lib")
*/
GtkWidget *window=NULL;// главное окно
static GtkWidget *draw_area = NULL;// область рисования
static GtkWidget *label_info=NULL;// метка с информацией о файле
static GdkPixbuf *pict=NULL;// картика
// Создать все меню - из файла create_menu.c
GtkWidget* create_menubar(void);
// обработчик выхода из приложения;
static void app_exit(GtkWidget *widget, gpointer data)// выход
{
printf("bye!\n");// Вывод на консоль, если она есть;
gtk_main_quit();// завершение главного цикла приложения gtk_main()
}
// открываем картинку
gboolean open_file(char *filename_ansi)
{
guint cx,cy;
GdkPixbufFormat *info_pbuf=NULL;
gchar *filename_utf8;
gchar *only_filename;
gchar *str;
// переводим в кодировку UTF8, ведь имя файла будет отображено на экране
filename_utf8 = g_filename_to_utf8(filename_ansi, -1, NULL, NULL, NULL);
// узнать имя файла, без путей
only_filename = g_path_get_basename(filename_utf8);
// если уже есть картинка, то удаляем её
if(pict) g_object_unref (pict);
pict = NULL;
// получаем информацию о картинке
info_pbuf = gdk_pixbuf_get_file_info(filename_ansi,&cx,&cy);
if(info_pbuf)// файл распознался как картинка
pict = gdk_pixbuf_new_from_file(filename_ansi, NULL);
// обновить информацию о файле
if(pict)
{
int bits = gdk_pixbuf_get_bits_per_sample(pict);
gboolean alpha = gdk_pixbuf_get_has_alpha(pict);
str = g_strdup_printf("Файл: '%s' Размер: %dx%d Глубина цвета: %d бит Прозрачность:%s",only_filename,cx,cy,bits,(alpha)?"есть":"нет");
}
else
str = g_strdup_printf("Файл: '%s' не является распознанной картинкой",only_filename);
gtk_label_set_text(GTK_LABEL(label_info),str);
g_free(filename_utf8);
g_free(only_filename);
g_free(str);
if(!pict) return FALSE;
return TRUE;
}
// перерисовка виджета с картинкой
static gboolean map_expose (GtkWidget *draw_area,GdkEventExpose *event,gpointer data)
{
GdkGC *gc;
GdkColor color;
// размеры виджета draw_area
gint dx;
gint dy;
// Узнаём размеры области вывода
gdk_drawable_get_size (draw_area->window, &dx,&dy);
gc = gdk_gc_new (draw_area->window);
// выбираем цвет для рисования;
color.red = 65535;
color.green= 0;
color.blue = 0;
gdk_gc_set_rgb_fg_color (gc, &color);
// параметры линий;
gdk_gc_set_line_attributes(gc,1,GDK_LINE_SOLID,GDK_CAP_ROUND,GDK_JOIN_ROUND);
// Рисуем рамку
gdk_draw_rectangle (draw_area->window,gc,FALSE,0,0,dx-1,dy-1);
g_object_unref (gc);
// return TRUE because we've handled this event, so no further processing is required.
return TRUE;
}
// Создаём главное окно
void create_main_form(void)
{
GtkWidget *vbox;
GtkWidget *vbox_in;
gchar *str;
// главное окно
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);// Главное окно создаем; GTK_WINDOW_TOPLEVEL GTK_WINDOW_POPUP
// Сигналы
// сигнал ("delete_event") - принудительное завершение
gtk_signal_connect( GTK_OBJECT( window ),"delete_event",GTK_SIGNAL_FUNC(gtk_false),NULL );//не передаем никаких данных в обработчик
// Данный сигнал ("destroy") можно создать путем вызова функции void gtk_widget_destroy( GtkWidget * );
// Или он будет выработан, когда обработчик сигнала "delete_event" вернет значение FALSE.
gtk_signal_connect( GTK_OBJECT( window ),"destroy",GTK_SIGNAL_FUNC(app_exit), NULL);
// заголовок окна
str = g_strdup_printf("%s %s","Image Viewer",VERSION);
gtk_window_set_title(GTK_WINDOW(window),str);
g_free(str);
// главный виджет в окне
vbox = gtk_vbox_new(FALSE,0);
// упаковываем его в окно
gtk_container_add(GTK_CONTAINER (window),vbox);
// создаем меню;
{
GtkWidget *menubar;
menubar = create_menubar();
// добавляем меню в главный виджет vbox
gtk_box_pack_start (GTK_BOX (vbox), menubar,FALSE, TRUE, 0);
}
// Ещё один вертикальный контейнер, будет внутри основного
vbox_in = gtk_vbox_new(FALSE,4);
// выставляем размер рамки вокруг виджета, то есть величину отступа по краю от родительского виджета
gtk_container_set_border_width(GTK_CONTAINER (vbox_in),6);
// добавляем vbox_in в главный виджет vbox
gtk_box_pack_start (GTK_BOX (vbox), vbox_in,TRUE, TRUE,4);
// Картинка - сделаём её из области для рисования
draw_area = gtk_drawing_area_new();
gtk_widget_set_size_request (draw_area, 100, 100);//set a minimum size
// подключаем обработчик "expose_event" - функция map_expose будет вызываться при перерисовке окна
g_signal_connect(G_OBJECT(draw_area), "expose_event",G_CALLBACK (map_expose), NULL);
// Упаковываем draw_area в vbox_in
gtk_box_pack_start (GTK_BOX (vbox_in), draw_area,TRUE, TRUE, 0);
// Текстовая метка с информацией о картинке
label_info = gtk_label_new("Файл: не загружен.");
gtk_misc_set_alignment(GTK_MISC(label_info),0,0.5);// выравнивание текста: по OX - слева,по OX - по центру.
// Упаковываем label_info в vbox_in
gtk_box_pack_start (GTK_BOX (vbox_in), label_info,FALSE, FALSE, 0);
}
int main(int argc, char* argv[])
{
gtk_init(&argc,&argv);// Инициализация GTK;
// Создаём главное окно
create_main_form();
// выставляем первоначальный размер главного окна
gtk_window_set_default_size (GTK_WINDOW (window), 640,(int)(480));
// отображение основного окна
gtk_widget_show_all(window);
// главный цикл приложения;
gtk_main();
return 0;
}
image-viewer1.1.tar.gz_show
版权申诉
159 浏览量
2022-09-20
16:17:27
上传
评论
收藏 38KB GZ 举报
寒泊
- 粉丝: 78
- 资源: 1万+
最新资源
- 织梦cms站长导航网站源码.zip
- 基于SSM+MySQL的网络投票调查问卷系统源码+数据库(java期末大作业).zip
- 基于jsp+servlet的宠物商城网站系统源码+数据库(java期末大作业).zip
- 基于Python+Tensorflow实现声纹识别+源代码+文档说明.zip
- java-leetcode题解之第112题路径总和.zip
- java-leetcode题解之第111题二叉树的最小深度.zip
- java-leetcode题解之第110题平衡二叉树.zip
- java-leetcode题解之第109题有序链表转换二叉搜索树.zip
- java-leetcode题解之第108题将有序数组转换为二叉搜索树.zip
- java-leetcode题解之第107题二叉树的层序遍历II.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈