223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
1

FLTK сменить иконку окна

02.05.2019, 15:23. Показов 3300. Ответов 18

Author24 — интернет-сервис помощи студентам
Доброго здравия всем! Сразу перейду к делу: с помощью библиотеки FLTK создал окно, решил задать своё изображение (в верхнем левом углу иконка), но ничего пока что не вышло. Я так понимаю, что должна быть какая-то функция в библиотеке, которая отвечает за это действие, но пока ничего не нашёл. Или всё же нужно использовать API ОС (Windows в моём случае), но тогда зачем нужна эта библиотека.... Поломав голову решил спросить у вас, возможно, кто-то уже нашёл решение или просто совет какой-нибудь даст, полезный конечно же.

Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2019, 15:23
Ответы с готовыми решениями:

Сменить иконку
Сделал я иконку для своей программы. Когда она просто лежит на рабочим столе все ок. Края не...

Как сменить иконку?
Я поменял в настройках иконку, после того как я собираю проект в *.exe иконка та, которую я...

Как сменить иконку?
Нарисовал новую иконку, а Яша больше месяца отказывается её менять, млин ... Может кто уже...

Сменить стандартную иконку (Android)
Привет! Ребята как сменить стандартную иконку делфи при разработке андроид? чтобы на смартфоне была...

18
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
04.05.2019, 18:10 2
https://www.fltk.org/doc-1.3/o... on_windows
0
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
04.05.2019, 22:03  [ТС] 3
Что за IDI_ICON?
C++
1
win->icon((const void*)LoadIcon(fl_display, MAKEINTRESOURCE("D:\\favicon.ico")));
Такая строка корректно компилируется, но ничего не происходит.

Нашёл вот такой код:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
static Fl_Double_Window* win;
 
void cb_choice(Fl_Widget*, void* v)
{
    Fl_Color c = (Fl_Color)(fl_intptr_t)v;
    uchar buffer[32*32*3];
    Fl_Rgb_Image icon(buffer, 32, 32, 3);
    icon.color_average(c, 0.0);
    win->icon(&icon);
}
Fl_Menu_Item choice[] = {
    {"Red", 0, cb_choice, (void*)FL_RED},
    {"Green", 0, cb_choice, (void*)FL_GREEN},
    {"Blue", 0, cb_choice, (void*)FL_BLUE},
    {0}
};
 
int main(int argc, char** argv)
{
    Fl_Double_Window window(400, 300);
    win = &window;
    
    Fl_Choice choice(80, 100, 200, 25, "Color:");
    choice.menu(choices);
    choice.callback(cb_choice);
    choice.when(FL_WHEN_RELEASE|FL_WHEN_NOT_CHANGED);
    
    window.end();
    window.show(argc, argv);
    return Fl::run();
}

Так иконка меняет цвет, а вот что-то стоящего, изображение, скажет в формате *.ico, запилить не получается
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
05.05.2019, 03:22 4
resource.h:
C
1
#define IDI_ICON 100
resource.rc:
C
1
2
3
#include "resource.h"
 
IDI_ICON ICON DISCARDABLE "D:/temp/Smile.ico"
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include <FL/x.H>
#include "resource.h"
 
int main (int argc, char ** argv)
{
  Fl_Window *window;
  Fl_Box *box;
 
  window = new Fl_Window (300, 180);
  window->icon((const void *)LoadIcon(fl_display, MAKEINTRESOURCE(IDI_ICON)));
 
  box = new Fl_Box (20, 40, 260, 100, "Hello World!");
 
  box->box (FL_UP_BOX);
  box->labelsize (36);
  box->labelfont (FL_BOLD+FL_ITALIC);
  box->labeltype (FL_SHADOW_LABEL);
  window->end ();
  window->show (argc, argv);
 
  return(Fl::run());
}
Миниатюры
FLTK сменить иконку окна  
1
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
05.05.2019, 06:24  [ТС] 5
Да, стыдно, но про файл ресурсов почти ничего не знал, ещё не пользовался им.
Но, если вызвать эту функцию из функции обратного вызова, то ничего не происходит, с чем это связано?
Если я решу добавить ещё пару иконок в этот файл ресурсов, то это нормально?... Если я решу создать что-то похожее на то приложение, код которого я выкладывал выше, но меняться будет не цвет, а изображения(иконки), то мне нужно будет вызывать callback-функцию, а в ней код
C++
1
win->icon((const void*)LoadIcon(fl_display, MAKEINTRESOURCE(IDI_ICON)));
не работает, то что нужно подправить?
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
05.05.2019, 09:54 6
Лучший ответ Сообщение было отмечено Liss29 как решение

Решение

Цитата Сообщение от Liss29 Посмотреть сообщение
Но, если вызвать эту функцию из функции обратного вызова, то ничего не происходит, с чем это связано?
Метод icon работает если его вызывать до отображения окна. Но LoadIcon это все равно уже WinAPI. Поэтому можно не побрезговать и вызвать еще одну WinAPI функцию SendMessage.
resource.h:
C
1
2
3
#define IDI_ICON1 100
#define IDI_ICON2 101
#define IDI_ICON3 102
resource.rc:
C
1
2
3
4
5
#include "resource.h"
 
IDI_ICON1 ICON DISCARDABLE "D:/temp/Smile.ico"
IDI_ICON2 ICON DISCARDABLE "D:/temp/Ufo.ico"
IDI_ICON3 ICON DISCARDABLE "D:/temp/Food.ico"
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Choice.H>
#include <FL/x.H>
#include "resource.h"
 
static Fl_Double_Window* win;
 
void cb_choice(Fl_Widget*, void* v)
{
    SendMessage(fl_xid(win), WM_SETICON, (WPARAM)ICON_SMALL, (LPARAM)LoadIcon(fl_display, MAKEINTRESOURCE((fl_intptr_t)v)));
}
Fl_Menu_Item choices[] =
{
    {"Red", 0, cb_choice, (void*)IDI_ICON1},
    {"Green", 0, cb_choice, (void*)IDI_ICON2},
    {"Blue", 0, cb_choice, (void*)IDI_ICON3},
    {0}
};
 
int main(int argc, char** argv)
{
    Fl_Double_Window window(400, 300);
    win = &window;
 
    Fl_Choice choice(80, 100, 200, 25, "Color:");
    choice.menu(choices);
    choice.callback(cb_choice);
    choice.when(FL_WHEN_RELEASE | FL_WHEN_NOT_CHANGED);
 
 
    window.end();
    window.show(argc, argv);
    return Fl::run();
}
1
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
05.05.2019, 16:36  [ТС] 7
Да, так работает, смущает только то, что надо использовать API, зачем тогда эта библиотека нужна, в любом случае нужно погружаться в изучение win API.

Раз уж пошла такая пьянка, то что такое класс Fl_Cairo_Window, если знаешь, конечно, я взял пример из папки test в FLTK, но он не запускается, просит ""please configure fltk with CAIRO enabled (--enable-cairo or --enable-cairoext)" что это значит то... Я просто суть понять не могу, зачем нужен этот класс, и что он делает?!
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
05.05.2019, 22:24 8
Цитата Сообщение от Liss29 Посмотреть сообщение
зачем тогда эта библиотека нужна, в любом случае нужно погружаться в изучение win API
Что-то я сразу не сообразил, меня вот эта фраза сбила
FLTK currently supports setting a window's icon before it is shown using the Fl_Window::icon() method
Можно и без WinAPI, *.ico преобразовать в структуры экспортом в формат *.с из GIMP. (пример превышает допустимый размер, поэтому прилагаю в виде архива)
Цитата Сообщение от Liss29 Посмотреть сообщение
что такое класс Fl_Cairo_Window
Cairo - это графическая библиотека, соответственно Fl_Cairo_Window окно на котором с помощью функций этой библиотеки можно рисовать. Как я понимаю, что она будет использоваться нужно указать на этапе сборки самой библиотеки FLTK. Сам я Cairo никогда не пользовался.
Вложения
Тип файла: zip main.zip (3.0 Кб, 3 просмотров)
0
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
06.05.2019, 03:55  [ТС] 9
Цитата Сообщение от GoshaM Посмотреть сообщение
Можно и без WinAPI
В смысле GIMP, редактор что ли? А что за формат такой *.c - это как-то на расширение файла языка C похоже? Думал так же первоначально , но, только хотел это сделать без стороннего софта, так ничего путного и не вышло. С API, на мой взгляд, получилось куда элегантнее и короче.

Цитата Сообщение от GoshaM Посмотреть сообщение
Как я понимаю, что она будет использоваться нужно указать на этапе сборки самой библиотеки FLTK
То есть сейчас уже поздняк метаться, если FLTK скомпилирована и установлена, так? Странно, классы есть для работы с этой самой Cairo, а работать с ними нельзя... Ладно пока это не критично, а как их указать эти параметры при сборке, там при сборке нет каких-то параметров, которые можно задавать, просто кликаешь по файлу и всё собирается или не собирается. Может на виртуалке попробую установить FLTK с Cairo, только куда параметры вбивать ума не приложу.
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
06.05.2019, 10:14 10
Цитата Сообщение от Liss29 Посмотреть сообщение
В смысле GIMP, редактор что ли?
Да
Цитата Сообщение от Liss29 Посмотреть сообщение
А что за формат такой *.c - это как-то на расширение файла языка C похоже
Это он и есть.
Цитата Сообщение от Liss29 Посмотреть сообщение
С API, на мой взгляд, получилось куда элегантнее и короче.
Да, но платформозависимо. Структуры можно хранить в отдельных файлах и использовать, как глобальные или хранить на диске, а потом вычитывать.
Цитата Сообщение от Liss29 Посмотреть сообщение
только куда параметры вбивать ума не приложу.
См. скриншот из CMAKE и напрямую открытый проект студией. И саму библиотеку cairo наверное нужно скачать. Больше ничего не скажу, cairo не пользуюсь.
Миниатюры
FLTK сменить иконку окна  
Изображения
 
0
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
06.05.2019, 17:55  [ТС] 11
Цитата Сообщение от GoshaM Посмотреть сообщение
Структуры можно хранить в отдельных файлах и использовать, как глобальные или хранить на диске, а потом вычитывать.
Можно, но опять же, если бы не нужно было использовать сторонний софт, а ограничиться функционалом библиотеки, тогда почему бы и нет. А так, сначала в GIMP преобразовать файл из *.ico(кстати почему только этот формат) в формат *.c, затем добавить, я так понял, этот файл подключать к проекту или из этого файла извлечь некую информацию?? и только затем уже переходить к использованию библиотечных функций. Я хоть процесс правильно описал?

Цитата Сообщение от GoshaM Посмотреть сообщение
См. скриншот из CMAKE и напрямую открытый проект студией.
В файлах библиотеки этих Cmake-оф очень много, какой именно...

Цитата Сообщение от GoshaM Посмотреть сообщение
И саму библиотеку cairo наверное нужно скачать.
Это понятно. Столько гемороя, из=за одного примера

Добавлено через 11 минут
Судя по скрину studio у тебя всё установлено!
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
06.05.2019, 19:51 12
Цитата Сообщение от Liss29 Посмотреть сообщение
кстати почему только этот формат
Если формат GIMPом открывается, можно экспортировать. Может конечно есть заморочки с количеством каналов или размером, но это я думаю уже мелочи, можно и в самом GIMPe подправить.
Цитата Сообщение от Liss29 Посмотреть сообщение
или из этого файла извлечь некую информацию?
Нет. Вот эти структуры как есть и получаются прямо в файле *.c. Можно сразу эти файлы *.c добавлять в проект, без изменений.
Цитата Сообщение от Liss29 Посмотреть сообщение
В файлах библиотеки этих Cmake-оф очень много, какой именно...
CMAKE это система автоматизации сборки. Она ставится отдельно. Надо научиться ей пользоваться, она фактически стала стандартом. В любом случае пригодиться. И к документации к той же FLTK говорится что в следующих версиях сборка будет только через CMAKE.
Цитата Сообщение от Liss29 Посмотреть сообщение
Судя по скрину studio у тебя всё установлено!
Нет это просто я открыл *.sln из папки IDE. Без библиотеки cairo эта сборка не проходит.
0
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
06.05.2019, 21:54  [ТС] 13
Цитата Сообщение от GoshaM Посмотреть сообщение
Вот эти структуры как есть и получаются прямо в файле *.c. Можно сразу эти файлы *.c добавлять в проект, без изменений.
Понятно. Установлю GIMP, попробую. А разве в visual studio нет редактора, который работает с подобными ресурсами или функционал не тот?

Цитата Сообщение от GoshaM Посмотреть сообщение
CMAKE это система автоматизации сборки.
Если честно, то я с этим не сталкивался, так что для меня это белый лист.

Цитата Сообщение от GoshaM Посмотреть сообщение
Надо научиться ей пользоваться, она фактически стала стандартом.
Тут я спорить не стану, но пока что к этому не подобрался.
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
07.05.2019, 17:43 14
Цитата Сообщение от Liss29 Посмотреть сообщение
Установлю GIMP, попробую
В примерах к FLTK можно еще найти использование графических форматов (не для иконок, а вообще для растровой графики) *.xpm и *.xbm, в которые умеет экспортировать GIMP. Они легко подключаются через #include.
Цитата Сообщение от Liss29 Посмотреть сообщение
А разве в visual studio нет редактора, который работает с подобными ресурсами или функционал не тот?
Мы же с этого и начали, путь в windows (и студии в частности) это хранение иконок и изображений (и много еще чего) в файле *.rc. Встроенным в студию редактором можно рисовать иконки.
0
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
07.05.2019, 23:13  [ТС] 15
Цитата Сообщение от GoshaM Посмотреть сообщение
В примерах к FLTK можно еще найти использование графических форматов (не для иконок, а вообще для растровой графики) *.xpm и *.xbm,
Да, я их просматривал. Но, на тот момент, они мне ничем не помогли...

Цитата Сообщение от GoshaM Посмотреть сообщение
Мы же с этого и начали
Нет, я не о том, при добавление иконок через свойства ресурсов они открывались в редакторе студии это я знаю, я о том, неужели этот редактор не может преобразовать из допустим *.ico в какой-нибудь *.bmp не используя сторонних приложений... я не пробовал поэтому и спросил.

Ну и риторический вопрос, неужели разработчики библиотеки FLTK в данном случае не подумали о том, что кто-то создавая окна с помощью их библиотеки захочет изменить иконки в этом самом окне или в группе окон. Я к тому что возможно есть более простой способ установки иконки или на крайний случай преобразования иконки в массив с последующим выводом, через Fl_RGB_Image; win->icon(&array); Допустим так-то так:
C++
1
2
Fl_Image* data = new Fl_JPEG_Image("name_file"); 
uchar array = data->array();
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
08.05.2019, 03:32 16
Цитата Сообщение от Liss29 Посмотреть сообщение
неужели этот редактор не может преобразовать из допустим *.ico в какой-нибудь *.bmp не используя сторонних приложений...
Не понял зачем. К тому же в формате ico может храниться несколько изображений, а в bmp нет.
Цитата Сообщение от Liss29 Посмотреть сообщение
Я к тому что возможно есть более простой способ установки иконки или на крайний случай преобразования иконки в массив с последующим выводом, через Fl_RGB_Image;
Но ведь изображения придется отдельно прикладывать. А так конечно можно:
C++
1
2
3
4
#include <FL/Fl_BMP_Image.H>
...
Fl_BMP_Image bm("pict.bmp");
win->icon(&bm);
0
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
08.05.2019, 20:47  [ТС] 17
Цитата Сообщение от GoshaM Посмотреть сообщение
Не понял зачем.
Возможно и не за чем. Я полюбопытствовал предполагая, что ты знаешь, а если нет, тогда нет. Ещё зачем, ну хотя бы для того, чтобы это было возможно делать в среде программирования...

Цитата Сообщение от GoshaM Посмотреть сообщение
А так конечно можно:
Я здесь про *.bmp ничего не писал. массив uchar, полученный из Fl_Image, пихаем в объект Fl_RGB_Image и вуаля, как-то так.
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 342
11.05.2019, 13:17 18
Цитата Сообщение от Liss29 Посмотреть сообщение
Я здесь про *.bmp ничего не писал. массив uchar, полученный из Fl_Image, пихаем в объект Fl_RGB_Image и вуаля, как-то так.
C++
1
2
Fl_Image* data = new Fl_JPEG_Image("name_file");
Fl_RGB_Image* img = new Fl_RGB_Image(reinterpret_cast<const uchar*>(data->data()[0]),  data->w(), data->h());
Или может так подойдет:
C++
1
Fl_RGB_Image* img = new Fl_JPEG_Image("name_file");
0
223 / 37 / 4
Регистрация: 18.11.2012
Сообщений: 1,502
11.05.2019, 14:23  [ТС] 19
Цитата Сообщение от GoshaM Посмотреть сообщение
Fl_RGB_Image* img = new Fl_JPEG_Image("name_file");
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
Fl_RGB_Image* img = new Fl_JPEG_Image("D:\\conf.jpg");
        Fl_Double_Window* d_win = new Fl_Double_Window(400, 400, "Hi. window");
        d_win->begin();
        d_win->icon(img);
        d_win->end();
        d_win->show();
        Fl::run();

Такой код меняет иконку.

Это код тоже работает:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
Fl_Image* data = new Fl_JPEG_Image("D:\\conf.jpg");
        Fl_RGB_Image* img = new Fl_RGB_Image(reinterpret_cast<const uchar*>(data->data()[0]), data->w(), data->h());
        Fl_Double_Window* d_win = new Fl_Double_Window(400, 400, "Hi. window");
        d_win->begin();
        d_win->icon(img);
        d_win->end();
        d_win->show();
        Fl::run();


Правда с путями в кириллической кодировке проблемы, но это уже другой разговор.
0
11.05.2019, 14:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2019, 14:23
Помогаю со студенческими работами здесь

Как сменить иконку приложения?
Добавил в свой проект манифест. Теперь не могу изменить иконку приложения. В Project -&gt; Options -&gt;...

Как сменить иконку приложения?
Как поменять иконку исполняемого файла (.app)? Программирую под Mac OS в IDEA. Вот моя программа:...

Как сменить иконку в JFrame?
Вот собственно и весь вопрос.

Подскажите как сменить иконку expandera?
или это не возможно?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru