Введение
Всё началось с комментирования статьи: «Как я написал современный GUI для yt-dlp на Python» ( https://habr.com/ru/articles/930260/ ).
Программа автора мне понравилась, и я обещал ему попробовать сделать аналогичный проект на C++ / WTL.
Так вот, не прошло и полгода, как первая версия аналогичной программы уже готова. Её рабочее название – MiniDL, а исходники доступны на сайтах:
http://polezp.narod.ru/Prg/MiniDL100.zip
и
http://lecole.free.nf/Prg/MiniDL100.zip
или
https://disk.yandex.ru/d/yGQDXbkpk6LPqw
Архив содержит также скомпилированные бинарники для 32-х и 64-х разрядных, релизных версий, под Windows («MiniDL32r.exe» и «MiniDL64r.exe»).
Естественно, создать конкурентный интерфейс профессиональной библиотеке CustomTkinter, для Питона, на сверхлегком движке WTL, за обозримое время, практически невозможно. Но такая задача и не ставилась. Хотелось просто реализовать идею автора – работать с удобной графической оболочкой для консольной программы, в данном случае – внешнем загрузчике медиа-контента из Ютуба и других, поддерживаемых им сайтов.
Ради простоты, пришлось отказаться от попытки реализовать все интерфейсные плюшки автора и ограничиться минималистским вариантом. Тем более что, лично меня он вполне устраивает. Более того, поскольку я привык работать в Total Commander, то там вполне удобно использовать и консольные программы, особенно в паре с командным файлом их запуска, что позволяет перенести туда все параметры командной строки. А, в случае с загрузчиком yt-dlp.exe ситуация оказалась еще лучше, так как, он поддерживает конфигурационный файл, с мощными настройками. Если их хорошо освоить, то, в принципе, ничего больше и не надо. Ведь, эти настройки позволяют легко скачивать не только аудио и видео файлы, но и субтитры к ним и тому подобное. Также, легко и просто указать каталог загрузки, но уже в нашей программе, и не мучиться, как автор, с сохранением их на рабочий стол.
Поэтому, если цель стоит просто загрузить любимые «видосики» из Ютуба, как порознь, так и целиком весь плейлист и, даже канал, то пишем нужный URL (один либо несколько) в командном файле и, при необходимости, меняем настройки в конфигурационном файле, затем, нажимаем клавишу «Enter» на *.cmd файле и вуаля! Процесс запушен, нужные файлы грузятся (при необходимости пользуемся вэпээном) – можно идти заниматься другими делами.
Т.е., я хочу сказать, что консольный вариант работы с программой загрузки меня вполне устраивает, а использование для неё графической оболочки, это не более, чем вопрос вкуса и дополнительного удобства.
Тем не менее, польза от проекта имеется.
Прежде всего, следует сказать, что WTL не предназначена для разработки серьезного графического интерфейса пользователя, хотя, с ее помощью можно делать неплохие вещи. Для примера, смотрите скриншот моей неопубликованной программы «МедиаТекст» для ручного ввода встроенных субтитров видео (рис.1)

В данном случае, хотелось, прежде всего, реализовать, на WTL. «тёмную» тему. Китайцы создали для подобных задач свою библиотеку DuiLib, в которой пользовательский интерфейс задаётся во внешних xml-файлах и, более того, даже реализовали собственный редактор DuiLib Editor для модификации GUI извне. В целом, эти вещи неплохие, но громоздкие, как для меня. Поэтому, я предпочел сделать минималистский интерфейс, не только по возможностям, но и по объему кода.
Часть Первая – Результирующая
Скомпилированные файлы, для проекта MiniDL, занимают, по размеру, менее 300 килобайт. Это, конечно, несопоставимо с объемом файлов на Питоне. У автора программы «yt-dlp-gui.exe» размер, «всего лишь» 28 Мегабайт. Правда, сюда входит искомый движок «yt-dlp.exe», который я тоже использую. Но его размер – 18 Мегабайт. Соответственно, на интерфейс CustomTkinter, программы автора, приходится порядка 10 Мегабайт. Понятно, что с таким объемом кода тягаться трудно. Поэтому, видео предосмотр, как у автора, я даже не пытался делать. Да и зачем? Предварительно просмотреть видео можно непосредственно в браузере, на самом Ютубе.
Но, вот «темную» тему попытался реализовать (рис. 2). Соответственно, цвета компонентов, в коде, можно менять по собственному усмотрению.
При первом запуске, программа проверяет, если ли внешний загрузчик, в месте ее расположения. Если нет, то просит его загрузить (рис. 2). Также она смотрит на наличие каталога загрузки «Downloads» в корне программы, которое задано в коде проекта. Если такой папки нет, то она создаётся.
Программа позволяет использовать два вида загрузки данных из Интернета: внешний («yt-dlp.exe») и внутренний («WinInet»). Второй позволяет скачивать «обычные» файлы и страницы из Интернета.
В этом режиме, вы можете нажать клавишу «Enter» либо кнопку «WinInet». Если же внешний загрузчик уже существует, то «Enter» срабатывает для него. Для обычной загрузки – жмите соответствующую кнопку, а не клавишу.

На рис. 3 показан процесс «обычной» загрузки, для произвольных URL, Соответственно, можно скачивать и другие файлы, например, первую версию обучающей программы «L'école» (рис. 4). Если же, нужна более свежая версия, то она доступна на Яндекс-Диске: https://disk.yandex.ru/d/5yjYP4JP1aVnIw , и загружается только в браузере, так как, прямая ссылка, там всегда временная и привязана к нему.


Посмотрим, теперь, как загрузить плейлист, с нашего канала (в данном случае они совпадают). Для примера, выберем ссылку: https://www.youtube.com/@scholium9807 (рис. 5).

Процесс загрузки показан на рис. 6.

Как мы видим, загружено только пять файлов из девяти. Это связано с настройками в конфигурационном файле «yt-dlp.conf»:
#--no-playlist
-I, --playlist-items 1:5 / Скачать диапазон с 1 по 20 видео в плейлисте
Мы заблокировали запрет на скачивание плейлистов (символ «#») и, наоборот, разблокировали строку с максимальным количеством загружаемых видео в плейлисте (но уменьшили значение, по умолчанию, 20 до 5).
Также в конфигурационном файле, по умолчанию, можно менять формат имени загружаемых файлов, максимальное качество видео («bestvideo*[height<=1080]»), частоту кадров («[fps<=30]») и максимальное качество звука («+bestaudio»). Кроме того, для субтитров мы указали флаги:
--sub-langs "fr, ru, en"
--sub-format "srt/best"
--write-subs
Соответственно, субтитры, в формате *.srt, на французском, русском и английском языках, будут загружаться в наш корневой каталог «Downloads», если они присутствуют в оригинале. Естественно, все указанные параметры можно менять на свой вкус. Однако в мою задачу не входит их подробное объяснение
Часть Вторая – Техническая
Я не буду подробно говорить о коде проекта. Он небольшой, хорошо структурирован и прокомментирован. При желании, вполне можно разобраться.
Скажу только, что без использования ИИ-сервисов (бесплатных, платными я не пользуюсь) мне бы не удалось решить проблемы с эмуляцией собственного фрейма, изменения его размеров, работы с собственными системными кнопками и кастомизацией стандартных элементов управления.
Особенно важно, для меня, было разобраться со стилем кнопок «BS_OWNERDRAW», который позволяет использовать пользовательское рисование, без применения сабклассинга и перегрузки внешних изображений.
Так что, если ИИ (даже бесплатному) задавать очень конкретные вопросы, в стиле know-how («знать как»), то вполне можно получить значимый ответ, буквально, с первой попытки. Только, код, при этом, все равно, нужно будет шлифовать и наводить там «красоту». В целом, (бесплатный) ИИ склонен давать «грязный» код и отнюдь не стремиться делать его оптимальным. Скомпилировался – это уже успех. Тем не менее, поддержку от него я получил существенную.
Кроме того, реализован достаточно неочевидный процесс перехвата потока сообщений консольной программы и перенаправление его в стандартный многострочный редактор, типа, CEdit.
Выводы
Несмотря на то, что представленный проект MiniDL, не слишком важен, сам по себе, он достаточно полезен для разбора тонких вопросов по созданию, точнее, эмуляции «тёмной» темы средствами C++ / WTL и оптимальной кастомизцией стандартных компонентов Windows.
Ну, а какую программу использовать: «yt-dlp-gui.exe» либо «MiniDL64r.exe» (можно и другие, но мы говорим здесь, об этих) решать уже вам. Мне, естественно, больше нравится собственная программа.
Комментарии (19)

sergeym69
12.10.2025 23:50А где у вас собственно WTL используется ? У вас ведь в исходниках ничего от WTL нет?
WTL это https://github.com/Win32-WTL/WTL и диалоги там обычно делаются в редакторе ресурсов VisualStudio и все получается как и во всех Win прогах, поддержка тем тоже вроде под WTL была.

Emelian Автор
12.10.2025 23:50А где у вас собственно WTL используется ? У вас ведь в исходниках ничего от WTL нет? WTL это https://github.com/Win32-WTL/WTL
Собственно, сами h-файлы WTL, которые, по вашей ссылки находятся в папке WTL/Include у меня находятся в общем доступе (C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include)/ В последней версии WTL-10.320 – 20 файлов, общим размером менее полутора Мегабайт. Скачайте их из Интернета и положите в каталог, на который есть ссылки в проекте. Какие проблемы? Зачем стандартные файлы помещать в локальный проект?
и диалоги там обычно делаются в редакторе ресурсов VisualStudio и все получается как и во всех Win прогах, поддержка тем тоже вроде под WTL была.
Диалогами я, практически, не пользуюсь, просто, не люблю их. Мне и прототипы искать было очень тяжело, поскольку все, в том числе ИИ, очень любят диалоги. Компоненты в окнах, наверное, кроме меня никто не использует :) .

DjUmnik
12.10.2025 23:50Вы опоздали лет на 20. В WTL ковырялись лет 20 назад. Сейчас это никому не интересно.
В Qt кастомный интерфейс делается элементарно, в т.ч. есть готовые компоненты для собственного фрейма окна.
Непонятно, в чем смысл вашей статьи. Возможно, вы хотели пропиарить себя или программу, но сама программа бесполезна. Полезной технической информации для разработчиков статья не несёт. На гитхабе таких бесполезных учебных проектов пруд пруди.
Вот если бы вы написали полноценную статью или библиотеку, как без боли добавить в legacy wtl приложение темную тему, это лично мне было бы интересно.

Jijiki
12.10.2025 23:50apply-windows-themes а там же без wtl есть какой-то способ получить доступ к теме
вон внизу легаси вставки может сработает
2vrEIhAajhM тут еще много - просто вал легаси код обзора ), но придётся смотреть все серии чтобы нужное уловить, но я помню он рассказывал о приколах к темам, но это не втл, а просто легаси

Siemargl
12.10.2025 23:50Приложение на WTL будет крохотным и не иметь внешних зависимостей.
Да, это сложнее, чем простое формошлепство

Emelian Автор
12.10.2025 23:50Вы опоздали лет на 20. В WTL ковырялись лет 20 назад. Сейчас это никому не интересно.
Мне интересно. Разве этого мало?
В Qt кастомный интерфейс делается элементарно, в т.ч. есть готовые компоненты для собственного фрейма окна.
Ну, да! Программа «MediaDownloaderQt5-5.4.3» занимает «всего лишь» 471 Мегабайт, качает, без спроса, кучу файлов. Интерфейс – ужасен – сделан в дремучем диалоговом стиле, который я видел еще 25 лет назад.
А что она делает? Да тоже самое – скачивает плейлисты и каналы с Ютуба. И, в чём ее преимущество? – Настроек побольше, которые вполне можно один раз выполнить и в конфигурационном файле «yt-dlp.conf».
Вам нравится такой подход – используйте на здоровье. Я возражать не буду. Зато новомодно, как бы.
Непонятно, в чем смысл вашей статьи.
По сути, это демо-проект, демонстрирующий:
– Реализацию «тёмной» темы на сверхлёгком движке WTL. Программы получаются микроскопические, по современным меркам, но, достаточно функциональными. Полученным загрузчиком, лично я, с удовольствием пользуюсь, вместо аналогичного, с которым сравниваю.
– Использование безфреймовых окон, ради эмуляции собственного «тёмного» фрейма.
– Оптимальная кастомизация стандартных контролов (CEdit и CButton), без использования сабклассинга и внешних файлов изображений. Для эмуляции системных кнопок я использую bmp-картинки, но они микроскопические.
– Демонстрация межпроцессного взаимодействия между консольной и оконными программами.
– Оптимальная работа с многострочным и однострочным редакторами. Кстати, в своем проекте «МедиаТекст», я использовал контрол «RichEdit», как более продвинутый. Теперь, в следующей версии, я заменю его на стандартный (явно недооцененный всеми) контрол «CEdit».Вы считаете, этого недостаточно для статьи, здесь?
На гитхабе таких бесполезных учебных проектов пруд пруди.
Совершенно верно! «Никакая работа не кажется безнадёжной, если её . . . – делать другому!».
Вот если бы вы написали полноценную статью или библиотеку, как без боли добавить в legacy wtl приложение темную тему, это лично мне было бы интересно.
В «legacy» на С++ или другом языке?

HemulGM
12.10.2025 23:50Взяли бы бесплатную редакцию Delphi. Запустили среду и через 3 минуты и 23 секунды уже бы завершили свой проект. Memo1, Button1, Button2, OnClick1, OnClick2, ShellExecute/WinExec. Готово.

CatAssa
12.10.2025 23:50WxWidgets осваивается мгновенно, есть визуальные дизайнеры гуя. В итоге, не сложнее Delphi, обозримый фреймворк, не сильно распухший исполняемый модуль, теперь и с темной темой.

Emelian Автор
12.10.2025 23:50WxWidgets осваивается мгновенно, есть визуальные дизайнеры гуя. В итоге, не сложнее Delphi, обозримый фреймворк, не сильно распухший исполняемый модуль, теперь и с темной темой.
Это все пройденные этапы. Работал я и с Паскаль, еще на уровне «Object Professional», и с Qt, wxWidgets,, Win32++, MFC, и, совсем недавно, с DuiLib и DuiLib Editor. И даже на «чистом» WinAPI. Причем, и с ассемблером, тоже, немного «баловался», на уровне перекомпиляции бинарного кода (см. мой сайт https://erfaren.narod.ru/ ).
Но, именно WTL зацепил меня больше всего, поэтому все эти советы кому, на чем работать, да еще даваемые незнамо-кому – от лукавого, особенно, если их не просят.
Что касается «тёмной» темы, то, лично я, не сторонник ее. Просто, после публикации моей обучающей программы (последняя версия в https://habr.com/ru/articles/930868/ ), народ предъявил претензии, почему, мол, интерфейс не в «тёмной» теме? Вот и решил попробовать, насколько это реально именно на С++ / WTL? Оказалось, реально. Вопрос только стоит ли этим заниматься?
Sazonov
Когда там был последний релиз wtl? Лет 11 назад?
И вы написали просто окошко с двумя кнопками и текстовым полем?
Исходники вашего творчества архивом на народ ру? Гитхаб/гитлаб не современно?
Emelian Автор
А ради кого и чего я должен соблюдать ритуал, типа, использовать фреймворки только новые, даже если они избыточно тяжелые, вроде Qt, для простых пет-проектов?
Да! Но, это вполне решает мои задачи. Считайте ее демо-программой, которая показывает реализацию некоторых неочевидных вещей.
Откровенно говоря, влом разбираться с Гитхабом. Что это меняет? Чем это лучше для меня или для вас?
Siemargl
Чтобы желающие смогли доработать программу
Emelian Автор
Странное желание. Минусы показывают, что народу тема не интересна. Зачем тогда напрягаться насчет Гитхаба?
Imaginarium
Так минусы из-за того, в том числе, что программу неудобно забирать, работать с ней. Вы бы ещё на какой-нибудь ucoz или мегааплоад выложили архивом.
Emelian Автор
Для меня это удивительно, потому что, для меня, нет ничего удобней, чем скачать прямую ссылку на zip-файл. Это я и на Гихабе всегда делаю, скачал архив, распаковал вручную, где удобно, в своем каталоге, и работаю с ним. Что может быть лучше, я даже не представляю?! И Яндекс-диск – тоже неудобен?
Допускаю, что если у вас не «Форточки», а Линукс или Мак, то там могут быть нюансы. Однажды мне высказали претензии на pdf-файл справки, для моей старой обучающей программы. Мол, не читается он в Линуксе. Но, откуда мне это знать, если я ничего, кроме Виндоуз, не знаю? Благо, в том случае, я посоветовал использовать встроенную справку, программа была очень простая, что вполне было достаточно.
Чтобы публиковать свои пет-проекты на Гитхабе, я, по крайней мере, должен видеть в этом смысл. Но, если мои пет-проекты никому не интересны, судя по комментариям, то, зачем мне Гитхаб, если лично мне он не нужен?
Хотя, «капля камень точит». Если все начнут настаивать на публикации в Гитхабе, то, «почему бы и да»? Подумаю. Может быть, новые версии своей обучающей системы «L'école» и программы «МедиаТекст» я опубликую там. Они, для меня, более важны. Что касается демо-проектов, то посмотрим.
Jijiki
смотрите прикол на приложении написанном на C# теперь
XML_Notepad
в 98 было написано на С++ и потом переписали на C#, но прикол в том, что сейчас проект с XML надстройкой и С#/C++, монструозные, можно создать окно на С++ на легси api, окно хотябы точно можно создать