nesco, а попробуйте вместо HDN_ITEMCHANGED, отпускание сплитера заголовка HDN_ENDTRACKW (код = -327). Будет событие при изменении размера столбца курсором только после отпускания кнопки мыши.
Этот топик читают: Гость
Ответов: 2309
Рейтинг: 679
|
|||
карма: 11 |
|
Разработчик
Ответов: 26194
Рейтинг: 2136
|
|||
sla8a писал(а): Будет событие при изменении размера столбца курсором только после отпускания кнопки мышиПроверил. Действительно, срабатывает только на отпускание мыша, а если устанавливать ширину програмно, то не срабатывает. Хорошо, а если установили програмно, то такое событие не нужно ![]() |
|||
карма: 22 |
|
Ответов: 2309
Рейтинг: 679
|
|||
sla8a писал(а): если установили програмно, то такое событие не нужно ![]() |
|||
карма: 11 |
|
Разработчик
Ответов: 26194
Рейтинг: 2136
|
|||
Но есть один недостаток этого метода -- ширина столбца выдается предыдущая. Те ширина гарантированно меняется только после HDN_ITEMCHANGED. Увы, но событие HDN_ENDTRACK не пойдет
|
|||
карма: 22 |
|
Ответов: 2309
Рейтинг: 679
|
|||
nesco писал(а): Увы, но метод HDN_ENDTRACK не пойдет |
|||
карма: 11 |
|
Разработчик
Ответов: 26194
Рейтинг: 2136
|
|||
sla8a писал(а): у меня выдавало ширинуПредыдущую. Я проверил -- событие HDN_ENDTRACK выдается перед HDN_ITEMCHANGED. Но я влепил тригер на это событие, и дело сдвинулось |
|||
карма: 22 |
|
Ответов: 2309
Рейтинг: 679
|
|||
Вот так можно ширину получить при HDN_ENDTRACK:
sla8a писал(а): Правда два раза, первый старое, второй раз новое значение |
|||
карма: 11 |
| ||
Голосовали: | nesco |
Разработчик
Ответов: 26194
Рейтинг: 2136
|
|||
Только остался один маленький недостаток -- свойство таблицы LVColWidth примет это значение ширины только после HDN_ENDTRACK, перед HDN_ITEMCHANGED. Да и для чего вообще нужно событие ChangeWidth, я до конца и не понял
![]() |
|||
карма: 22 |
|
Ответов: 2309
Рейтинг: 679
|
|||
nesco писал(а): Да и для чего вообще нужно событие ChangeWidth, я до конца и не понял ![]() На подобии вот этого: code_33963.txt |
|||
карма: 11 |
| ||
файлы: 1 | code_33963.txt [745B] [557] |
Разработчик
Ответов: 26194
Рейтинг: 2136
|
|||
sla8a писал(а): А вмести с событием HDN_ITEMCHANGINGW ничто не помешает разработчику сделать многоуровневый заголовокПока я не совсем в это въехал. Но вот последние изменения таблицы, попробуй на ней реализовать то, что ты написал -- himtstrtbl_001.zip |
|||
карма: 22 |
| ||
файлы: 1 | himtstrtbl_001.zip [11.2KB] [389] |
Ответов: 2309
Рейтинг: 679
|
|||
По этой схеме будет думаю понятно о чем речь: code_33965.txt
Измените размеры столбцов и кнопки (имитирующие верхний ряд заголовка) подстроятся. Приделать сплитер к кнопкам тоже вроде не сложно. На данный момент недостатки: Нет события на двойной клик по сплитеру заголовка. И нет события на сдвиг горизонтальной полосы прокрутки. Но все это тоже можно добавить. |
|||
карма: 11 |
| ||
файлы: 1 | code_33965.txt [3KB] [567] |
Разработчик
Ответов: 26194
Рейтинг: 2136
|
|||
sla8a писал(а): По этой схеме будет думаю понятно о чем речьПонятно. Но причем здесь HDN_ITEMCHANGINGW ![]() |
|||
карма: 22 |
|
Ответов: 2309
Рейтинг: 679
|
|||
nesco, могу ошибиться, но вроде как HDN_ITEMCHANGINGW происходит как onMouseMove, а HDN_ENDTRACK как onMouseUp. HDN_ITEMCHANGINGW, должен сообщать что пользователь изменяет ширину столбцов, а уже программно по этому событию подгонять свой дополнительный заголовок. К примеру сверху таблицы устанавливается PaintBox и на нем рисуется все необходимое. Или же подгонять обычные интерфейсные элементы, как на примере выше.
Так же для этих целей нужен HDN_DIVIDERDBLCLICKW (код -325) двойной клик по сплитеру заголовка. После этого действия ширина столбца уменьшается, тоже желательно событие после этого сообщения. |
|||
карма: 11 |
|
Разработчик
Ответов: 26194
Рейтинг: 2136
|
|||
sla8a писал(а): но вроде как HDN_ITEMCHANGINGW происходит как onMouseMoveи как это вяжется вот с этим sla8a писал(а): HDN_ITEMCHANGINGW, должен сообщать что пользователь изменяет ширину столбцовКак связаны MouseMove и изменение ширины столбцов ![]() ------------ Дoбавленo в 02.58: Короче, никакой MouseMove не происходит при HDN_ITEMCHANGING. Он работает точно так же, как и HDN_ITEMCHANGED, только выдает значение перед изменением ------------ Дoбавленo в 03.00: sla8a писал(а): Так же для этих целей нужен HDN_DIVIDERDBLCLICKW (код -325) двойной клик по сплитеру заголовкаИ как это совместить с запретом изменения ширины столбцов ![]() Ладно, завтра подумаю. Но я бы все-таки отказался от сообщения HDN_ENDTRACK и использовал бы его только как триггер для сообщения HDN_ITEMCHANGED, те выдавать событие наружу после уже гарантированного изменения ширины. |
|||
карма: 22 |
|
Ответов: 2309
Рейтинг: 679
|
|||
nesco писал(а): Короче, никакой MouseMove не происходит при HDN_ITEMCHANGING. Он работает точно так же, как и HDN_ITEMCHANGED, только выдает значение перед изменениемВставляем такой код:
По умолчанию в винде эти события все же происходят. Эту у нас с вами они отключены. У меня XP и включить их могу так: Нажимаю клавиши Win+PauseBreak, а дальше по картинки: ![]() У меня ведь получилось заблокировать изменения ширины столбцов и даже отображение курсора над сплитером удалось убрать. Если у вас получится обнаружить событие при сдвиге вертикального скролла (когда ширина всех столбцов больше ширины компонента), то можно будет попробовать сделать отдельный элемент для создания собственных заголовков столбцов. |
|||
карма: 11 |
| ||
файлы: 3 | win_setting.png [31.5KB] [582], himtstrtbl_test_sla8a.zip [13.6KB] [329], code_33980.txt [288B] [314] |