Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102

ListView - перехват события изменения ширины колонок

19.11.2020, 07:02. Показов 2067. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги программисты!
Подскажите, как организовать перехват события изменения ширины колонок для стандартного элемента ListView в VB6. Давненько где-то читал про сабклассинг контролов, похоже это как раз та самая тема, но я здесь полный нуб, а необходимость уже наступила.
Подобная тема была у дельфистов: TListView Событие при изменении ширины колонок, а для VB не нашел такой. Буду благодарен за примерчик.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.11.2020, 07:02
Ответы с готовыми решениями:

Обработчик события изменения ширины колонок StringGrid
Доброго всем дня! Вопрос собственно вытекает из названия темы. Как я понял стандартного event-а у StringGrida нет. Как можно реализовать...

ListView c автоизменением ширины колонок при увеличении размеров окна
Доброго времени суток. В моем приложении на стороне сервера есть ListView который занимает весь экран. в нем всего два столбца. Нужно чтобы...

Как запретить изменения размера колонок в ListView?
Как??

21
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
19.11.2020, 10:07
Лучший ответ Сообщение было отмечено Rh2Dark как решение

Решение

Код формы:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit
 
Private m_bSubclassInstalled    As Boolean
 
Private Sub Form_Load()
 
    m_bSubclassInstalled = SetWindowSubclass(lvwTest.hwnd, AddressOf SubclassWndProc, 1, ByVal 0&)
    
End Sub
 
Private Sub Form_Unload( _
            ByRef Cancel As Integer)
    
    If m_bSubclassInstalled Then
        
        RemoveWindowSubclass lvwTest.hwnd, AddressOf SubclassWndProc, 1
        
        m_bSubclassInstalled = False
        
    End If
    
End Sub
Код стандартного модуля:
Visual Basic
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
Option Explicit
 
Public Const WM_NOTIFY               As Long = &H4E
Public Const HDN_FIRST               As Long = -300&
Public Const HDN_BEGINTRACKW         As Long = (HDN_FIRST - 26)
Public Const HDN_ENDTRACKW           As Long = (HDN_FIRST - 27)
Public Const HDN_ITEMCHANGEDW        As Long = (HDN_FIRST - 21)
 
Public Type NMHDR
    hwndFrom    As Long
    idfrom      As Long
    code        As Long
End Type
 
Public Type NMHEADER
    hdr         As NMHDR
    iItem       As Long
    iButton     As Long
    pItem       As Long
End Type
 
Public Declare Function SetWindowSubclass Lib "comctl32" ( _
                        ByVal hwnd As Long, _
                        ByVal pfnSubclass As Long, _
                        ByVal uIdSubclass As Long, _
                        ByRef dwRefData As Any) As Long
Public Declare Function RemoveWindowSubclass Lib "comctl32" ( _
                        ByVal hwnd As Long, _
                        ByVal pfnSubclass As Long, _
                        ByVal uIdSubclass As Long) As Long
Public Declare Function DefSubclassProc Lib "comctl32" ( _
                        ByVal hwnd As Long, _
                        ByVal uMsg As Long, _
                        ByVal wParam As Long, _
                        ByVal lParam As Long) As Long
Public Declare Sub memcpy Lib "kernel32" _
                   Alias "RtlMoveMemory" ( _
                   ByRef Destination As Any, _
                   ByRef Source As Any, _
                   ByVal Length As Long)
 
Public Function SubclassWndProc( _
                ByVal hwnd As Long, _
                ByVal lMsg As Long, _
                ByVal wParam As Long, _
                ByVal lParam As Long, _
                ByVal uIdSubclass As Long, _
                ByVal dwRefData As Long) As Long
    
    Select Case lMsg
    Case WM_NOTIFY
        Dim tHdr    As NMHDR
        
        memcpy tHdr, ByVal lParam, LenB(tHdr)
 
        Select Case tHdr.code
        Case HDN_BEGINTRACKW, HDN_ITEMCHANGEDW, HDN_ENDTRACKW
            Dim tNmHdr  As NMHEADER
            
            memcpy tNmHdr, ByVal lParam, LenB(tNmHdr)
            
            Debug.Print "Index: "; tNmHdr.iItem
            
        End Select
 
    End Select
    
    SubclassWndProc = DefSubclassProc(hwnd, lMsg, wParam, lParam)
    
End Function
2
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
19.11.2020, 10:45  [ТС]
The trick, снимаю шляпу! Буду попробовать этот код.
Я вообще не понимаю, почему мелкомягкие это событие не стали реализовывать, часто же нужда возникает подобрать ширину колонок
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
19.11.2020, 10:51
Цитата Сообщение от Rh2Dark Посмотреть сообщение
часто же нужда возникает подобрать ширину колонок
Есть специальное сообщение которое автоматом подгоняет колонку. Не это ли нужно?
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
19.11.2020, 12:36
The trick, а можно это объединить в проект VB с описанием, скринштом по необходимости и с указанием авторских реквизитов?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
19.11.2020, 12:46
Argus19, а для чего? Это же не готовый пример, а просто набросок кода. Примеров сабклассинга куча, в том числе в этом разделе, которые более подходят на законченный пример.
0
 Аватар для Argus19
1427 / 444 / 78
Регистрация: 24.09.2017
Сообщений: 2,525
Записей в блоге: 22
19.11.2020, 14:22
Цитата Сообщение от The trick Посмотреть сообщение
а для чего?
Чтобы закончить работу с образом DVD диска, надо дополнить его кодами. Кодов PSC недостаточно. Я прошу всех поделиться своими кодами дли истории.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
19.11.2020, 14:34
Цитата Сообщение от Argus19 Посмотреть сообщение
Чтобы закончить работу с образом DVD диска, надо дополнить его кодами. Кодов PSC недостаточно. Я прошу всех поделиться своими кодами дли истории
Готовые решения и полезные коды на Visual Basic 6.0
0
19.11.2020, 18:18

Не по теме:

The trick, там много кодов, к которым необходимо написать хотя бы минимальное описание поэтому, готовыми их назвать никак нельзя.

0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
19.11.2020, 20:59
Argus19, смотри с конца.
0
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
20.11.2020, 11:51  [ТС]
В общем, протестировал я код... выводы такие: работает, но только для контролов из "Microsoft Windows Common Controls 5.0 (SP2)" (comctl32.ocx). Вся засада в том, что я использую контролы из "Microsoft Windows Common Controls 6.0 (SP6)" (mscomctl.ocx). Пробовал тупо изменить название "comctl32" на "mscomctl" - облом, "File not found: "mscomctl"". Странно, ведь компонент добавляется в проект и контролы тоже нормально добавляются на форму, в чем же тут засада?

Добавлено через 11 минут
Цитата Сообщение от The trick Посмотреть сообщение
Есть специальное сообщение которое автоматом подгоняет колонку. Не это ли нужно?
Это конечно не помешало бы, но первостепенная задача - отработать с ListView когда пользователь меняет ширину колонок.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
20.11.2020, 12:46
Цитата Сообщение от Rh2Dark Посмотреть сообщение
работает, но только для контролов из "Microsoft Windows Common Controls 5.0 (SP2)"
А если посмотреть в дебагере, какое событие tHdr.code вызывается при изменении ширины колонок именно вашего контрола?
Должно же там что то выдавать. Его и поставить в условие.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.11.2020, 13:23
Цитата Сообщение от Rh2Dark Посмотреть сообщение
что я использую контролы из "Microsoft Windows Common Controls 6.0 (SP6)" (mscomctl.ocx)
Для чего? Лучше использовать родные Win32 контролы чем mscomctl. MSCOMCTL это вообще не родные контролы (как минимум ListView), а написанные с нуля и не факт что они поддерживают уведомление и т.п. которые есть у стандартного ListView. comctl32 - это как раз и обертка над стандартными виндовыми контролами и нужно пользоваться ею по возможности.

Цитата Сообщение от Rh2Dark Посмотреть сообщение
Это конечно не помешало бы
LVM_SETCOLUMNWIDTH
0
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
20.11.2020, 21:11  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Лучше использовать родные Win32 контролы чем mscomctl
Родные довольно бедные на возможности, к тому же в ListView портятся иконки. У шестых с этим всё нормально, хоть и стили не поддерживают.

Добавлено через 1 минуту
Цитата Сообщение от Pro_grammer Посмотреть сообщение
А если посмотреть в дебагере, какое событие tHdr.code вызывается при изменении ширины колонок именно вашего контрола? Должно же там что то выдавать. Его и поставить в условие.
Я не настолько продвинут в этой области.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.11.2020, 21:19
Цитата Сообщение от Rh2Dark Посмотреть сообщение
Родные довольно бедные на возможности, к тому же в ListView портятся иконки. У шестых с этим всё нормально, хоть и стили не поддерживают.
Чем они бедные? 6-е с 2000 года не обновлялись, в отличие от родных.
0
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
21.11.2020, 11:19  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Чем они бедные?
Ну вот например свойства ListView на скрине - слева 5, справа 6

А вообще, мы немного отошли от темы. 6-е я уже использую в своих проектах, там многое завязано именно на их свойста, отличные от 5-х.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
21.11.2020, 11:22
Rh2Dark, все это есть и в стандартном ListView просто не реализовано через COM оболочку, но никто не запрещает использовать WINAPI.
0
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
21.11.2020, 11:24  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
просто не реализовано через COM оболочку, но никто не запрещает использовать WINAPI.
Вот да, не реализовано. А с API я до сих пор на ВЫ, так что я просто не знаю, как это делать.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
21.11.2020, 11:28
Rh2Dark, ну Вас не смущает использование WINAPI для отслеживания изменения ширины колонки. В стандартной комплектации куча возможностей не реализована в обоих листах. В любом случае при желании можно сделать свою оболочку для ListView в которой будут все нужные свойства и события.
0
 Аватар для Rh2Dark
32 / 32 / 0
Регистрация: 05.11.2020
Сообщений: 102
21.11.2020, 11:32  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
ну Вас не смущает использование WINAPI для отслеживания изменения ширины колонки
Да какое там... просто беру готовые примеры, подпиливаю напильником под свои нужды, но по сути я до конца не понимаю как это всё работает. А так то да, было бы неплохо свою обертку написать. Наверняка там были бы такие трюки, позволяющие проделывать вещи "доныне немыслимые"(др.Стрэндж)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.11.2020, 11:32
Помогаю со студенческими работами здесь

Автоматическое изменение ширины колонок в зависимости от ширины StringGrid
Здравствуйте, Уважаемые! Подскажите пожалуйста как написать процедуру, которая бы меняла ширину колонок в СтрингГриде при изменении ширины...

Фиксация ширины колонок
Всем доброе утро! Как можно зафиксировать ширину колонки в табличной части документа на обычной форме? Устанавливала ширину,...

Правильные бинды ширины колонок в TableView
Собственно, я уже несколько дней мучаюсь с этим, но никак решить проблему не получается В чём дело: У меня есть колонки в таблице,...

JTable сохранение ширины колонок пользователем
Добрый день, уважаемые коллеги :senor: Подскажите, пожалуйста, как реализовать JTable с возможностью автосохранения ширины колонок?...

Изменение ширины колонок табличной части документа
Нужна помощь. Помогите, как можно программно изменить ширину определенной колонки на форме документа в табличной части? В конфигураторе...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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
/ * Дана цепь постоянного тока с 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/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru