Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выборочное отображение 'примечаний' в ListView / 9 сообщений из 9, страница 1 из 1
11.02.2010, 16:56
    #36463837
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборочное отображение 'примечаний' в ListView
Есть 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
11.02.2010, 17:13
    #36463913
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборочное отображение 'примечаний' в ListView
Сравнить ширину колонки со значением TextWidth(List1.HitTest(x, y).ListSubItems(4)). Функция TextWidth является методом формы, поэтому шрифт формы и ListView должен быть одинаковым.

Jah loves you.
...
Рейтинг: 0 / 0
11.02.2010, 17:39
    #36464019
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборочное отображение 'примечаний' в ListView
> Автор: Дмитрий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
11.02.2010, 18:28
    #36464215
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборочное отображение 'примечаний' в ListView
> Автор: Antonariy
> Сравнить ширину колонки со значением TextWidth(List1.HitTest(x, y).ListSubItems(4)). Функция TextWidth является
> методом формы, поэтому шрифт формы и ListView должен быть одинаковым.

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
11.02.2010, 23:17
    #36464524
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборочное отображение 'примечаний' в ListView
Сложным советом не воспользовался, не стоит оно думаю здесь того, 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
12.02.2010, 10:41
    #36465053
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборочное отображение 'примечаний' в ListView
Form1.Font = ListView1.Font

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

Jah loves you.
...
Рейтинг: 0 / 0
14.02.2010, 02:38
    #36468162
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборочное отображение 'примечаний' в ListView
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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Выборочное отображение 'примечаний' в ListView / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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