Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

Добавление в уже созданное окно ListView

02.01.2013, 09:48. Показов 2441. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, есть основная база данных, которая загружается с самого начала старта программы, все элементы из БД сразу отображаются в ListView. Задача следующяя: добавить в уже созданное окно - ещё 1 или несколько колонок с новой информацией для заполнения.
Пишу на чистом С с WinApi естественно.

Вот как это у меня:

Основная функция WndProc, в которой загружаются начальные элементы:
C++
1
2
3
4
5
hListView = CreateWindow(WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | LVS_REPORT | LVS_EDITLABELS, 10, 100, 800, 500, hWnd,(HMENU) ID_LISTVIEW, hInst, NULL);
 
        ListView_SetExtendedListViewStyle(hListView, LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP); // LVS_EX_FULLROWSELECT | 
        lvc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT;
        lvc.fmt  = LVCFMT_LEFT;
Так добавляю 9 колонок поочереди:
C++
1
2
3
4
lvc.iSubItem = 0;
        lvc.cx       = 80;
        lvc.pszText  = TEXT("№ Абонента");
        ListView_InsertColumn(hListView, 0, &lvc);
При выборе в комбобоксе нового поля и занесении нового имени отчётного периода - нажимается кнопка и волшебством, должна появиться новая колонка, но почему то это происходит не корректно.
Это я делаю так:
В case Button:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MessageBox(hWnd, cync, _T("СУБД загружена!"), MB_OK);
 
                    hListView = GetDlgItem(hWnd, ID_LISTVIEW);
 
                    lvc.iSubItem = 10;
                    lvc.cx       = 50;
                    lvc.pszText  = TEXT("Январь");
                    ListView_InsertColumn(hListView, 10, &lvc);
 
                    cyl=1;
 
                    for(int i=0;i<nl;i++)
                    {
                        lv.iItem = i;
                        ListView_InsertItem(hListView, &lv);
                        ListView_SetItemText(hListView, i, 10, per[i].jan);
                    }
                    InvalidateRect(hWnd, NULL, TRUE);
                    UpdateWindow(hListView);
Я вставил естественно только интересующий меня код, перед чем была сделанна загрузка основной бд и файла периода субд. Для примера в новую колонку будут заноситься только значения структуры per[i].jan
Где: nl - количество строк, которые должны быть заполнены;
Теперь что происходит в результате исполнения этого кода: Нажимаю кнопку, вылезает окошко с надписью "Субд загружена" и обновляется ListView, и я вижу, что все старые элементы ушли вниз, были созданы новые строки с пустыми значениями основных полей(естественно, они же должны были быть старыми значениями, которые непонятно почему ушли вниз списка) и создаётся новая колонка, она заполняется значениями как мне и нужно.
Но вот проблема именно в том, что старые поля ушли вниз ровно на nl строк в низ, а до загруженные данные уже отображаются в новых пустых строках с заполненным только одним последним элементом jan.
И кстати, название новой колонки не отображается. =(

Думал как бы решить хоть одну проблему, в итоге переместил код добавления колонки в основной WndProc,
причём сделать это нужно только когда нажата кнопка, т.е. использовать переменную cyl , которая изначально равна "0":
C++
1
2
3
4
5
6
7
if (cyl == 1)
        {
            lvc.iSubItem = 10;
            lvc.cx       = 65;
            lvc.pszText  = TEXT("Период");
            ListView_InsertColumn(hListView, 10, &lvc);
        }
эту часть кода я модифицировал проверкой элемента, который становится равным 1 когда кнопка нажимается. И естественно я убрал этот код из case Button

В итоге - тупо все строки съезжают на nl позиций вниз, новая колонка так и не показала своего имени, даже элементы не были добавлены в новые пустые поля "не созданной" новой колонки...

Кто поможет?

Щя поколдую, принты скину, а то ещё не разобрался у вас на форуме )

Добавлено через 36 минут
Вот опять часть задачи сам решил... видимо от праздников мозг опух =)
Получилось первым вариантом добиться до заполнения новой колонки элементами, теперь строки не съезжают!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
lvc.iSubItem = 10;
                    lvc.cx       = 50;
                    lvc.pszText  = TEXT("Январь");
                    ListView_InsertColumn(hListView, 10, &lvc);
 
                    cyl=1;
 
                    for(int i=0;i<nl;i++)
                    {
                        //lv.iItem = i;
                        //ListView_InsertItem(hListView, &lv);
                        ListView_SetItemText(hListView, i, 10, per[i].jan);
                    }
                    InvalidateRect(hWnd, NULL, TRUE);
                    UpdateWindow(hListView);
тупо закомментил 2 строчки... ну по логике думал )

Осталась всё же проблема, Имя новой колонки так и не вывелось, и размер новой колонки не 50, а 5 наверно...
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.01.2013, 09:48
Ответы с готовыми решениями:

Как открыть уже созданное окно?
Есть два окна, первое, форма авторизации, которая вызывает главное окно в случае пройденной авторизации. Как открыть уже созданное окно?

Добавление компонентов в окно, созданное через WinApi
Создается окно с помощью WinApi. Можно ли на это окно добавлять визуальные компоненты?

Добавление уже существующего grid-a в другое окно
у меня есть grid,на нем метки главное окно,я создал еще одно окно wpf и хочу в него добавить мой грид,как это сделать?

3
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,895
Записей в блоге: 11
02.01.2013, 19:40
Как минимум
C++
1
lvc.mask = ... | LVCF_TEXT | LVCF_WIDTH;
в коде создания новой колонки не присутствует.
0
188 / 120 / 4
Регистрация: 23.01.2010
Сообщений: 1,320
19.05.2014, 20:36
Цитата Сообщение от UI Посмотреть сообщение
в коде создания новой колонки не присутствует.
Подскажите что за фигня у меня - короче создал таблицу и столбики, в итоге они создаются но пока столбик мышкой не сдвинишь хоть в любую сторону текста нет?
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
19.05.2014, 23:22  [ТС]
Цитата Сообщение от n971030 Посмотреть сообщение
но пока столбик мышкой не сдвинишь
Потому что после изменения (SetItemText) надо UpdateWindow.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.05.2014, 23:22
Помогаю со студенческими работами здесь

Как добавить вновь созданное поле в уже готовую форму?
Подскажите пожалуйста возможен ли (и как это сделать) ввод нового поля в уже созданную форму. Т.е. в таблице добавила новое поле для...

не нашел FAQ. и как править свое уже созданное сообщение
Не нашел FAQ (помогите найти). И как править свое уже созданное сообщение?

Как отцентрировать созданное окно?
Загружается одно окно и создает небольшое второе. Как сделать так, чтобы оно было по центру монитора? Я выравниваю его с помощью left и...

Добавить QWebView на созданное QMainWindow окно
Создаем окно: QMainWindow* secondWindow = new QMainWindow(this); secondWindow-&gt;setGeometry(0,0,800,400); ...

Можно ли окно, созданное OpenWindow, сделать прозрачным?
Вопрос в теме.


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru