|
|
|
ListView Report заголовок для 16 тыс. столбцов05.11.2025, 22:09. Показов 1135. Ответов 6
Метки нет (Все метки)
Мое почтение, джентльмены.
Использую ListView на чистом WinApi. Отрисовать область данных для 16 тыс. столбцов через NM_CUSTOMDRAW или WM_DRAWITEM (+LVS_OWNERDRAWFIXED) не проблема (рисую только видимую часть окна при прокрутке). Проблема отрисовать заголовок для 16 тыс. столбцов. В сабклассе для заголовка ListView рисую весь заголовок в CDDS_PREPAINT или по элементам в CDDS_ITEMPREPAINT НО! только до общей ширины всех столбцов в 32767 пикселей. Есть подозрение, что координаты ограниченны 16 битным значением, хотя Header_GetItemRect() записывает в RECT значения координат в LONG (32 бита). И используя этот же RECT в DrawText(HDC Заголовка, text, size, &rc, DT_SINGLELINE | DT_VCENTER) - получаем отсутствие текста при выходе какой либо координаты за 32767 пикселей. Не работают и другие штатные события (HDN_ITEMCLICKW, HDN_ENDTRACK, HDN_ENDDRAG..). Причем ListView_GetSubItemRect() в WM_DRAWITEM выводит RECT с минусовым/плюсовыми координатами (в зависимости от прокрутки), а Header_GetItemRect() в CDDS_PREPAINT всегда плюсовые (без учета прокрутки). Возможно поэтому отрисовать можно любое количество данных, но вот проблема с заголовком для этих данных. Как штатный заголовок можно отрисовать в пределах видимой части ListView при прокрутке на 16 тыс. столбцов? Хочется штатный, потому как руками делать изменение ширины столбцов, их перетаскивание и др. функционал заголовка - это писать свой GridView.
0
|
|
| 05.11.2025, 22:09 | |
|
Ответы с готовыми решениями:
6
QTableView, как перерисовать заголовок или добавить в заголовок один или несколько столбцов Fast Report 4, поместить текст Edit в заголовок Сформировать заголовок, отправить его, а затем принять ответный заголовок |
|
2641 / 1652 / 267
Регистрация: 19.02.2010
Сообщений: 4,373
|
|
| 05.11.2025, 23:32 | |
|
bedvit, не надо работать со всей шириной области данных (т.е. не надо пиксельную ширину рендерить по содержимому всех 16тыс столбцов, и/или гориз.координату столбца считать на основе ширины всех предыдущих столбцов).
Горизонтальный скролл пусть скроллит не по пикселам - а кратно ширине столбца. Т.е. скролл "листает" столбцы целиком, работая с индексами, а не с шириной. В итоге - в видимой области слева всегда будет цельный столбец, справа - может оказаться частично видимый. Соответственно, координаты рисуемых пикселов/строк/объектов будут рассчитываться для/внутри непосредственно видимой области - а не для потенциально всей ширины 16тыс столбцов. Попробую переписать, ибо выше вышло сумбурно. В общем, первый=левый видимый столбец всегда располагается с нулевой горизонтальной координаты. Никакие горизонтальные пиксельные координаты при гориз.скролле не пересчитываются / не используются - меняется лишь номер самого левого видимого столбца. А рисуется/перерисовывается (после скролла) всё затем начиная с нулевой гориз.координаты - но с содержанием (и шириной) соответствующих (начиная с первого левого видимого) столбцов. Т.е. число столбцов у ListView - не задаётся изначально/однократно, а может быть динамическим (после каждого гориз.скролла - в видимую область может попадать разное число столбцов). Ну или можно посчитать, при некоторой мин.ширине столбцов, сколько влезет при развёртывании окна на весь экран - и задать это как макс.возможное число столбцов (в реале же - будет рисоваться гораздо меньше). Если столбцы разной ширины - то после каждого гор.скролла (или при первой отрисовке) меняем стобцам ширину на ту, которая соответствует содержимому текущих видимых столбцов. Вспоминать ВинАПИ (сообщения и т.д.) мне лень - поэтому ХЗ что там в итоге останется полезного от функционала ListView, м.б. проще будет таблицу (сетку, заголовки) в этой ситуации рисовать самому.
0
|
|
|
|
|
| 06.11.2025, 08:06 [ТС] | |
|
VTsaregorodtsev, сейчас я примерно так и отрисовываю. Штатный заголовок в ListViee - это дочернее окно к ListViev. И если нулевая координата перемещается для окна данных, то для заголовка нет, нулевая координата - всегда начало. Header_GetItemRect() возвращаещает координаты от начала окна, и гдето они преобразуются в 16 бит, раз есть такое ограничение (33 тыс. пикселей). Мое предположение. Здесь как по мне и проблема.
32 тыс пикселей, к примеру при загрузке из Excel, это 500 столбцов при размере столбца "по умолчанию" 64 пикселя. А при комфортной ширине столбца, раза в три больше - это 150-200 столбцов, что кажется не так и много.
0
|
|
|
COM‐пропагандист
|
|
| 25.11.2025, 17:39 | |
|
Возможно вам поможет Виртуальный ListView
https://rsdn.org/article/controls/virtlist.xml
0
|
|
|
фрилансер
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
|
|
| 25.11.2025, 21:02 | |
|
bedvit, мне лет 15 назад понадобилось миллионы строк отображать на MFC, и я не сумел выдрессировать местный решётк
![]() Написал свой на основе CStatic, скорость устроила, удобство хромало. Затем я познакомился с Qt и оттуда забрал идею модели данные-представление. Не поленился переделать в таком стиле, стало удобно. Мне кажется, встроенный контрол просто не был расчитан на такие объёмы Правда, тысячи столбцов я не пробовал на нём
0
|
|
|
|
|
| 26.11.2025, 19:26 [ТС] | |
|
Замабувараев, его и используем (LVS_OWNERDATA). Это дает возможность самому владеть и управлять данными, но, к сожалению, на заголовок никак не влияет (заголовок это дочернее окно со своими данными).
Алексей1153, Qt использую на Python, в общем идея у них хорошая, согласен. Но в данном случает хотел справится чистым WinApi. В общем проблему решил следующим образом. Виртуальный список, плюс родной функционал заголовка до 32767 пикселей, далее рисую сам. Из минусов - нужно самому пилить перетаскивание полей, изменения размера, всю отрисовку по колонкам. Зато подпилил изменение данных заголовка, добавление, удаление, всплывающую подсказку. Вот так получилось, см. рис.
0
|
|
|
|
|
| 26.11.2025, 19:27 [ТС] | |
|
Видео как работает.
Пожалуй, из особенностей можно еще добавить, что количество строк ограничено 100 000 000, а количество столбцов, точно не знаю, для Excel C API - 65 536 (особенности передачи массива), для СОМ загружал 1 000 000 - работает, больше не пробовал.
0
|
|
| 26.11.2025, 19:27 | |
|
Помогаю со студенческими работами здесь
7
Цвет заголовока ListView в режиме Report (Builder)
Выполнить запрос к БД при нажатии на элемент в ListView и заполнить данными другой ListView Как перетащить элемент из ListView в другой ListView? Как я могу загрузить содержимое одного listview в другой listview Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
|
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога
Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
|
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|