Dmitry Develop
176 subscribers
77 photos
35 videos
88 files
205 links
Этот канал в основном будет интересен новичкам в программировании и людям немного поопытнее.
Здесь я буду делиться своими новостями и достижениями в программировании.

Разработка, программирование; c++, gcc, g++, gnu, mingw; winapi, windows; vscode.
Download Telegram
Что про дизайн скажете?

Хочется использовать небольшую палитру цветов для GUI.
Чёрный, светло- и тёмно-серый. Может быть ещё белый.
Размеры все кратные 2 или чётные.
Размер текста 14 px.

Хочется ещё рамку в 2 px у каждого элемента сделать, но пока не придумал, как это сделать, чтобы выглядело красиво.

И каким образом менять элемент при наведении курсора или клике?
Менять цвет фона или рамки?

Мне очень приглянулся стиль кнопок в WPF, надо будет подсмотреть).

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Не вылезайте, ребятки, за границы массива и не пишите UB код).

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

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

ссылка на канал | ссылка на группу
Я почти-почти понял, как масштабировать и рисовать график).

Осталось коэффициенты поправить, чтобы после масштабирования графики были пропорциональными.

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
От этих коэффициентов и выходов за границы массива уже болит голова).

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

Если всё по-нормальному сделать, оформить в виде библиотеки, фреймворка или движка, будет неплохой плоттер).

ссылка на канал | ссылка на группу
Не могу определиться с названиями состояний клавиши для модуля input (отвечает за обработку ввода).
Возможные названия: key, state, press, release, hold, down, up, ...

На данный момент сделал так:
keyPressed (true, пока клавиша нажата)
keyReleased (true, пока клавиша отпущена)
(bool KeyReleased == !KeyPressed)

keyPressedOnce (true, если клавиша была нажата)
keyReleasedOnce (true, если клавиша была отпущена)

keyPressedDown (синоним pressedOnce)
keyPressedUp (синоним releasedOnce)

Потом хочу реализовать действие на двойной или тройной клик с заданной задержкой. (keyPressedTwice/Triple).
Поэтому keyPressedOnce версия должна иметь другое название (true, если клавиша была нажата кратковременно один раз или как?), чтобы не путать с twice и triple функциями.

ссылка на канал | ссылка на группу
Текст немного позже напишу, а фото уже сейчас выложу.
Знающие, думаю, уже понимают, о чём будет текст).

А нет, я просто забил).

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Иногда баги бывают забавными).
При изменении масштаба графика, он почему-то начинает шагать).

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Даже не знаю что сказать.
А я знаю что сказать, я отдыхать ***.
Столько времени на разработку и отладку ушло, а потом ещё и на корректировки от заказчика, а ещё я более 14 дней просто ничего не делал, думал всё будет просто.
Итого, времени на хобби и досуг не оставалось.

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

Да, есть косяки и недоработки, это это только демонстрационная программа, дальше будет только жёстче и интереснее).

И да, моя первая программа за долгое время на 1000 строк кода.
Ну, если только не считать мой игровой движок в прошлом, там 5000, думаю, наберётся.

ссылка на канал | ссылка на группу
Хотел оптимизировать и облегчить перевод тактов в количество наносекунд при помощи QueryPerformanceCounter и QueryPerformanceFrequency.

Попробовал два способа перевести такты в секунды.

В моей системе прекрасно работают оба способа, но на другом компьютере при одинаковом количестве тактов из-за округления разница между двумя способами получилась в целых 200'000 наносекунд.

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

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Как же легко говнокодить, а потом тяжело переделывать по-нормальному).

В моей системе GUI при реализации slider, как отдельного компонента, я заметил несколько проблем.
У меня пока не реализовано такое понятие, как родительский и дочерний элемент.
Поэтому сразу не понял, почему slider не реагирует на курсор.

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Ох, вот зачем я только решил рисовать графику при помощи GDI, это оказалось таким хардкором.
Благо я наконец-то нашёл!!
Нашёл, как рисовать внутри области, чтобы всё остальное, что выходит за её границы, отсекалось.

В opengl это решается за секунду (scissors), а вот решение для GDI я искал более недели.

В HTML это стиль overflow: hidden или scroll.

ссылка на канал | ссылка на группу
👍1
Какие ещё нужны элементы для графического интерфейса?

Думаю, пора переделывать GUI на компонентную систему + сделать древовидную структуру интерфейса.

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

Всё ещё экспериментирую с QueryPerformanceCounter, разбираюсь с частотой и периодом, думаю, какие единицы измерения выбирать основными и как переводить такты во время и наоборот.

ссылка на канал | ссылка на группу
👍1
Вроде, с обёрткой над QueryPerformanceCounter разобрался.
Время получаю в наносекундах.

Замерил время, сколько по факту будет работать Sleep(1500 ms) (разрешение системного таймера увеличено с помощью timeBeginPeriod(1 ms)).
Получились очень точные 1500 ms.

Жаль, такой способ с timeBeginPeriod работает по-разному на разных версиях операционной системы windows, особенно на серверной.

ссылка на канал | ссылка на группу
Когда программа почему-то начинает вылетать каждый нечётный раз или после добавления всего одной кнопки, где-то есть ошибка или undefined behavior и приходится долго сидеть-искать в отладчике источник проблем.

Где-то вылез за границы массива, где-то увеличил размер динамической памяти вместо (size * sizeof(Block)) на просто (size)...

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

ссылка на канал | ссылка на группу
Реверс-инженерим полосу прокрутки в windows).

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

ссылка на канал | ссылка на группу
Мало ли кому понадобятся названия частей, формула, размеры и расчёты полосы прокрутки для графического интерфейса).

ссылка на канал | ссылка на группу
А это способ определить, используя события winAPI, какой последовательный COM порт был подключён или отключен.

WM_DEVICECHANGE
DBT_DEVICEARRIVAL
DBT_DEVICEREMOVECOMPLETE
DEV_BROADCAST_PORT_A

ссылка на канал | ссылка на группу
Устаревшая реализация (deprecated implementation).
Новая реализация с исправлением ошибок
...

Функция intMap нужна, чтобы сдвинуть, сжать или расширить числовой диапазон.

Например, когда число приходит в диапазоне от -128 до 127 (int8_t) и его нужно преобразовать в диапазон от 0 до 599 (высота окна в пикселях).

Нужно просто написать:
int64_t value { 0 };
intMap(&value, -128, 127, 0, 599);

ссылка на канал | ссылка на группу
Media is too big
VIEW IN TELEGRAM
Проверка работы моей реализации слайдера.

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

ссылка на канал | ссылка на группу