Значок строки заголовка wxWidgets

Я хочу изменить значок по умолчанию, который отображается в верхнем левом углу кадра. Я испробовал множество подходов: xpm, ico, bmp, используя SetIcon(wxIcon(wxT("icon.xpm")));, как предложено здесь.
Я пробовал разные размеры значков: 16 x 16, 24 x 24 и 32 x 32.
Я также пытался добавить MYICON1 ICON "Logo.ico" в файл resource.rc, #define MYICON1 101 в файл resource.h и SetIcon(wxIcon(MYICON1)); в конструктор фреймов..
>
кстати, я использую wxwidgets 2.8 на Visual Studio 2010

РЕДАКТИРОВАТЬ:

Я также пытался добавить MYICON1 ICON "Logo.ico" в файл resource.rc, #define MYICON1 101 в файл resource.h и SetIcon(wxIcon(MYICON1)); в конструктор фреймов.

При таком подходе я получаю ошибку в конструкторе wxIcon(int).

1>xsframe.cpp(17): ошибка C2248: 'wxString::wxString': невозможно получить доступ к частному члену, объявленному в классе 'wxString'
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\ include\wx/string.h(682): см. объявление 'wxString::wxString'
1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\wx/string.h(659 ): см. объявление 'wxString'

PS, xsframe - мой основной фрейм. чей значок я пытаюсь изменить.


person Shashwat Black    schedule 03.03.2013    source источник


Ответы (5)


Я цитирую ответ Вацлава из здесь:

Вы можете установить значок основного фрейма с помощью wxFrame::SetIcon. Значок приложения можно изменить, добавив новый ресурс значка в ваш файл .rc:

appicon ICON "myapp.ico"
#include "wx/msw/wx.rc"

Обратите внимание, что этот значок должен быть первым значком в вашем файле .rc и он должен быть первым при сортировке значков в алфавитном порядке. Это связано с тем, что разработчики MS не смогли определиться, как определить иконку приложения: она первая в .rc-файле под Windows 9x и первая по алфавиту под NT (или наоборот).

Большинство людей обычно пропускают это. Надеюсь, это исправит ситуацию.

person Tamer    schedule 04.03.2013

SetIcon(wxICON(MYICON1));

в файле gdicmn.h, строка 166

/* Useful macro for creating icons portably, for example:

    wxIcon *icon = new wxICON(sample);

  expands into:

    wxIcon *icon = new wxIcon("sample");      // On Windows
    wxIcon *icon = new wxIcon(sample_xpm);    // On wxGTK/Linux
 */
person Kindesu    schedule 06.01.2014

Вы написали: MYICON1 ICON "Logo.ico" в файле resource.rc и SetIcon(wxIcon(MYICON1)); к конструктору рам

Именно такой подход я использую.

Есть дополнительный шаг, который вам нужно сделать. В файле resource.h вам нужно определить MYICON1 Примерно так:

#define MYICON1  101

Вы должны убедиться, что файл значка содержит ВСЕ необходимые разрешения - я всегда гарантирую, что он имеет 16x16, 32x32 И 256x256 Чем больше, тем лучше!

Это хорошая идея, если значок приложения является ПЕРВЫМ значком в файле ресурсов.

Рекомендую перейти на wxWidgets v2.9.4 - многое начинает работать лучше.

person ravenspoint    schedule 03.03.2013
comment
да, я забыл упомянуть об этом... я фактически определил MYICON1 в файле resource.h. Я получаю ошибку в функции seticon, в конструкторе wxIcon().. 1>xsframe.cpp(17): error C2248: 'wxString::wxString' : cannot access private member declared in class 'wxString' 1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\wx/string.h(682) : see declaration of 'wxString::wxString' 1> C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\wx/string.h(659) : see declaration of 'wxString' - person Shashwat Black; 03.03.2013
comment
Итак, что происходит в строке 17? Пожалуйста, публикуйте подробности без необходимости спрашивать на каждом этапе пути. - person ravenspoint; 04.03.2013
comment
в строке 17 есть SetIcon(wxIcon(MYICON1));, также я пробовал использовать logo.ico с другими размерами: 16 x 16, 32 x 32 и 256 x 256. но ясно, что проблема в вызове конструктора wxIcon(int). Я проверил заголовочный файл, и wxString(int); находится в приватном разделе. так как же получить к нему доступ? - person Shashwat Black; 04.03.2013
comment
Вы включаете все размеры значков в один и тот же файл ico? - person ravenspoint; 04.03.2013
comment
да. 3 значка в одном файле ico.. но проблема не в этом. я не понимаю, почему вызывается wxString(int). разве не должен быть перегруженный конструктор int для wxIcon?? - person Shashwat Black; 04.03.2013
comment
Ошибка строки возникает из-за того, что он видит MYICON1 как целое число из resource.h, и поэтому неявное преобразование int в строку запрещено. Это можно решить с помощью wxICON() // Обратите внимание на верхний регистр ICON. Этот wxICON является макросом - person Swtsvn; 19.09.2017

Используйте строковое имя значка, а не числовой идентификатор. Посмотрите на любой пример wxWidgets.

person VZ.    schedule 03.03.2013
comment
вы имеете в виду SetIcon(wxIcon(wxT("icon.xpm"))); правильно? я пробовал это.. не помогло... ошибок нет, но значок такой же по умолчанию.. и я не знаю, нужно ли это, но я также использовал wxInitializedAllImageHandlers() перед вызовом set icon.. не помогло.. это как-то связано с тем, что я запускаю его на Windows 8? - person Shashwat Black; 04.03.2013
comment
SetIcon() отлично работает в Windows 8. OTOH icon.xpm не является допустимым именем значка. Если вы используете XPM, вы должны использовать имя самой иконки для wxIcon ctor, например. icon_xpm (загляните в свой файл icon.xpm, чтобы убедиться). Но для значка приложения вы почти всегда будете использовать .ico, потому что он все равно должен быть в ваших ресурсах в формате ICO. В этом случае у вас есть foo ICON foo.ico в файле .rc, и вы должны использовать wxIcon("foo") в коде. - person VZ.; 04.03.2013
comment
Я пытался. и это тоже не сработало. в моем файле .rc у меня есть MYICON ICON "Logo2.ico", а в моем конструкторе фреймов SetIcon(wxIcon(_("MYICON1")));, однако .exe в папке выпуска действительно показывает значок (значок файла проводника). и он остается там, даже когда я удаляю seticon(). кажется, что просто наличие значка в файле .rc устанавливает значок приложения ... так что мне делать со значком в строке заголовка? - person Shashwat Black; 04.03.2013
comment
Вы сейчас говорите совсем о другой иконе... Пожалуйста, решитесь. Кроме того, использование MYICON в ресурсах и MYICON1 в вашем коде не помогает. Вы сбиты с толку, потому что пытаетесь сделать слишком много дел одновременно, успокойтесь, проверьте все еще раз, и все получится. - person VZ.; 04.03.2013
comment
извините за это .. я удалил все и начал заново .. сначала я добавил значок в файл ресурсов (открыл resource.rc в представлении ресурсов > щелкните правой кнопкой мыши > добавьте ресурс > значок > импорт > выберите logo.ico > откройте) Кстати, logo.ico имеет 3 значка: 16x16, 32x32 и 256x256. Это добавило IDI_ICON1 ICON "logo.ico" в мой файл resource.rc и #define IDI_ICON1 106 в мой файл resource.h. затем я открыл свой конструктор фреймов, добавил #include "resource.h" на эту страницу, а позже SetIcon(wxIcon(_("IDI_ICON1"))); в конструктор, прямо перед Centre(); где я ошибаюсь? - person Shashwat Black; 04.03.2013
comment
Вот мой полный resource.rc файл. И Вот файл resource.h. - person Shashwat Black; 04.03.2013
comment
Ваш значок на самом деле имеет идентификатор # 106, а не IDI_ICON1. Встроенный редактор ресурсов использует числовые идентификаторы, а затем определяет идентификаторы C++, соответствующие им, но они не являются реальными идентификаторами значков. Опять же, просто взгляните на файл sample.rc, включенный в wxWidgets и используемый во всех примерах, чтобы найти самый простой способ заставить его работать, вообще не беспокоясь о числовых идентификаторах. - person VZ.; 04.03.2013
comment
Большое вам спасибо, это сработало .. :) также я заработал, используя xpm (довольно просто, #include "logo.xpm", затем wxicon(logo_xpm)), но ico намного лучше. (альфа-канал и все) - person Shashwat Black; 04.03.2013

Быстрое и грязное, непереносимое решение только для Windows (у меня работало в Windows 7, wxWidgets 3.0.4, vc110):

#ifdef __WXMSW__
#include "wx/msw/private.h" //for wxGetInstance()
#endif
...

//in Frame's constructor:
HWND hWnd = this->GetHandle();
HINSTANCE hInstance = wxGetInstance();

HICON hIcon = ExtractIcon(hInstance, L"someicon.ico", 0);
SetClassLongPtr(hWnd, GCLP_HICONSM, (LONG_PTR)hIcon);

Может быть полезно для выполнения некоторых других трюков с окном?

person Jorge Trigona    schedule 27.05.2018