Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
1 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 41

C++ Win32 api ListView при добавлении строки

25.08.2015, 10:33. Показов 5662. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Подскажите в чем проблема. При заполнении ListView получается смещение записей. Например ввожу три раза разные данные
1. 1,1,1
2. 2,2,2
3. 3,3,3
Получается как на картинке.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
case IDOK:
        {           Mystruct objPersonal;
        int iItem;
        iItem = SendMessage(hList, LVM_GETITEMCOUNT, 0, 0);
                     SendMessage((GetDlgItem(hDlg, IDC_EDIT1)),WM_GETTEXT,100, (LPARAM)objPersonal.Familiya);
                     SendMessage((GetDlgItem(hDlg, IDC_EDIT4)), WM_GETTEXT, 100, (LPARAM)objPersonal.Names);
                     SendMessage((GetDlgItem(hDlg, IDC_EDIT3)), WM_GETTEXT, 100, (LPARAM)objPersonal.Otchesto);
 
                     LvItem.mask = LVIF_TEXT;   // Text Style
                     LvItem.cchTextMax = 256; // Max size of test
                     LvItem.iItem = iItem;          // choose item  
                     LvItem.iSubItem =0;       // Put in first coluom
                     LvItem.pszText = objPersonal.Familiya;
                     SendMessage(hList, LVM_INSERTITEM, 0, (LPARAM)&LvItem);
                     LvItem.iItem = iItem;
                     LvItem.pszText = objPersonal.Names;
                     LvItem.iSubItem = 1;
                     SendMessage(hList, LVM_SETITEM, 0, (LPARAM)&LvItem);
                     LvItem.iItem = iItem;
                     LvItem.pszText = objPersonal.Otchesto;
                     LvItem.iSubItem = 2;
                     SendMessage(hList, LVM_SETITEM, 0, (LPARAM)&LvItem);
                     EndDialog(hDlg, LOWORD(wParam));
                     return (INT_PTR)TRUE;
        }
                     break;
Вот так вот создан ListView:
C++
1
2
3
4
5
List = CreateWindowEx(NULL, WC_LISTVIEW, "", WS_VISIBLE | WS_CHILD |
            WS_BORDER | LVS_REPORT | LVS_EDITLABELS |LVS_EX_FULLROWSELECT, 0, 0, rc.right - rc.left, rc.bottom - rc.top,  hWnd, (HMENU)IDC_LIST, hInst, NULL);
        
        ListView_SetExtendedListViewStyle(hList,
            LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.08.2015, 10:33
Ответы с готовыми решениями:

Как при добавлении новой строки в ListView изменить высоту строки?
Всем привет! В одной теме я решил совместить несколько вопросов, но по общей теме. 1) Как в листвью при добавлении новой строки...

Почему при добавлении строки в listview запускается посторонняя функция?
После listView1.Items.Add(tb.Text) Сразу запускается код public class ListViewSorter : System.Collections.IComparer { ...

Binding к ListView при добавлении информации
Всем добрый вечер! Пытаюсь сделать bindig к listview при добавлении объектов на форме. Сделал класс, сделал коллекцию. Подскажите...

13
1 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 41
26.08.2015, 06:08  [ТС]
Так как я написал это не по фэншую)).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
case IDOK:
 
        {   
                     Mystruct objPersonal;
                     int iItem;
                     iItem = SendMessage(GetDlgItem(hWnd, IDC_LIST), LVM_GETITEMCOUNT, 0, 0);
                     SendMessage((GetDlgItem(hDlg, IDC_EDIT1)),WM_GETTEXT,100, (LPARAM)objPersonal.Familiya);
                     //MessageBox(NULL, objPersonal.Names, "", NULL);
                     SendMessage((GetDlgItem(hDlg, IDC_EDIT4)), WM_GETTEXT, 100, (LPARAM)objPersonal.Names);
                     SendMessage((GetDlgItem(hDlg, IDC_EDIT3)), WM_GETTEXT, 100, (LPARAM)objPersonal.Otchesto);
                     LvItem.mask = LVIF_TEXT;   // Text Style
                     LvItem.cchTextMax = 256; // Max size of test
                     LvItem.iItem = iItem;          // choose item  
                     LvItem.iSubItem = 0;       // Put in first coluom
                     LvItem.pszText = objPersonal.Familiya; // Text to display (can be from a char variable) (Items)
                     ListView_InsertItem(GetDlgItem(hWnd, IDC_LIST), &LvItem);
                     ListView_SetItemText(GetDlgItem(hWnd, IDC_LIST), 0, 1, objPersonal.Names);
                     ListView_SetItemText(GetDlgItem(hWnd, IDC_LIST), 0, 2, objPersonal.Otchesto);
                     EndDialog(hDlg, LOWORD(wParam));
                     return (INT_PTR)TRUE;
        }
                     break;
Вот так вот все работает.

Добавлено через 14 часов 44 минуты
Возник другой вопрос. В IDC_EDIT1 ввести данные которые уже есть то получается опять смещение в ListView. Что не так?
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
27.08.2015, 13:33
LvItem.iItem = iItem; это будет последний элемент/строка
ListView_SetItemText(GetDlgItem(hWnd, IDC_LIST), 0, 1, objPersonal.Names); - а это первый.
Я тебе советую сначала добавлять пустой Item (в 0 субитем), а потом забивать по столбцам текст.
0
1 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 41
27.08.2015, 14:58  [ТС]
LvItem.iItem = iItem; это будет последний элемент/строка
А разве при добавлении в пустой Listview это не правильно? Брал пример вот такой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
case IDC_BOTH:
{
  int itemIndex,j;
  char iSubItemText[100]="";
  char iItemText[100]="";
 
  itemIndex=SendMessage(hList,LVM_GETITEMCOUNT,0,0);   // number of items
 
  GetDlgItemText(hWnd,IDC_ADD,iItemText,100);          // get text
  GetDlgItemText(hWnd,IDC_ADDSUB,iSubItemText,100);    // get text
 
  // we enter text to the editboxes?
  if((lstrlen(iSubItemText) && lstrlen(iItemText))==0) 
  {
    MessageBox(hWnd,"Please Write Some Text",
           "Error",MB_OK|MB_ICONINFORMATION);
    break;
  }
 
  LvItem.iItem=itemIndex;            // item will be put at itemIndex
  LvItem.iSubItem=0;                 // adding item, no need subitems
  LvItem.pszText=iItemText;          // set pointer to the item text
  SendMessage(hList,LVM_INSERTITEM,0,(LPARAM)&LvItem); // put it
 
  for(j=1;j<=5;j++) // add 5 subitems
  {
    LvItem.pszText=iSubItemText;   // Text to display
    LvItem.iSubItem=j;            // Put in coluom at index j
 
    SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem); // put it :)
  }
}
break;
ListView_SetItemText(GetDlgItem(hWnd, IDC_LIST), 0, 1, objPersonal.Names); - а это первый.
Как я понял из примера то это получается добавление субитема (второй столбец).


Я тебе советую сначала добавлять пустой Item (в 0 субитем), а потом забивать по столбцам текст.
Пример можно на основе моего кода??
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
27.08.2015, 15:47
Смотри:
LvItem.iItem = iItem; iItem равен количеству элементов (строк) к ListView. Значит что? Значит что ты вставишь новый элемент в конец.
Далее:
ListView_SetItemText(GetDlgItem(hWnd, IDC_LIST), 0, 1, objPersonal.Names); второй параметр, равный нулю, определяет (zero-based) номер элемента над которым ты совершаешь манипуляции, а именно изменяешь содержимое субитемов.
В итоге: вставил в конец, изменил первый.
ListView_SetItemText(GetDlgItem(hWnd, IDC_LIST), iItem , 1, objPersonal.Names); вот так будет правильно. Ты добавишь элемент и изменишь содержимое его субитемов.
Цитата Сообщение от sedoi_starik Посмотреть сообщение
Пример можно на основе моего кода??
C++
1
2
3
4
5
6
7
HWND hList = GetDlgItem(hWnd, IDC_LIST);
LvItem.mask = 0;
LvItem.iItem = iItem; 
ListView_InsertItem(hList, &LvItem);
ListView_SetItemText(hList, iItem, 0, objPersonal.Familiya);
ListView_SetItemText(hList, iItem, 1, objPersonal.Names);
ListView_SetItemText(hList, iItem, 2, objPersonal.Otchesto);
1
1 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 41
27.08.2015, 18:20  [ТС]
О да. Вот я затупил. Спасибо.

Добавлено через 51 минуту
Что то не работает
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
27.08.2015, 18:29
LvItem.iSubItem = 0; добавь
Хотя это, по моему мнению, избыточно, ибо только с 0 в субитеме эта функция имеет смысл.
0
1 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 41
27.08.2015, 18:36  [ТС]
Вот так вот это все работает:
C++
1
2
3
4
5
6
LvItem.mask = LVIF_TEXT;   // Text Style
LvItem.iItem = iItem;      // choose item  
ListView_InsertItem(hLists, &LvItem);
ListView_SetItemText(hLists, 0, 0, objPersonal.Familiya);
ListView_SetItemText(hLists, 0, 1, objPersonal.Names);
ListView_SetItemText(hLists, 0, 2, objPersonal.Otchesto);
Добавлено через 2 минуты
Спасибо что пнул в нужном направлении))
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
27.08.2015, 18:45
Цитата Сообщение от sedoi_starik Посмотреть сообщение
LvItem.mask = LVIF_TEXT;
Вот это говорит что поле pszText указывает на строку с текстом. А по факту куда указывает? В никуда. У меня твой код не заработал.
0
1 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 41
27.08.2015, 18:53  [ТС]
Через четвертый аргумент функции ListView_SetItemText мы передаем pszText, наверно LvItem.mask = LVIF_TEXT; и означает это.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
27.08.2015, 19:01
ListView_SetItemText не принимает LvItem, посмотри. Короче у тебя компилятор походу нулями инициализирует структуру LVITEM, раз субитем сразу 0 равен.
0
1 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 41
27.08.2015, 19:24  [ТС]
Вот что на стадии выполнения
0
1 / 1 / 2
Регистрация: 13.06.2013
Сообщений: 41
27.08.2015, 20:04  [ТС]
У меня даже при LvItem.mask = 0; все работает отлично.

Добавлено через 36 минут
ListView_InsertItem(hLists, &LvItem); А вот тут же передаем структуру? Или я не прав. А уже потом добавляем текст.

Добавлено через 2 минуты
LvItem.iItem = iItem; Указывает в структуру строку, а потом передаем в структуру LvItem в hList. А потом шлем текст в hList. Ну как то так наверно. Могу ошибаться.
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
28.08.2015, 16:25
Цитата Сообщение от sedoi_starik Посмотреть сообщение
А потом шлем текст в hList.
Текст можешь слать прямо при добавлении. Но если при добавлении Item'а subitem != 0, то ничего не получится, т.к. нет Item'а, то и subitem'а тоже нет, а значит добавлять текст некуда. Фактически рассматривай ListView как список файлов (лол, у explorer'а как раз он их отображает) - нет файла (item), нет его свойств (subitem).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2015, 16:25
Помогаю со студенческими работами здесь

Не прокручивать ListView при добавлении в него данных
Добрый день! Подскажите пожалуйста. Делаю программу. В ней есть функционал на подобии чата. Т.е. новые сообщения снизу, старые...

Дублирование столбцов в listview при добавлении строчки
У меня сейчас лопнет голова!!! Помогите пожалуйста! Как сохранить listview в xml я нашла, успешно сохраняется и загружается первая...

Подергивание ListView в режиме VirtualMode при добавлении элемента
Здравствуйте. Для начала стоит заметить, что более забагованного контрола в винформах встречать не приходилось. Причем одни и те же...

Непонятная ошибка (разрушительный сбой) при добавлении в ListView
хочу изменить содержание элемента по индексу в listview но выводит ошибку wtf?? изза чего это???

Не отображает элементы ListView-а при добавлении туда файлов
Здравствуйте! Я создал две формы. В обоих есть ListView. Первая из них - главная - должна послужить файловым контейнером, элементы...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
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 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru