Как нарисовать окно на компьютере

Обновлено: 07.07.2024

Решал интересную задачу – сделать визуальный редактор-конфигуратор окон.

Подробностями процесса разработки я с вами, коллеги, и поделюсь.


UPD. Добавил скриншоты.
UPD2. Речь идет об окнах оффлайновых, застекленных, деревянных или пластиковых — через которые на улицу из дома смотрят

Спасибо за отклики!

1. Это модуль для сайта, который должен работать в произвольных популярных кейсах.
2. В режиме редактирования программа должна позволять указывать количество и расположение проемов в окнах.
3. В режиме редактирования программа должна позволять указывать способ открывания проемов в окнах, пять вариантов: нет открывания, налево, направо, налево и откидывается, направо и откидывается.
4. В режиме отображения программа должна картинкой в произвольном масштабе отображать конфигурацию окна.
5. Не нужно хранить и работать со сведениями о размере, пропорциях, цвете и других характеристиках окна. Картинки должны быть цветными и понятными. ЕСКД в данном случае не при делах.
6. Не должно глючить, тупить, должно быть кроссбраузерно, должно работать на в браузерах планшетных ПК и на смартфонах и т.д.

На этом этапе мы совместно с заказчиком поиском по картинкам Google просматриваем интерфейс аналогичных продуктов. Поиском по сайтам находим продавцов окон, и посещаем десяток сайтов, чтобы посмотреть на интерфейс онлайн-конфигураторов и вообще ассортимент конфигураций окон. Обсуждаем, что у нас должно быть, и чего, быть не должно.

Теперь дополняем бизнес-требования техническими условиями, для того, чтобы в итоге сформировать техническое задание.
1. Изходя из требования произвольного масштабирования – возникает понимание, что графика должна быть векторной. Кроссбраузерное решение, которое удовлетворит – HTML5 canvas.
2. Очевидно, должно быть два режима: режим редактирования и режим отображения.
3. В режиме редактирования данные должны сохраняться в input type=hidden. Я не буду вносить изменений в CMS – зачем мне лишние головняки? Просто добавлю одно поле в формы для добавления и редактирования, в СУБД и в соответствующие модели (у меня реально это происходит одним действием, если у вас нет – вероятно имеет смысл пересмотреть структуру программы).
4. В режиме редактирования ранее созданная визуальная конфигурация окна должна восстанавливаться из данных, находящихся и подставленных автоматически в поле input type=hidden.
5. В режиме отображения CMSка отдаст данные, как свойство какого-нибудь div, и моя программа должна эти данные: а) обнаружить, б) нарисовать по ним окно.
В данном случае спецификацию я делать не буду, а пойду по пути наименьшего сопротивления. Хорошая часть видения решения присутствует уже на данный момент, поэтому я начну реализацию немедленно.

Суровая программисткая реальность: не хочу усложнять себе жизнь, и поэтому изначально создаю масштабируемые и сопровождаемые решения. Поэтому DRY, поэтому абстракции и слои – сразу, по умолчанию.

Когда просматривал разновидности окон, зарисовал в тетрадке карандашом небольшой каталог, чтобы понять, что предстоит рисовать. Когда я делал эти зарисовки, пришло понимание, что я не хочу делать это на CSS (вероятно зря), и продолжать работать с <canvas />.
Иду искать библиотеку для работы с canvas. Нахожу calebevans.me/projects/jcanvas, бегло просматриваю документацию, оцениваю качество исходников и понимаю, что это то, что мне нужно сейчас.
Понимаю, что рисование будет самой низкоуровневой функцией. И вообще, давно хочется порисовать. Пробую несколько функций по документации, нахожу примеры онлайн в песочнице. Все работает, все устраивает.

Создам функцию-основу для рисования окна.

Естественно, функции не хранят параметры (это называется данными). Внутри функций – переменные.
В тот момент совесть не просыпалась, поэтому они в глобальной области видимости. Если она проснется – просто положу все в класс. Если проснется одновременно с ленью (или здравым смыслом) – буду писать на CoffeeScript. Сейчас звезды встали в определенное положение, и есть некоторое понимание того, что конечный продукт будет маленькой программой, состоящей из десятка фунций jQuery, в связи с чем целесообразность подобных действий в настоящий момент просто не рассматривается. Сначала сделать, чтобы работало. Рефакторинг – потом.
Глядя на свои зарисовки, вижу, что я могу рисовать оконные проемы, как прямоугольники, и обозначать открывание с помощью ровных ломаных линий внутри них.

Теперь – линии, обозначающие открывание. Left — налево, right – направо, tilt – откидывание. Кейса с фрамугой вниз нет (переспрашивал, когда интервьюировал заказчика), поэтому и заморачиваться сейчас не буду. Если возникнет потребность – потом можно будет легко его добавить.


Пишу несколько очень быстрых тестов, чтобы попробовать это. Все работает, поэтому перехожу дальше.

Собственно, по конфигурации проемов все окна можно поделить на “вертикальные” (как обычно делают в квартирах), Т-образные. Реже встречаются “горизонтальные” — в подъездах и в учреждениях.
Сначала нарисую что-нибудь попроще. Параметр leafs – количество проемов.


Посредством небольшой отладки и серии мелких тестов привожу функцию в рабочий вид.
Руками передаю параметры и вызываю функции, рисующие открывание – для того, чтобы сверху отображались ломанные линии.
Поворачиваю на 90 градусов, и получаю “горизонтальное” окно.


Тестирую, добиваюсь работоспособности.
Красивая пропорция – 1 к 2. Так как в бизнес-требованиях есть указание не заморачиваться с пропорциями, для Т-образного окна сделаю вот такой дизайн.


Делаю тесты, заставляю все работать ровно, без рывков.

Нарисую все виды окон, с которыми должна работать программа.

Седьмой параметр и понимание его содержание добавились позднее. Просто не обращайте на него внимание сейчас.
И добавлю в функцию, ответственные за рисование створки окна, коллбек на клик. Промежуточная версия кода не сохранилась – взяв хороший разгон, я позабыл делать частые комиты, поэтому покажу окончательную версию.

И функция, которая ловит клик по створке большого окна или маленькому окну в каталоге.

Была мысль сделать раздельные коллбеки, но в процессе причин для совершения лишней работы не нашел.
Добавил функцию-диспетчер, для удобства.

Открывание створок будет переключаться щелчком. Что может быть проще?
Сохраню в массиве список створок, и определю во втором массиве возможности по их открыванию.

Заполню массив данными по умолчанию. Не лучший вариант, но на момент написания думал о другом – о вероятном сохранении данных.


По щелчку должно меняться открывание створки. В цикле по возможностям открывания: нет, налево, направо, налево и откидывается, направо и откидывается.


И тут же, не уходя далеко…

Данные после редактирования нужно сохранять.
Сделаю сериализацию от руки.


И, теперь никто не мешает рисовать окна из сохраненных данных.

Конфигурация окон может отрисовываться в списках заказов, это очень удобно. Маленькие картинки.

Программа должна каким-то образом понимать, что настало время рисовать окна.
Исходя из ТЗ, есть два варианта – поле формы и <div /> в произвольном месте.


Пожалуй, input[name=«window_type»] – не лучшее решение. Просто на этот момент у меня была цель запустить программу в работу, и я совсем не хотел модифицировать CMSку — поэтому обучил плагин искать свое поле по его имени: windows_type.

Если делать из этой программы библиотеку, нужно положить селектор в переменную. И обязательно завернуть это в класс, чтобы закрыть пространство имен, и т.д.

Вот переработанный код целиком. Это бета, и она же пошла в продакшн без изменений.


Что не показано в статье. Функция windows_handler запускается другим JS-компонентом, по двум событиям: document.ready и успешной загрузке аяксовых данных. Таким образом, окна отрисовываются немедленно после загрузки страницы, и перерисовываются, если происходит интерактивное обновление данных (“живой режим”).
Все юзкейсы выполняются. Сделал простой тест с большим количеством перерисовываний без перезагрузок, оставил машину с запущенными хромом и мозилой на некоторое время – память не жрется. Погонял этот же тест несколько часов в хроме и в сафари на айпаде и макбуке. Проблем не обнаружено.


Маленькая картинка, создается на клиенте на лету (распечатывается великолепно)


В режиме редактирования. Щелчок на маленькое окошко в каталоге изменяет конфигурацию большого (и сразу же данные в input type=hidden).


Щелчок на створку большого окна изменяет открывание створки.

Изменений в CMS не было. Окно добавляется и редактируется в скрытом поле, отрисовывается в div. Получается, что конфигуратор окон можно засунуть в произвольный вордпресс — просто подключив этот скрипт.

В настоящий момент благодаря этому решению продано, заказано и установлено уже очень много новых окон.

Хорошо бы засунуть этот код в какую-нибудь песочницу, вместе с тестами. Как вы считаете?

Меню пера в Windows 11 упрощает доступ к избранным приложениям.

Показать меню пера

Если у вас есть перо, коснитесь его на экране. Меню пера появится в углу панели задач.

Добавление и удаление ярлыков

В меню пера можно добавить до четырех приложений. Вот как это сделать.

Коснитесь экрана с помощью пера или выберите меню пера в углу панели задач.

Когда появится меню пера, выберите Параметры меню Изменить перо.

Выберите Добавить, чтобы добавить приложения в меню пера.

Если вы хотите удалить приложения из меню пера, выберите Удалить.

Совместное работа в доске

Доска — это интеллектуальное интеллектуальное полотно с свободной формы для идей, создания и совместной работы в режиме реального времени. Чтобы начать работу, вы можете рисовать, ввести и добавлять изображения, просто во внимание, с помощью учетной записи Майкрософт.

Снимки экрана с помощью инструмента "Snipping"

Откройте инструмент "Snipping", чтобы делать снимки экрана и рисовать на том, что вы делаете на компьютере.

Ссылки по теме

Поделитесь своими идеями или рисуйте на снимках экрана с помощью пера в Windows Ink Workspace.

Меню Windows Ink Workspace "Доска" и "Фрагмент & наброска"

Примечание: Предыдущий Windows Ink Workspace в Записки и Sketchpad. Вы по-прежнему Записки, чтобы запишите напоминания или запишите свои идеи. Чтобы получить доступ Записки см. Записки. Альбом доступен только в более старых версиях Windows.

Выберите Windows Ink Workspace на панели задач, чтобы открыть его. Здесь можно выбрать Доска илиПолноэкранный фрагмент. (Вы также можете выбрать Дополнительные параметры и Подробнее о пере или получить доступ к настройкам пера.)

Совет: Один раз нажмите верхнюю кнопку на ручке, чтобы быстро открыть Доска (Майкрософт), или дважды нажмите ее, чтобы открыть & набросок фрагмента. Если ярлык пера не работает, возможно, его необходимо совметь в Параметры. Дополнительные Подключение Bluetooth на других устройствах.

Совместное работа в доске

Доска предоставляет группам свободное и интеллектуальное полотно для идей, создания и совместной работы в режиме реального времени при входе в учетную запись Майкрософт. Рисуйте, введите или добавьте изображения. Перемещайте их по стопке вверх. Выберите инструмент для письма, включая перо или выделение. Меняйте размер штрихов кисти во время рисования. Если рисунок получился неудачным, воспользуйтесь стирательными резинками.

Приложение "Доска" с примечаниями

После этого сеансы мозгового штурма автоматически сохраняются в Microsoft Cloud, так что вы сможете пристать к нужному месту.

Добавление примечаний к снимкам экрана с помощью приложения "Набросок на фрагменте экрана"

Совет: Чтобы определить, что происходит при нажатии кнопки на пере, перейдите в Параметры > Устройства > Перо & Windows Ink и прокрутите страницу вниз до кнопки "Сочетания клавиш", чтобы настроить ее функции.

К основным типам графики, которые можно использовать в документах Word, относятся объекты-рисунки, графические объекты SmartArt, диаграммы, изображения и картинки. Рисунками называются объекты-рисунки или их группы.

Объекты-рисунки включают в себя фигуры, диаграммы, блок-схемы, кривые и прямые линии, а также объекты WordArt. Эти объекты являются частью документа Word. Вы можете изменять цвета, узоры, границы и другие эффекты этих объектов.

Примечание: Больше не нужно вставлять полотно для работы с объектами-рисунками в Word. Однако вы можете использовать полотно в качестве организационной помощи при работе с несколькими объектами-рисунками или при добавлении соединители между фигурами. Чтобы вставить полотно, на вкладке Вставка нажмите кнопку Фигурыи выберите новое полотно.

В этой статье

Добавление рисунка в документ

Щелкните в том месте документа, где вы хотите создать рисунок.

На вкладке Вставка в группе элементов Иллюстрации нажмите кнопку Фигуры.

При вставке полотна появляется вкладка Формат, на которой можно:

Вставить фигуру. На вкладке Формат в группе Вставка фигур выберите фигуру и щелкните в нужном месте документа.

Изменить фигуру. Щелкните фигуру, которую вы хотите изменить. На вкладке Формат в группе Вставка фигур нажмите кнопку Изменить фигуру, выберите Изменить фигуру и щелкните новую фигуру.

Добавить текст в фигуру. Щелкните фигуру и введите текст.

Сгруппировать выделенные фигуры. Чтобы выделить несколько фигур одновременно, щелкните их, удерживая нажатой клавишу CTRL. На вкладке Формат в группе Упорядочить щелкните Группировать, чтобы все фигуры рассматривались как один объект.

Рисовать в документе. На вкладке Формат в группе Вставка фигур разверните список фигур, щелкнув стрелку. В разделе Линии щелкните Полилиния или Рисованная кривая.

Совет: Прервать рисование с помощью линий типа "Полилиния" или "Рисованная кривая" можно двойным щелчком мыши.

Изменить размер фигур. Выделите фигуры, размер которых вы хотите изменить. На вкладке Формат в группе Размер выберите с помощью стрелок или введите значения в полях Высота и Ширина.

Применить стиль к фигуре. Наведите указатель мыши на стиль в группе Стили фигур, чтобы увидеть, как будет выглядеть фигура, если применить к ней этот стиль. Щелкните стиль, чтобы применить его. Кроме того, можно выбрать нужные параметры, нажав кнопку Заливка фигуры или Контур фигуры.

Команды раздела "Стили фигур" на ленте

Примечание: Если вы хотите использовать цвет или градиент, которые недоступны в группе Стили фигур, сначала подберите цвет, а затем примените градиент.

Добавление flow charts with connectors. Перед созданием потоковой диаграммы добавьте полотно. Для этого на вкладке Вставка в группе Иллюстрации нажмите кнопку Фигуры и выберите создать полотно. На вкладке Формат в группе Вставка фигур щелкните фигуру Flow Chart. В областиЛинии выберите соединители, такие как Кривая стрелка.

Использовать затенение и объемные эффекты, чтобы сделать фигуры на рисунке более привлекательными. На вкладке Формат в группе Стили фигур щелкните Эффекты фигур, а затем выберите эффект.

Выровнять объекты на полотне. Чтобы выровнять объекты, нажмите и удерживайте клавишу CTRL, выделяя при этом объекты. На вкладке Формат в группе Упорядочить щелкните Выровнять и выберите одну из команд выравнивания.

Удаление всего рисунка или его части

Выделите объект-рисунок, который вы хотите удалить.

Нажмите клавишу DELETE.

Дополнительные сведения

В этой статье

Добавление рисунка в документ

Щелкните в том месте документа, где вы хотите создать рисунок.

На вкладке Вставка в группе элементов Иллюстрации нажмите кнопку Фигуры.

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

При вставке полотна появляется вкладка Формат, на которой можно:

Вставить фигуру. На вкладке Формат в группе Вставка фигур выберите фигуру и щелкните в нужном месте документа.

Изменить фигуру. Щелкните фигуру, которую вы хотите изменить. На вкладке Формат в группе Стили фигур нажмите кнопку Изменитьфигуру и выберите другую фигуру.

Добавление текста в фигуру. Щелкните фигуру правой кнопкой мыши, выберите добавить тексти введите текст.

Сгруппировать выделенные фигуры. Чтобы выделить несколько фигур одновременно, щелкните их, удерживая нажатой клавишу CTRL. На вкладке Формат в группе Упорядочить щелкните Группировать, чтобы все фигуры рассматривались как один объект.

Рисовать в документе. На вкладке Формат в группе Вставка фигур разверните список фигур, щелкнув стрелку. В разделе Линии щелкните Полилиния или Рисованная кривая.

Изменить размер фигур. Выделите фигуры, размер которых вы хотите изменить. На вкладке Формат в группе Размер щелкните стрелки или введите новые размеры в поля Высота фигуры и Ширина фигуры.

Применить стиль к фигуре. Наведите указатель мыши на стиль в группе Стили фигур, чтобы увидеть, как будет выглядеть фигура, если применить к ней этот стиль. Щелкните стиль, чтобы применить его. Кроме того, можно выбрать нужные параметры, нажав кнопку Заливка фигуры или Контур фигуры.

Примечание: Если вы хотите использовать цвет или градиент, которые недоступны в группе Стили фигур, сначала подберите цвет, а затем примените градиент.

Добавление flow charts with connectors. Перед созданием потоковой диаграммы добавьте полотно. Для этого на вкладке Вставка в группе Иллюстрации нажмите кнопку Фигуры и выберите создать полотно. На вкладке Формат в группе Вставка фигур щелкните фигуру Flow Chart. В областиЛинии выберите соединители, такие как Кривая стрелка.

Чтобы сделать фигуры в рисунке более эффектными, используйте тень и объемные эффекты. На вкладке Формат выберите один из вариантов в группе Эффекты тени или Трехуголовые эффекты.

Выровнять объекты на полотне. Чтобы выровнять объекты, нажмите и удерживайте клавишу CTRL, выделяя при этом объекты. На вкладке Формат в группе Упорядочить щелкните Выровнять и выберите одну из команд выравнивания.

Как в C/C++ нарисовать свое окно , что бы задать самому перетаскивание , сворачивание , закрытие ? Какой самый хардкорный способ? Одним словом полностью создать окно с нуля.
Спасибо откликнувшимся.

  • Вопрос задан более трёх лет назад
  • 2271 просмотр

gbg

Никак. Вы до графики без WinApi не доберетесь, даже если будете писать свой драйвер.

Без WinAPI в винде вы даже чихнуть не сможете. А в линуксе - без ее API и так везде. Если вы пишите программу для какой-то ОС то должны придерживаться правил и рамок, которые налагает эта ОС, т.е. использовать ее API.
Перехватывайте соответствующие события и реализуйте их обработчики так как считаете нужным. Но это все в пределах WinAPI.

TrueBers

Можете свою оболочку explorer написать на OpenGL или DirectX, например. А лучше, идите работать, вас там займут делом.

Спасибо за ответ. Буду пробовать наверное с opengl.
Я работаю, но пишу не на плюсах. Это задание дали в институте, но его, как-то абстрактно описали и не дали наводку, как это реализовать.

TrueBers

Alexanqp: Если вы серьёзно собрались это делать, то к концу универа, думаю, закончите.

ThePyzhov

WinAPI на то и API чтобы общаться с системой. Без него никак.

x67

А какже qt?
Если автор имел ввиду нежелание лично использовать winapi, то это выход

15432

Да, но QT все равно в WinAPI уходит. Автор наоборот просит самый хардкорный способ.

15432: ну тут либо автор начитался джавы и тогда да, нужно смотреть в сторону qt и gtk; либо не очень понимает чего хочет (написать свою os для зачем то. )

x67

15432: ну я поэтому и уточнил "лично", опосредованно без винапи наверное вариантов нет

Я сразу сделал на WinApi, но преподаватель сказал, что это просто и нужно самому, как-то рисовать окно и т.д )

15432

15432: "программно", но не в этом суть , ему не подошло такое решение из-за того, что там уже готовое API для создания окна. Он видимо имел ввиду тот способ, что Вы описали.

15432

x67

Alexanqp: опен гл. Через винапи или как хотите перехватываете мышь и клаву и соответствующе действуете. Еще можно псевдогуи в командной строке.

15432

Самый-самый хардкорный? Наверное, прямая запись в видеобуфер и свой USB драйвер для мыши. То есть вы рисуете абсолютно все элементы окна самостоятельно, попиксельно и общаетесь с мышью на уровне USB пакетов, при этом рисуя курсор и реагируя на перемещения и нажатия.
Это гораздо проще сделать в DOS, где винда не мешает своими драйверами и прочим.

Попробую как Вы описали, не получится сделаю на opengl )

Я сразу сделал на WinApi, но преподаватель сказал, что это просто и нужно самому, как-то рисовать окно и т.д )

Читайте также: