Как стать автором
Обновить

Комментарии 17

В конфигурации Release программа Tray.exe получилась размером 8 Кбайт.
Теперь запускаете depends.exe (есть в поставке со студией) и осознаёте, что тащите за собой msvcrt весом в пару метров.
Далее. C++ я тут не увидел, сишка и WinAPI как они есть. Об отсутствующей переносимости кода даже на Win8 можно даже не говорить.
Не могу не согласиться, но почему на Win8 нет переносимости? // в качестве шутки добавлю, что притянув с собой ~50мб wine, а на некоторых архитектурах и qemu, получим достаточно широкую переносимость.
Имеется ввиду новое API Win8, которое для WinRT. А qemu-user-i386 — не панацея.
Смех-смехом, а можно ли вывести значок в Ubuntu в верхней строке?
Для wine (и явы) всё ещё работает режим совместимости c треем X11, у нативного приложения есть 2 варианта:
1) быть написанным с использованием Qt, всё решится само собой ввижу наличия бакэнда к QSystemTrayIcon
2) использовать libappindicator по которому за два года так и не написали нормальной документации
Здесь нет ни одного вызова CRT-функций, только WinAPI. На всякий случай можно переключить в параметрах проекта на странице Code Generation параметр Runtime Library с «Multi-threaded DL (/MD)» на «Multi-threaded (/MT). Хотя в обоих вариантах запускается на чистой Windows 8.1 x64 Build 9431 и имеет одинаковый размер 8 Кбайт.
Хотя в обоих вариантах запускается на чистой Windows 8.1 x64 Build 9431
Теперь на RT-редакции на планшете, пожалуйста. Хинт: WinAPI использовать там нельзя.
ни одного вызова CRT-функций
Ну и зачем оно тогда? Весь проект писать на WinAPI, да ещё и не используя возможностей C++? Я пробовал (ну не было возможности подгрузить вместе со своей dll-кой нормально CRT в ядро WinCE той версии, там вообще LoadKernelLibrary умела грузить только dll-ки без таблицы импорта), получается плохо. Признайтесь, вы студент-второго-курса-максималист, да?
А неименованные аргумены разве не в С++ появились? Я использовал те возможности С++, которые мне были нужны.
Это не C++, это «прокачаный» С. Как пишут даже мелкомягкие «Many developers use the C++ compiler as a “super-C” without using the full C++ language». Именно ваш случай. Выглядит примерно как написание программы на Java/C# целиком состоящей из статических классов, т. е. убого.
Уговорили, делаем класс SystemServices c абстрактным методом FileExists(). Для винды будет потомок, а для других ОС в перспективе реализации.
Не «прокачаный», а урезанный. Ибо самое популярное действие при работе с WinAPI — заполнение структур. А именованное обращение к полям в C++ обратно-несовместимо убрано:
{ .cbSize = sizeof(NOTIFYICONDATA), .hWnd = window };

Кстати, сразу не сообразил. Еще есть обнуление структуры в объявлении, так что никакого С.
На WinRT на сколько я знаю, доступ к трею закрыт для сторонних разработчиков, так как в окружении десктопа могут быть запущены только приложения подписанные MS. Хотя Win32 API в системе присутствует.
Ну не С++, но причем тут переносимость на WinRT…
Программу нужно срочно рефакторить для раскрытия всей мощи С++! Вот примерный список классов:
MessageBox — вывод диалога;
Application — содержит главный message-loop;
Window — регистрирует класс окна, создает окно, содержит описатель и список контролов;
DummyWindow — потомок Window в случаях, когда окно не отображается;
Control — абстрактный класс для включения в Window и подписки на события;
Event — событие, на которое можно подписаться (абстрактный класс);
WindowDestroyEvent — событие завершения работы;
FileSystem — абстрактный класс для метода FileExists();
Win32FileSystem — потомок FileSystem для Win32;
Icon — содержит описатель значка и функцию LoadIcon();
TrayIcon — потомок Control, абстрактный класс для работы с треем;
TrayIconEvent — событие от значка (абстрактный класс);
TrayIconRightButtonClick — событие нажатия правой кнопки мыши;
Win32TrayIcon — потомок TrayIcon, инкапсулирует NOTIFYICONDATA и вызов Shell_NotifyIcon();
WinRTTrayIcon — потомок TrayIcon в перспективе развития программы;
TimerEvent — событие срабатывания таймера;
Timer — потомок Control c методом SetTimer() и абстрактным методом OnTimer();
WorkTimer — потомок Timer с перекрытым методом OnTimer(), выполняющий проверку.
Trigger — хранит состояние, выведенное в значке;
FileTrigger — потомок Trigger, срабатывает на появление файла;
DiskTrigger — потомок Trigger, срабатывает на подключение диска.
Откройте для себя WTL уже. Половина списка уже сделана за вас, и, внезапно, всё на чистом винапи. Я когда-то писал тут цикл статей об использовании этой штуки применительно к WinMobile, но НЛО забанило тот аккаунт.
Из Фреймворков мне больше всех нравится WinForms. У программки из этого поста была первая версия на C# семь лет назад. Когда я устроился в известную IT-фирму, одна вещь меня стала отвлекать от работы. Клиент внутренней почты надо было постоянно держать открытым, чтобы не пропустить новое письмо. По сравнению с Outlook это было мучением. А начальник очень огорчался, когда его письмо не читали. Пришлось подойти творчески.
Утилита проверяла время изменения файла входящих сообщений и при помощи класса NotifyIcon выводился красивый мигающий конвертик. Левый щелчок мыши останавливал мигание и открывал почтовый клиент.
В этой версии хотелось пойти в направлении Going Native. Ведь к WinRT можно подойти двумя разными путями. .NET Framework, к сожалению, опять остается поверх. Лучше уж C++/CX.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации