Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872

Многострочный subitem в ListView

15.09.2011, 17:19. Показов 2886. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ListView в Tile-режиме. Subitem отображается только в одну строку. Но т.к. текст там, возможно будет длинным, хотелось бы вписать его в несколько строк, используя только Windows API.
Не самым удобным, но, в принципе, приемлемым вариантом будет автоматическое изменение столбца под длину текста.
Заранее признателен за советы.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.09.2011, 17:19
Ответы с готовыми решениями:

Многострочный Edit
Вопрос заключается вот в чём: Есть ли сообщения для edit'а (многострочного) для перехода на нужную строку(или хотябы на...

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

Вывести в Edit многострочный текст
Я вожусь с Edit контролами. Создал контрол -> поставил в стили WS_MULTILINE (чтобы можно было писать в несколько строк), и использую...

2
 Аватар для xAtom
935 / 760 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
17.09.2011, 15:34
Лучший ответ Сообщение было отмечено GrayWolf как решение

Решение

Всё что в голову пришло от заданой задачи, изменение размера столбца по самой длинной строке.
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <windows.h>
#include <commctrl.h>
#pragma comment (lib,"comctl32.lib")
#define ID_VIEW  1001   // идентификатор элемента ListView
 
LRESULT CALLBACK  WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void add_column(HWND view, WCHAR* str, int index);
void add_row(HWND view, WCHAR* str, int index);
 
 
int WINAPI  WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) {
    MSG       msg;
    HWND      wnd;
    WNDCLASSW clas;
 
    InitCommonControls();
 
    ZeroMemory(&clas,  sizeof(WNDCLASSW));
    clas.style         = CS_HREDRAW | CS_VREDRAW;
    clas.lpfnWndProc   = (WNDPROC) WndProc;
    clas.hInstance     = hInstance;
    clas.hCursor       = LoadCursor(NULL, IDC_ARROW);
    clas.hbrBackground = (HBRUSH)(COLOR_WINDOW + 11);
    clas.lpszClassName = L"SampleListView";
    if(! RegisterClassW(&clas))
        ExitProcess(1u);
    
    wnd = CreateWindowW(L"SampleListView", L"ListView", WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
    if(! wnd)
         ExitProcess(2u);
    ShowWindow(wnd, SW_SHOW);
    UpdateWindow(wnd);
 
    while (GetMessageW(&msg, NULL, 0, 0)) {
           DispatchMessageW(&msg); 
           TranslateMessage(&msg);
    }
    return 0;
}
 
LRESULT CALLBACK  WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    RECT rect;
    int i, tmp, imaxch = 0;
    static HWND lview;
    WCHAR* rows[3] = {
               L"Судьба - это снятый фильм.", 
               L"Только разум способен автономно жить.", 
               L"Чем отличается интеллект от цитат."
    };
 
    switch(msg) {
       case WM_CREATE: 
            GetClientRect(hwnd, &rect);
            // создаём ListView
            lview = CreateWindowW(WC_LISTVIEW, L"", WS_CHILD | LVS_REPORT | LVS_EDITLABELS, 
                                               10, 10, rect.right-20, rect.bottom-20, hwnd, (HMENU)ID_VIEW,
                                               (HINSTANCE)GetModuleHandle(NULL), NULL); 
            ShowWindow(lview, SW_SHOW);
            // устанавливаем свои цвета
            SendMessage(lview, LVM_SETTEXTCOLOR, 0,(WPARAM)0x000FF000);
            SendMessage(lview, LVM_SETBKCOLOR, 0, (WPARAM)0x00440000);
            SendMessage(lview, LVM_SETTEXTBKCOLOR, 0,(WPARAM)0x00440000);
 
            add_column(lview, L"Заумные фразы", 0);  // добавляем столбец
 
            for(i = 0u; i < 3u; i++) {
                     add_row(lview, rows[i], i); // строки
                     // узнаём длину текста
                     tmp = ListView_GetStringWidth(lview, rows[i]);
                      if(tmp > imaxch)// если больше
                               imaxch = tmp; // сохраняем максимум
             }
             // изменить ширину столбца по максимуму
             ListView_SetColumnWidth(lview, 0, imaxch + 10);
              break;
             case WM_DESTROY:
                   DestroyWindow(lview);
                   PostQuitMessage(0u);
                   break;
             default: return DefWindowProcW(hwnd, msg, wParam, lParam);
           }
           return 0;
}
 
// добавление столбцов
void add_column(HWND view, WCHAR* str, int index) {
  LV_COLUMNW  col;
  ZeroMemory(&col, sizeof(LV_COLUMNW));
  col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
  col.fmt = LVCFMT_LEFT; 
  col.cx  = 50; 
  col.iSubItem  = index;
  col.pszText  = str;
  col.cchTextMax = lstrlenW(str);
  ListView_InsertColumn(view, 0, &col);
}
 
// добавление строк
void add_row(HWND view, WCHAR* str, int index) {
  LV_ITEMW item;
  ZeroMemory(&item, sizeof(LV_ITEMW));
  item.mask = LVIF_TEXT | LVIF_STATE;
  item.iItem = index;
  item.pszText  = str;
  item.cchTextMax = lstrlenW(str);
  ListView_InsertItem(view, &item);
}
1
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
17.09.2011, 16:10  [ТС]
Хотелось бы решить вопрос именно многострочной строкой в subitem - так будет более корректно по отношению к пользователю. Но все равно спасибо за ответ.
Пока разбирался, обнаружил что у ListView есть пара макросов: один возвращает длину строки в символах, а второй определяет ширину этой строки в пикселах. При небольшой корректировке (я просто добавил 32 к результату выполнения последнего макроса) и проверке при разных размерах шрифта экрана, в принципе, результат удовлетворил.
Но вопрос оставляю открытым, может кто-то сталкивался с подобной проблемой. Поиск в интернете почти ничего не дал.

P.S. Сначала написал, а потом уже прочитал код У меня чуть покороче, но суть та же.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.09.2011, 16:10
Помогаю со студенческими работами здесь

Многострочный ввод текста в диалоговом окне
Добрый день. Вопрос собственно в том как сделать многострочный ввод текста в диалоговых окнах? Во время создание диалогового окна а...

ListView SubItem
Всем привет! Расскажите пожалуйста как заполнять SubItem в виджете ListView. Мне нужно к обычному Item, который реализован вот так: ...

Поиск subitem в ListView
ListView разделен на 3 столбца. name, password, domain. есть textbox для поиска. на данный момент получаеться искать только по первому...

Не выводится SubItem в ListView
Приветствую. Такая вот проблема у меня образовалась. Стряпал с некой помощью вот такой адаптер (но сам понимаю что он слишком...

Как добавить в ListView subitem
Есть компонент ListView, при его добавлении в активити он показывает список: Item1 subitem1 ну и т.д. Как добавить эти самые...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
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, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru