Перейти к содержанию

Antonshka

Пользователи+
  • Постов

    410
  • Зарегистрирован

  • Посещение

  • Победитель дней

    16

Antonshka стал победителем дня 4 января 2023

Antonshka имел наиболее популярный контент!

Репутация

49 Rookie

Информация о Antonshka

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Не знаю, хорошо ли это, писать сейчас на форуме. Ведь форум сейчас на компьютере у @Xipho, плюс никто не пишет ничего чего-то, плюс форум как я понял будет скоро закрыт. Однако, напишу все же, раз тему завел. Да простят меня все. Я лишь хотел сказать, что я закончил с этой таблицей акселератора. И для тех кому интересно, реализовал я ее так. Это пример того как создается главное окно, создается меню, назначаются горячие клавиши. Это главный messageLoop Это translateAccelerator А это классы для работы самодельного аккселератора. Кое-какой функционал будет еще добавлен для них. Keystroke.h И Keystroke.cpp
  2. Antonshka

    Custom Keyboard Accelerators

    Привет, с наступившим Новый Годом🌲! Хорошо его провести. Кто-нибудь игрался с самодельной таблицей акселераторов? Как известно, стандартная WinAPI таблица акселераторов поддерживает только одну нажатую клавишу, совместно с SHIFT, CONTROL, или ALT. Например, позволено делать только так, - "SHIFT + ALT + M", или "ALT + G". Но что если нужно так, "SHIFT + ALT + M + A + T"? У меня дело дошло до горячих клавиш для пунктов меню. Текст то выводится, а про саму реализацию клавиш я и забыл. Сейчас думаю как реализовать самодельную таблицу. В основном цикле сообщений будет своя функция translateAccelerator Далее, в этой функции (translateAccelerator), нужно сделать обход по всем виджетам. Для тех виджетов, чей список горячих клавиш непустой, сделать проверку, на совпадение. Список горячих клавиш думаю будет таким - Если проверка на совпадение покажет, что такие клавиши для этого виджета установленны, то будет послано сообщение, этому виджету - Осталось придумать как эффективнее проверять клавиши. Как вообще отслеживать последовательность нажатых клавиш.
  3. С наступающим Новым Годом всеееех!
  4. Стимул обычно увеличивается словами поддержки. Например, - "потерпи, со временем ты это освоишь, и я проходил через подобные трудности". Слова же, - " возможно, это не твое, ведь слесарю слесарево", как бы дают понять, - "возможно, твой ум не в состоянии постичь такое, возможно, тебе не стоит этим заниматься". Такие слова только уменьшают стимул. Не видишь ли недоброжелательность, вместо увеличения стимула, уменьшать его? Но, как я уже сказал, на меня эти слова не подействовали. Я уже не новичок, - путь определенный я уже проделал, и способности свои я уже узнал. Вопрос к нему был не про положительную сторону.
  5. Как я вижу, @Alex2411 не чернит ресурс, но говорит по факту. Ему @Xipho задал конкретный вопрос, он дал ему конкретный ответ. Указал на недоброжелательность. Такую недоброжелательность я лично ощутил и на себе. Правда лично меня эти слова никак не задели. К моему удивлению. Недоброжелательность на форуме была, этот факт. Недоброжелательность не способствует развитию форума, это тоже факт. @Alex2411 просто указал на эти факты. А что касается доброжелательности, и пользы от форума, - ее конечно было несказанно больше. Я не думаю что активность форума мала из-за недоброжелательности. Она была крайне редка. В сравнении с доброжелательностью.
  6. Может быть тебе это не доставляет удовольствие. Может быть дело вовсе не в отсутствии времени. Есть уникальная по своей силе фраза "Кто хочет, ищет возможности, кто не хочет, ищет причины". Лучше этой "лакмусовой бумажки" я ничего еще не встречал. Она раскрывает истинные намерения человека на 200 процентов. Раскрывает всегда. Если человек говорит тебе слова оправдания, вместо того чтобы заботиться о поиске путей решения, - значит ему этого просто не хочется. Ему это не доставляет удовольствие. Человек не делает того, что ему не доставляет удовольствие. И чтобы не обидеть другого человека, или по какой иной причине, он, вместо признании в этом, признании в отсутствии хотения, говорит как-бы уклончиво. Активности на форуме практически нет, естественно это должно доставлять автору некоторые неудовольствия. Умножим это на то, что такое положение вещей наблюдается уже в течении 10 лет. Итак, человек, который поставил мне недоумевающий смайлик, в сообщении о поддержке закрытии форума? Чего тебе не понравилось? Не хочет @Xipho получать неудовольствие, хочет получать удовольствие. Я его в этом поддержал. За что такой смайлик? За то ли, что для тебя закрытие форума не выгодно? Впрочем, не важно, за что такой смайлик. @Xipho человек взрослый, решение свое он обдумал. Я поступил бы также как он, я пошел бы тратить свое время в пользу своего удовольствия.
  7. Я поддерживаю. Форум нужно закрывать. Общаются в основном всего несколько человек. Их можно сосчитать по пальцам. Я рад, что @Xipho решился на это! Не подумайте, что я против форума. Я за появление свободного времени у @Xipho.
  8. Идея с std::unordered_map простая. Все объекты PopupMenu хранятся в unordered_map. У каждого объекта PopupMenu есть специальное поле, которое есть его ключ в unordered_map. Этот ключ уникальный, его тип INT. Указатель же на сам объект хранится как значение в unordered_map. То есть, unordered_map(Key, Value) = unordered_map(INT, PopupMenu*) При сохранении объектов из unordered_map в файл на диск, сохраняется также и это поле-ключ, у каждого объекта. При следующем запуске приложения, значение Value(PopupMenu*) уже будет другое, но ключ будет тот-же самый. Поэтому при считывании файла, нужно будет только сверить ключи. Посмотрю про protobuf. Интересно, что это. Спасибо. Архитектура библиотеки со дня ее создания почти не изменилась. Она меня устраивает. Большой и постоянный рефакторинг основан на постоянном увеличении опыта и знаний. А также и идей. Конечно, было бы интересно посмотреть как пишут программы специалисты, поучиться у них. Кое-какой план все же есть. У меня есть блокнот, в котором я пишу задания. Например, - сделать нужно то-то и то-то, это нужно удалить, это добавить, над этим подумать.
  9. Что-то @Xipho не ответил. Возможно времени нет у него. В любом случае, с сериализацией/десериализацией я закончил. Основа этого дела, это использование std::unordered_map. Ключ используется для выбора правильного объекта. Строки сохраняются в файл на диск так, - сперва сохраняется длина строки, затем ее содержимое. При считывании строки с файла на диске, сперва считывается длина строки, затем идет проверка этой длины на ноль, затем, если длина не равна нолю, считывается содержимое строки. Буфер для строки нужно предварительно увеличить. Теперь можно заняться улучшайзенгом кода. Превращением его из каши во что-то более понятное. А то @Xipho, увидев его, потеряет сознание. Прошел год, (365 дней), а я написал только PopupMenu, MainMenu, ToolTip, и TitleBar (в форме кода-каши). Ай да молодец я.
  10. Везде говорят про 4096 байта. У тебя нет ссылки на это стандарт?
  11. Что если поле класса std::wstring? Плюс этот странный sizeof. Такое странное поведение sizeof основано на Data structure alignment.
  12. Менять весь интерфейс запущенного приложения конечно захочет не каждый. Это на выбор, при активированном режиме.
  13. Появилась хорошая идея, как сохранить/восстановить объекты PopupMenu. Раньше PopupMenu назначалось контроллу по указателю. Теперь будет так
  14. Представь себе главное меню какого-либо приложения. Первый элемент такого меню обычно называется Файл. Нажимая на него, появляется PopupMenu. В этом PopupMenu обычно следующие названия пунктов, - Открыть, Сохранить, Сохранить как, Выход, и т.п. Пункт Открыть вызывает к примеру функцию VOID Open(), - так предусмотрел разработчик. Однако, пользователь, по желанию разработчика, может активировать режим модификации. Он, пользователь, включив такой режим, открывает этот PopupMenu, где Открыть, Сохранить, Сохранить как, Выход, затем, кликает по нему правой кнопкой мыши, перед ним появляется другое PopupMenu, над этим PopupMenu. Это второе PopupMenu, имеет пункты со следующими названиями, - Изменить название пункта, Изменить опцию пункта (то есть функцию), и другие. Выбрав Изменить опцию пункта, появляется окно со списком (ListView например, или TreeView). В нем перечислены все (дозволенные) существующие опции/функции, одну из которых можно назначить на этот пункт. Например, есть функция VOID SaveAs() для пункта Сохранить как. Пользователь может выбрать ее из списка и назначить на пункт Выход. Это просто пример. Так вот, текущая задача, - это сериализация/десериализация этого указателя на функцию VOID SaveAs(). Так чтобы она теперь была для пункта Выход. Даже после перезапуска приложения. Частично это задача теперь уже решена, если даже не полностью - Это поле класса PopupMenu. inline static std::map<std::wstring, OnClickForItemOfPopupMenu> userClickFunctionsForItems; Разработчик заполняет этот std::map, определяя тем самым для пользователя допустимые варианты выбора опций. WGW::PopupMenu::userClickFunctionsForItems.insert(std::make_pair(L"Открыть", open)); //open, это указатель на VOID open() WGW::PopupMenu::userClickFunctionsForItems.insert(std::make_pair(L"Параметры", showParameters)); //showParameters, это указатель на VOID showParameters() WGW::PopupMenu::userClickFunctionsForItems.insert(std::make_pair(L"Копировать", copy)); //copy, это указатель на VOID copy() Пользователь, в ListView контролле, выбирает либо Открыть, либо Параметры, либо Копировать. Выбрав например Параметры, это слово сохраняется в поле userItemClickFunction класса Item. Все, переназначение опции/функции для конкретно этого пункта совершено. Новая функция вызовется через следующее выражение одного их методов класса PopupMenu, при клике по пункту. userClickFunctionsForItems.at(item->originalItem->userItemClickFunction)(&onClickEventForItemOfPopupMenu); item->originalItem->userItemClickFunction //userItemClickFunction это std::wstring равное Открыть, Параметры, или Копировать, смотря что выбрал пользователь. Это дело с указателем сейчас работает нормально. Для сериализации/десериализации нужно по идее просто сохранить/восстановить это поле со строкой - userItemClickFunction класса Item. Сейчас нужно придумать сохранение/восстановление объектов PopupMenu. Плюс их правильное назначение для контроллов, после восстановления.
  15. Я вернулся к написанию библиотеки GUI. Казалось бы, самодельная система PopupMenu уже закончена, но нет, мне пришла странная идея сделать её лучше чем в QT, - больше функционала, больше гибкости. PopupMenu на любой вкус и цвет. Причем для этого абсолютно не придется менять что-то в классе, - меняй только открытые свойства. И это идея удалась, - благодаря всем нам конечно. Система PopupPenu, а с ней и система MainMenu, получились ну реально крутые. Дело дошло до того, что была организована интерактивная замена PopupMenu'ек и их итемов в режиме реального времени. Как например в FireFox, когда можно мышкой ухватить итем какой-либо закладки в PopupMenu, и перетащить в другой PopupMenu. Причем создается такое окно-отрывок (snippet), с итемом на нем. Конечный пользователь может сам создать новое PopuMenu, новый итем. Также пользователь может изменить Click-функцию для итема, например выбрав из выпадающего списка нужную опцию, нужную функцию для этого конкретного итема. Говоря короче, конечный пользователь (здесь это тот кто запустит уже готовый exe) может сам настроить под себя всю систему MainMenu и PopupMenu, - если разработчик позволит ему так делать, например добавив чек-бокс, для активации режима модификации. Для сохранения всех переделок, сделанных конечным пользователем, нужна сериализация/десериализация. Я поторопился, - интерактивная система была создана раньше системы сериализации. Хотя, когда только все начиналось, какое-то представления, как эту сериализацию потом организовать, у меня все-таки было. Но сейчас, я не могу вспомнить, что я там напланировал. В любом случае, рано или поздно, эта система сериализации будет создана.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.