powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выборочное отображение 'примечаний' в ListView
9 сообщений из 9, страница 1 из 1
Выборочное отображение 'примечаний' в ListView
    #36463837
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ListView.
Много строк, много столбцов (таблица).
Не во всех "ячейках" текст всегда умещается.
Можно конечно раздвигать столбцы при необходимости, но это не удобно.
Удобнее при наведении мышки на ячейку дублировать содержимое в примечании.
Использую обычно такой код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Private Sub List1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    On Error Resume Next
    List1.HitTest(x, y).ToolTipText = List1.HitTest(x, y).Text
    List1.HitTest(x, y).List1( 1 ).ToolTipText = List1.HitTest(x, y).ListSubItems( 1 )
    List1.HitTest(x, y).ListSubItems( 2 ).ToolTipText = List1.HitTest(x, y).ListSubItems( 2 )
    List1.HitTest(x, y).ListSubItems( 3 ).ToolTipText = List1.HitTest(x, y).ListSubItems( 3 )
    List1.HitTest(x, y).ListSubItems( 4 ).ToolTipText = List1.HitTest(x, y).ListSubItems( 4 )
End Sub
Минус этого метода в том, что примечание отображается всегда, куда не тыкнись. А хотелось бы чтобы только тогда, когда текст "не поместился", т.е. отображается не
Text
а
Example of long t...
(Троеточие я так понимаю всегда добавляется в таких случаях автоматически).

Иными словами, надо что-то типа
Код: plaintext
1.
2.
3.
4.
if ( List1.HitTest(x, y).ListSubItems( 4 ) уместилось)
  List1.HitTest(x, y).ListSubItems( 4 ).ToolTipText = ""
else 'не уместилось
  List1.HitTest(x, y).ListSubItems( 4 ).ToolTipText = List1.HitTest(x, y).ListSubItems( 4 )
endif

Есть ли какой-нибудь простой прием, понятно что высчитывать вероятность попадания в завис. от ширины столбца и размера шрифта желания нету.
...
Рейтинг: 0 / 0
Выборочное отображение 'примечаний' в ListView
    #36463913
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравнить ширину колонки со значением TextWidth(List1.HitTest(x, y).ListSubItems(4)). Функция TextWidth является методом формы, поэтому шрифт формы и ListView должен быть одинаковым.

Jah loves you.
...
Рейтинг: 0 / 0
Выборочное отображение 'примечаний' в ListView
    #36464019
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> Есть ListView.
> Есть ли какой-нибудь простой прием, понятно что высчитывать вероятность попадания в завис. от ширины столбца и
> размера шрифта желания нету.

Это просто
Ставиш стиль LVS_OWNERDRAWFIXED, подсовываеш свою Wnd_Proc в которой ловиш сообщение WM_DRAWITEM. В lParam будет
структура
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
typedef struct tagDRAWITEMSTRUCT {
UINT CtlType;
UINT CtlID;
UINT itemID;
UINT itemAction;
UINT itemState;
HWND hwndItem;
HDC hDC;
RECT rcItem;
ULONG_PTR itemData;
} DRAWITEMSTRUCT; 
Элемент, которой RECT rcItem будет содержать размеры области для вывода текста или чего угодно.
Потом с помощью функции GetTextExtentPoint32 вычисляешь размеры прямоугольника, необходимого для вывода текста и если
длина больше чем есть, показываешь хинт

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Выборочное отображение 'примечаний' в ListView
    #36464215
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Antonariy
> Сравнить ширину колонки со значением TextWidth(List1.HitTest(x, y).ListSubItems(4)). Функция TextWidth является
> методом формы, поэтому шрифт формы и ListView должен быть одинаковым.

О! А это, на VB, оказывается делается ещё проще :D

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Выборочное отображение 'примечаний' в ListView
    #36464524
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сложным советом не воспользовался, не стоит оно думаю здесь того, Wnd_Proc у меня там и так хватает.
Сделал как по-простому.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub ListView1_MouseMove(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim i As Integer
    Screen.MousePointer = vbDefault
    On Error Resume Next
    For i =  1  To  12 
        If ListView1(Index).ColumnHeaders(i +  1 ).Width < TextWidth(ListView1(Index).HitTest(x, y).ListSubItems(i)) Then
            ListView1(Index).HitTest(x, y).ListSubItems(i).ToolTipText = ListView1(Index).HitTest(x, y).ListSubItems(i)
        Else
            ListView1(Index).HitTest(x, y).ListSubItems(i).ToolTipText = ""
        End If
    Next i
End Sub

Терпимо, но не совсем уж точно.
Шрифт везде Ms Sans Serif, на форме 8, на Listwiew он мне ляпает 8,25
Код не срабатывает если "обрезано несильно". Неточности ф-ции?
М.б. к правой части неравенства, где TextWidth чего-нибудь приплюсовать, или умножить на коэффициент какой (Эта идея мне не особо нравится).
Вообще-то поведение очень похоже на поведение "родных" виндузовских прог.
Т.е. "так оставить"? Или надо "дорабатывать"? Как по уму?
...
Рейтинг: 0 / 0
Выборочное отображение 'примечаний' в ListView
    #36465053
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Form1.Font = ListView1.Font

Jah loves you.
...
Рейтинг: 0 / 0
Выборочное отображение 'примечаний' в ListView
    #36465518
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
это куда запихнуть, в form_load? или в mouse move?
вообще-то они и так заданы одинаковы,
8.25 и 8 это фактически одно и то же,и шрифт тот же
там просто флуктуации гораздо большие получаются, т.е. код срабатывает, когда сдвигаю почти на сантиметр, извините это конечно по обывательски выразился.
...
Рейтинг: 0 / 0
Выборочное отображение 'примечаний' в ListView
    #36465769
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно при старте. И можно прибавлять/вычитать какую-нибудь константу, чтобы уменьшить флуктуации.

Jah loves you.
...
Рейтинг: 0 / 0
Выборочное отображение 'примечаний' в ListView
    #36468162
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
>Можно при старте
ну это не помогло, потому как видимо 8=8,25 в данном случае, итак все установлено одинаково

>И можно прибавлять/вычитать какую-нибудь константу, чтобы уменьшить флуктуации.
До вашего совета у меня ничего не получалось.
Но попробовав еще раз, и "повыводив" значения флуктуаций остановился на след. варианте:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Sub ListView1_MouseMove(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim i As Integer
    Screen.MousePointer = vbDefault
    On Error Resume Next
    For i =  1  To  12 
        If (ListView1(Index).ColumnHeaders(i +  1 ).Width -  170 ) < TextWidth(ListView1(Index).HitTest(x, y).ListSubItems(i)) Then
            ListView1(Index).HitTest(x, y).ListSubItems(i).ToolTipText = ListView1(Index).HitTest(x, y).ListSubItems(i)
        Else
            ListView1(Index).HitTest(x, y).ListSubItems(i).ToolTipText = ""
        End If
    Next i
End Sub

Вроде все прилично, но кабы не перестараться, дай бог чтоб эта разница вела себя стабильно а не прыгала.
Хотя...плевать...максимум чем я рискую, это выводом примечаний где необязательно, что у меня и было раньше...замечу глюки уберу поправку.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выборочное отображение 'примечаний' в ListView
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]