С помощью нейрокала делаю нативный клиент двача для Win32, чтобы читать двач без браузера.
Оверчан панель слева собирает нулевую с выбранных досок. Т.е. тематика не останется без ответа. Хочу добавить подписку на свои посты, чтобы приходило уведомление когда отвечают на пост.
Skia это пиздец. По дефолту не экспортируется skparagraph.dll.lib, пришлось что-то там патчить в исходниках чтобы он экспортировал символы dllки чтобы я мог её подключить её для рендеринга текста в постах с переносом. Потом я долго дебажил краш в SkString, не понимал в чём дело думал патч кривой. Оказалось разница ABI. Помогло пересобрать всю skia с овверайдом флага /MDd, типа gn gen --args="чё-то там extra_cflags_cc=[ \"/MDd\" ] extra_cflags=[ \"/MDd\" ] но это какой-то грубый костыль. Нужно лезть в систему сборки и смотреть что там не собирается в MDd, что должно.
>>328800330 (OP) >посты не посередине как найти нищеброда с микронетбуком что ты, что хач на админе никак не могут понять что перманентно косить глаза влево не есть гуд для чтения
>>328800654 Прикольно. Чувствую себя инвалидом как на костылях, только без мозга. Нейронки умнее в последнее время стали, где-то с GPT 5. До этого часто горела жопа от того что вместо правок начинала весь код переписывать заново с галлюцинациями.
Думаю вайбкодить с нуля ничего не понимая это больно. Нужно иметь какой-то опыт и представление в том стеке который спрашиваешь, чтобы критически оценивать ответы. Если спрошу про какой-нибудь Ruby она может написать хуйню и я даже не пойму потому что не разбираюсь.
>>328800730 > А как отвечать До этого ещё не доходил, пока только читать. В голове уже предвкушаю проблемы с капчей, походу с пасскодом только. Лол. Но я посмотрю как это делает дашчан.
> Добавь тему буричан > Добавь избранное Даже свои закреплённые треды из тематики сверху на нулевой оверчана, чтобы было легче следить за ними. > Добавь скрытие В общем это всё можно, делается легче чем ответы.
Пока две будущие главные проблемы это ответы и выделение текста для цитаты. Выделение текста придётся переизобретать с нуля, it's over. У меня есть демка где я переизобретал блокнот с реализацией текстового, там где-то 4к строк и лагает жутко.
>>328800749 Короч была идейка сделать как в ворде направляющие чтобы двигать посты.
Normal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal tNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal trmal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Rermal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Rermal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Rermal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Rhis textNormal text Reverse this textNormal text Reverse this textNormal text Reverse this textNormal text Re
GDI не крашится, но не умеет в цветные эмодзи (это походу дополнительно нужно что-то изобретать и рендерить эмодзи как картинки) или использовать DirectWrite как хром, но сомневаюсь что получится подружить именно с GDI не прибегая с Direct2D или к DirectX там. Надо посмотреть.
Ещё нашёл багулину, почему-то цвет текста эмодзи не красится.
>>328801506 > Какие подводные вообще по плюсам и десктоп-разработке назовешь? Нужно следить за временем жизни объектов. Ебля с хедерами. Если ошибка в мета-шаблонах то это вообще пиздец, долго читать что компилятор хочет.
Тут был C++ тред, наверно ещё в каталоге висит. Там в целом обосрали всё что можно. Но это цена за эффективность. Ощущается что примерно делает приложение на лоулевеле - оно прямо выполняется без посредников, без интерпретаторов, виртуальных машин и сборщиков мусора. И что можно всё, всё зависит от того насколько прямые руки. Это просто прикольное чувство.
>>328801506 А, ещё больное место отсутствие пакетного менеджера библиотек. Ну типа есть у CMake Fetch, есть vcpkg, а в линуксе есть *-dev пакеты. Но всё равно нет какого-то универсального подхода.
Я же зависимости которые мне нужны собираю из исходников, заранее настроенным .bat скриптом. Но это такое отчаянное решение.
В WinAPI каждый виджет будь то кнопка или текстовое поле - это объект окна в ядре ОС, так же как и окна верхнего уровня.
Я хотел придержаться такого же принципа и начал с регистрации класса окна которое рендерит один пост. Поэтому назвал решение студии ib-postcontrol Заполонив тред дочерними окнами по производительности понял, что сделал какую-то хуйню.
Переписал в одно окно представления, которое эффективно рендерит посты с клиппингом. Если пост находится за экраном оно его даже не пытается рисовать. Вычисление разметки тоже разбито на MVC, чтобы не высчитывать размеры постов каждую отрисовку. Контроллер пересчитывает прямоугольники когда это необходимо, представление просто рендерит в них.
Хз, если есть анон что шарит побольше меня может что-нибудь посоветовать.
>>328801791 >>328802547 Шаришь, вижу. А если, допустим, писать калькулятор, то как быть с переполнением диапазонов допустимых значений в числовых переменных? На пистоне можно просто сделать num = input.get() какой-нибудь. А на крестах как присвоение любого числа должно происходить?
>>328805079 Так такое есть же уже. Главная фича - хотелось бы чтобы приложение висело в трее и показывало уведомления с ответами на свои посты. Может и юзерскрипт такое может, не знаю. И очень огромная оптимизация по возможности. Браузеру нужно прочитать DOM, CSS. Страницы жрут много памяти. Мы забыли как в нулевых были планки памяти по 128, 256, 512МБ и ничего, всё работало.
>>328800330 (OP) Нейронка делает только фунции, или архитектуру тоже? Тесты нейронкой делал? Сталкивался ли с банами со стороны сервера? Какой user-agent ставишь?
Сколько времени влил?
>И очень огромная оптимизация по возможности. Браузеру нужно прочитать DOM, CSS. Страницы жрут много памяти. Мы забыли как в нулевых были планки памяти по 128, 256, 512МБ и ничего, всё работало. Вообще респект таким посонам.
>>328805320 > показывало уведомления с ответами на свои посты
Виолентмонки по кд сыпет уведомления на уровне винды. Как минимум web extension умеет в нативные уведомления. Юзерскрипт вероятно тоже.
>И очень огромная оптимизация по возможности.
Одна открытая вкладка для работы с бордой наверняка жрет очень мало. Если завернуть это в webextension то вероятно не нужно будет и вкладку держать в памяти.
>>328805396 > Нейронка делает только фунции, или архитектуру тоже? Только функции. По архитектуре если в общем посоветоваться как лучше описав ситуацию, сами они делать что-то сложное обсираются. Если агент так вообще может всё сломать. > Тесты нейронкой делал? Тут тестов пока нет. В крайнем случае тесты пишу если не удаётся отловить баг. > Сталкивался ли с банами со стороны сервера? Ещё нет. Я же ничего не пощу, кеширую превьюхи и соблюдаю рейт лимит ставя запросы к API в очередь. В /abu/ тред с API. > Какой user-agent ставишь? Кастомный, типа "dvacher/1.0" > Сколько времени влил? Меньше недели где-то. Блин, нейронка очень ускоряет. Без неё я бы уже запнулся на какой-нибудь хуйне и опустил руки.
>>328806074 > Есть ли смысл в IDE на плюсах Обязательно. Ещё всякие плагины инструменты. Есть задачи по рефактору от переименования символа по всех местах его использования, до извлечения методов из объявления класса в .cpp. Я кодил в VIM и руками заебёшся это делать. > , в чем пишешь? Как видно на скриншотах, Visual Studio 2026. Офф IDE от майкрософта по моему лучше всего подходит для разработки под винду и отладчик замечательный. Под другие задачи может есть полезнее CLion там, для Qt QtCreator.
>>328807471 Да впизду. Тоже так думал, что надо идти в ногу со временем. Попробовал я этот ваш WinUI 3 Visual Studio требует 11 винду и не показывает какой-то там дизайнер. Я не буду перекатываться.
Ещё не нравится мне этот XAML. Слои абстрации на абстракции, элементы располагаются в DOM со стилями как в браузере. Охуеть. Хуже только Electron приложения. Очередной провальный фреймворк от майкрософта, как и WinForms, WPF, UWP. Когда я был нищим ребёнком с древним компом всё это блоатварное говно тормозило. Теперь у меня ПТСР. WinAPI форева.
Для красоты на самом деле ничего не мешает взять контекст композитора DWM и рендерить очень красивую UIшку туда. Была на просторах интернета демка с вращающимся цветным кубом в DWM но я к сожалению больше её найти не могу.
>>328808050 > Очередной провальный фреймворк от майкрософта, как и WinForms, WPF, UWP. Да, но оно хотя бы выглядит относительно презентабельно из коробки. > Для красоты на самом деле ничего не мешает взять контекст композитора DWM и рендерить очень красивую UIшку туда. Давай не будем кривить душой, без норм дизайнера своими силами оно все равно получится дай бог на "приемлемо". Может у тебя конечно и выдающийся талант к таким вещам и я по себе сужу.
Судя по треду, человек выбрал путь настоящего самурая — писать нативный GUI на C++ под Win32 в 2026 году. Учитывая его фокус на "оптимизации" и "низком потреблении памяти" (как в нулевых), вот технические советы, которые спасут его проект от превращения в неподдерживаемый хаос:
### 1. Работа с данными (Критично) Самая главная ошибка, которую он может совершить — это парсить HTML страницы. Совет: Использовать только JSON API. У Абу (владельца двача) есть Makaba API. Вместо скачивания `res/12345.html` и попыток выдрать оттуда посты регулярками (что медленно и ломается при смене верстки), нужно дергать `.json` эндпоинты. * Пример: список постов треда берется через `/makaba/mobile.fcgi?task=get_thread&board=b&thread=12345&num=XXX` (где `num` — номер последнего полученного поста). Это решает его задачу "уведомлений в трее" без скачивания всей страницы заново — сервер отдаст только новые посты. [github](https://github.com/4chan/4chan-API/issues/64) * Это сэкономит мегабайты трафика и CPU, так как JSON парсится моментально по сравнению с DOM-деревом HTML.
### 2. Рендеринг текста и верстки (Самое сложное) В треде он спрашивает про архитектуру. Главная проблема нативных клиентов имиджборд — это отрисовка разметки постов (жирный, курсив, спойлеры, ссылки, цитаты) внутри нативного контрола. * Ловушка: Пытаться рисовать всё через стандартные `GDI` функции (`TextOut`, `DrawText`) вручную, вычисляя координаты каждого слова. Это ад. * Решение 1 (Хардкорное Native): Использовать Rich Edit Control (`RichEdit20W` или `50W`). Он умеет RTF-подобную стилизацию, ссылки и даже вставку картинок через OLE-интерфейсы. Это нативно, быстро и ест мало памяти. * Решение 2 (Компромисс): Использовать легковесный HTML-движок *без* браузера, например LiteHTML или Sciter. Они рисуют HTML на GDI/Direct2D поверхностности, но не тянут за собой весь движок Chromium/WebKit. Это даст гибкость верстки при нативной производительности. [news.ycombinator](https://news.ycombinator.com/item?id=24302553)
### 3. Оптимизация списков (Virtual List View) Автор жалуется на потребление памяти браузерами. Чтобы Win32 клиент не сожрал всё сам при открытии треда на 1000 постов с картинками: * Совет: Обязательно использовать Virtual List View (`LVS_OWNERDATA`). * В этом режиме контрол списка не хранит данные, а просто спрашивает у программы: "что мне нарисовать в строке №5 видимой области?". * Это позволяет держать в списке хоть миллион постов, потребляя память только под те 10-20, что сейчас на экране. Без этого стандартный `ListView` (или `ListBox`) умрет на больших тредах. [virtualdub](https://www.virtualdub.org/blog2/entry_273.html)
### 4. Работа с сетью и картинками * Сеть: Если он хочет "тру-натив", пусть берет WinHTTP или WinINet (встроены в Windows, не нужно тащить `libcurl`). Для JSON — библиотека `nlohmann/json` (стандарт де-факто в C++). * Картинки: Для декодирования JPEG/PNG/WebP использовать WIC (Windows Imaging Component). Это встроенный в Windows API, который использует аппаратное ускорение и не требует внешних библиотек типа `libpng` или `stb_image`.
### 5. Ответы на его вопросы из треда * "Нейронка делает архитектуру?" — Нет. LLM (как ChatGPT/Claude) ужасно справляются с визуальной версткой в Win32 (координаты, rects, message loop). Логику (парсинг JSON) они напишут, а вот GUI придется делать головой, иначе будет кривой Франкенштейн. * "IDE": Писать на C++ в Sublime Text без IntelliSense — это мазохизм. Пусть ставит Visual Studio Community 2022. Это лучший отладчик под Windows. Отладка сообщений окна (`WM_PAINT`, `WM_SIZE`) без нормального дебаггера невозможна.
Итог: Если он хочет реально быстрый и легкий клиент, архитектура должна быть такой: `WinHTTP` (сеть) -> `JSON Parser` -> Структуры данных в памяти (std::vector) -> `Virtual List View` (отображение) -> `Direct2D/WIC` (отрисовка картинок).
>>328808337 Нет. Я чувствую что тупой инвалид и мне дали костыли. Те вопросы над нахождением ответа которых нужно было тратить часы ломания головы, чтения документации, поиска в гугле и задавания вопросов на форумах ща решаются вопросом нейронке. Ну как и во всём остальном.
Нейронка выплёвывает референсный код, но пока на данный момент нужно ещё уметь его интегрировать и расширять под уже имеющуюся кодовую базу.
И я не знаю что там должно произойти для сингулярности, наверное AGI, потому что современным нейронкам не хватает человеческого common sense. Блять, я даже не знаю как это описать. Что в каких-то вопросах всё правильно делает, а в каких-то пакостит и в упор не видит и не хочет решать проблему будто троллит. Всё просто предобученый текстовый трансформер, ощущается не более как "следующее поколение гугления", как если бы на абсолютно каждый вопрос находился бы примерно правильный ответ на стаковерфлоу с кодом.
Но я агентами не пользуюсь, только чатом. Они-то могут шариться по директории. Но у меня нет доступа к супернейронкам вроде клода потому что там или платное, или телефон зарубежный просят суки. Я пробовал только openai codex и google jules и они мне просто насрали в код всё сломав.
Явно ещё не время чтобы оно всё делало за меня без ошибок, а я бы просто откинулся на кресле сложив руки за голову. Я был бы на самом деле очень рад.
>>328809268 > Самая главная ошибка, которую он может совершить — это парсить HTML страницы. > Совет: Использовать только JSON API. У Абу (владельца двача) есть Makaba API. Всё так. Там и клаудфлара не пустит наверное. Парсить HTML имеет смысл если расширять для поддержки других борд, у которых нет API. Опять же, как делает дашчан. > Решение 1 (Хардкорное Native): Использовать Rich Edit Control (`RichEdit20W` или `50W`). Он умеет RTF-подобную стилизацию, ссылки и даже вставку картинок через OLE-интерфейсы. Это нативно, быстро и ест мало памяти. В пизду. Это говно элемент из WordPad. > Решение 2 (Компромисс): Использовать легковесный HTML-движок без браузера, например LiteHTML или Sciter. Они рисуют HTML на GDI/Direct2D поверхностности, но не тянут за собой весь движок Chromium/WebKit. Ну... Опять же переизобретение браузера. Зачем мне писать браузер, если я хочу отойти от браузера. Поймал себя на мысли когда делал лейаут постов всё в Box`ы запихнуть и рекурсивно рендерить. Можно. Можно взять библиотеку clay или что-то подобное. Но я думаю если и сделать это, как альтернативу способа рендеринга которую можно выбрать. > * Ловушка: Пытаться рисовать всё через стандартные `GDI` функции (`TextOut`, `DrawText`) вручную, вычисляя координаты каждого слова. Это ад. Да да я. Сначала вычисляется GetTextExtentPoint32W и размер переводится в прямоугольник. Затем прямоугольник сдвигается через OffsetRect и сохраняется в объекте потом на рендер. Для поста на дваче этого вполне достаточно, тут нет какой-то сложной динамической разметки, разве что в тематике в закреплённых постах.
> Совет: Обязательно использовать Virtual List View (`LVS_OWNERDATA`). Вот это он вообще нахуй сгаллюцинировал и придумал. Не существует никакого "Virtual List View". Есть стандартный контрол ListView в comctl32.dll который рендерит файлы в эксплорере, но он там по большей части захардкожен и его нельзя нормально расширить или изменить, даже выставить разную высоту для каждого элемента. Что лучше с нуля свой написать.
> ### 4. Работа с сетью и картинками Если он хочет "тру-натив", пусть берет WinHTTP или WinINet (встроены в Windows, не нужно тащить `libcurl`). Для JSON — библиотека `nlohmann/json` (стандарт де-факто в C++). > Для декодирования JPEG/PNG/WebP использовать WIC (Windows Imaging Component) Правда. И nlohmann-json лучшая библиотека для JSON. Разве что WinHTTP мне не нравится, планирую отречься на boost::asio и beast.
> Direct2D Вот это интересно шишак дымит. Надо сделать рендерер Direct2D.
>>328809493 Да мне и не надо рендерить html... Только спарсить текст поста из json на токены, типа где ссылка на ответ, где гринтекст, где форматирование
Вот эта вот разметка поста она вся одинаковая для всех постов. Только посчитать прямоугольники - где имя с датой, где превьюшки, где текст, где ответы к посту. Этого хватит. Переизобретать браузер и рендерить какую-то сложную динамическую разметку не нужно.
>>328809493 С чего взяли что любитель DOM лейаутов. Какой браузерный движок. На старую винду 98, XP когда приложения писали никто не думал окна в html/xml DOM лейауте делать. Даже сложный софт по типу автокада. Это придумали когда начали писать приложения на электроне. Про текстбоксы с utf не понял. Не, с utf всё нормально, это ограничения отрисовки текста через GDI DrawText. WinAPI слишком старое что не может рисовать разноцветные глифы шрифта как в эмодзях, поэтому выбирается чёрно-белый вариант эмодзи. Точно такое же было в хроме на XP и на Win7 вроде.
>>328810237 Да, для отрисовки тела текста поста можно как вариант. Там парсится html с ссылками на посты и всеми тегами форматирования. Надо поэксперементировать.