Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,138
Записей в блоге: 22

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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.11.2025, 22:09
Ответы с готовыми решениями:

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

Fast Report 4, поместить текст Edit в заголовок
Создаю отчет с помощью Fast Report. Возможно ли поместить информацию из Edit c какой либо...

Сформировать заголовок, отправить его, а затем принять ответный заголовок
День добрый, форумчане. Предо мной задача - сформировать заголовок, отправить его, а затем принять...

6
2641 / 1652 / 267
Регистрация: 19.02.2010
Сообщений: 4,373
05.11.2025, 23:32
bedvit, не надо работать со всей шириной области данных (т.е. не надо пиксельную ширину рендерить по содержимому всех 16тыс столбцов, и/или гориз.координату столбца считать на основе ширины всех предыдущих столбцов).
Горизонтальный скролл пусть скроллит не по пикселам - а кратно ширине столбца. Т.е. скролл "листает" столбцы целиком, работая с индексами, а не с шириной. В итоге - в видимой области слева всегда будет цельный столбец, справа - может оказаться частично видимый.
Соответственно, координаты рисуемых пикселов/строк/объектов будут рассчитываться для/внутри непосредственно видимой области - а не для потенциально всей ширины 16тыс столбцов.

Попробую переписать, ибо выше вышло сумбурно.
В общем, первый=левый видимый столбец всегда располагается с нулевой горизонтальной координаты. Никакие горизонтальные пиксельные координаты при гориз.скролле не пересчитываются / не используются - меняется лишь номер самого левого видимого столбца. А рисуется/перерисовывается (после скролла) всё затем начиная с нулевой гориз.координаты - но с содержанием (и шириной) соответствующих (начиная с первого левого видимого) столбцов.
Т.е. число столбцов у ListView - не задаётся изначально/однократно, а может быть динамическим (после каждого гориз.скролла - в видимую область может попадать разное число столбцов). Ну или можно посчитать, при некоторой мин.ширине столбцов, сколько влезет при развёртывании окна на весь экран - и задать это как макс.возможное число столбцов (в реале же - будет рисоваться гораздо меньше).
Если столбцы разной ширины - то после каждого гор.скролла (или при первой отрисовке) меняем стобцам ширину на ту, которая соответствует содержимому текущих видимых столбцов.
Вспоминать ВинАПИ (сообщения и т.д.) мне лень - поэтому ХЗ что там в итоге останется полезного от функционала ListView, м.б. проще будет таблицу (сетку, заголовки) в этой ситуации рисовать самому.
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,138
Записей в блоге: 22
06.11.2025, 08:06  [ТС]
VTsaregorodtsev, сейчас я примерно так и отрисовываю. Штатный заголовок в ListViee - это дочернее окно к ListViev. И если нулевая координата перемещается для окна данных, то для заголовка нет, нулевая координата - всегда начало. Header_GetItemRect() возвращаещает координаты от начала окна, и гдето они преобразуются в 16 бит, раз есть такое ограничение (33 тыс. пикселей). Мое предположение. Здесь как по мне и проблема.

32 тыс пикселей, к примеру при загрузке из Excel, это 500 столбцов при размере столбца "по умолчанию" 64 пикселя. А при комфортной ширине столбца, раза в три больше - это 150-200 столбцов, что кажется не так и много.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
25.11.2025, 17:39
Возможно вам поможет Виртуальный ListView
https://rsdn.org/article/controls/virtlist.xml
0
фрилансер
 Аватар для Алексей1153
6454 / 5655 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
25.11.2025, 21:02
bedvit, мне лет 15 назад понадобилось миллионы строк отображать на MFC, и я не сумел выдрессировать местный решётк

Написал свой на основе CStatic, скорость устроила, удобство хромало. Затем я познакомился с Qt и оттуда забрал идею модели данные-представление.

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

Мне кажется, встроенный контрол просто не был расчитан на такие объёмы

Правда, тысячи столбцов я не пробовал на нём
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,138
Записей в блоге: 22
26.11.2025, 19:26  [ТС]
Замабувараев, его и используем (LVS_OWNERDATA). Это дает возможность самому владеть и управлять данными, но, к сожалению, на заголовок никак не влияет (заголовок это дочернее окно со своими данными).
Алексей1153, Qt использую на Python, в общем идея у них хорошая, согласен. Но в данном случает хотел справится чистым WinApi.
В общем проблему решил следующим образом. Виртуальный список, плюс родной функционал заголовка до 32767 пикселей, далее рисую сам.
Из минусов - нужно самому пилить перетаскивание полей, изменения размера, всю отрисовку по колонкам.
Зато подпилил изменение данных заголовка, добавление, удаление, всплывающую подсказку.
Вот так получилось, см. рис.
Миниатюры
ListView Report заголовок для 16 тыс. столбцов  
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,138
Записей в блоге: 22
26.11.2025, 19:27  [ТС]
Видео как работает.
Пожалуй, из особенностей можно еще добавить, что количество строк ограничено 100 000 000, а количество столбцов, точно не знаю, для Excel C API - 65 536 (особенности передачи массива), для СОМ загружал 1 000 000 - работает, больше не пробовал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.11.2025, 19:27
Помогаю со студенческими работами здесь

Цвет заголовока ListView в режиме Report (Builder)
Кто знает, есть ли возможность изменить цвет Header-а у ListView (vsReport), а то все одного цвета,...

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

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

Как перетащить элемент из ListView в другой ListView?
У меня есть форма на ней два ListView хочу из одного ListView в другой ListView перетащить объект....

Как я могу загрузить содержимое одного listview в другой listview
Как я могу загрузить содержимое одного listview в другой listview? ListModel { id: model1 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
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(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru