Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Treeview/Listview SetWindowTheme(hwndList, L"Explorer", NULL); / 9 сообщений из 9, страница 1 из 1
24.04.2010, 16:12
    #36596278
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Treeview/Listview SetWindowTheme(hwndList, L"Explorer", NULL);
Дмитрий77На Висте в некоторых программах (но далеко не всех) примеры: Почта Виндоус, Fax and Scan listview имеет какой-то другой вид, т.е. не только шапка по-вистовски, но и сами Items в Report выглядят по-вистовски, т.е. с закругленными выделениями-примечаниями и с голубой прозрачной подсветкой. Это как сделать? Или это вообще принципиально другой контрол?

Собственно, как это сделать на других языках я нашел, например:
http://www.codeproject.com/KB/vista/themedvistacontrols.aspx?msg=2780811

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//Imports the UXTheme DLL
[DllImport("uxtheme", CharSet = CharSet.Unicode)]
public extern static Int32 SetWindowTheme
        (IntPtr hWnd, String textSubAppName, String textSubIdList);

SetWindowTheme(listView1.Handle, "explorer", null);
'But there is more. In Windows Explorer, these ListViews have the semi-transparent selection as well.
'You can do this by calling the LVS_EX_DOUBLEBUFFER [0x00010000] extended style.
SendMessage(listview1.Handle, 0x1000 +  54 , 0x00010000, 0x00010000);
'Treeviews in Windows Explorer also have the fade effects. This can be achieved via the TVS_EX_FADEINOUTEXPANDOS [0x0040] extended style. 
SendMessage(treeview1.Handle, 0x1100 +  44 , 0x0020, 0x0020);
'The treeviews also have the "auto-scroll" feature. You can enable this via the TVS_EX_AUTOHSCROLL [0x0020] extended style. 
SendMessage(treeview1.Handle, 0x1100 +  44 , 0x0020, 0x0020);

Перевел, как смог, на VB6 (готовых примеров не накопал)

Код: plaintext
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.
Private Const LVM_FIRST = &H1000
Private Const LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + &H37
Private Const LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + &H36


Private Const LVS_EX_FULLROWSELECT = &H20
Private Const LVS_EX_DOUBLEBUFFER = &H10000
Private Const LVS_EX_BORDERSELECT = &H8000

' treeview window messages
Private Const TV_FIRST = &H1100
Private Const TVM_SETEXTENDEDSTYLE = TV_FIRST +  44 
Private Const TVM_GETEXTENDEDSTYLE = TV_FIRST +  45 
Private Const TVS_EX_FADEINOUTEXPANDOS = &H40 '?????
Private Const TVS_EX_AUTOHSCROLL = &H20 '?????


Private Declare Function SetWindowTheme Lib "uxtheme" (ByVal hwnd As Long, _
    ByVal pszSubAppName As String, ByVal pszSubIdList As String) As Long

'Private Declare Function SetWindowTheme Lib "uxtheme" (ByVal hwnd As Long, _
'    ByVal pszSubAppName As String, Optional ByVal pszSubIdList As Long = 0) As Long

Private Sub Form_Load()
    Dim lStyle As Long
 ...
    SetWindowTheme ListView1.hwnd, "explorer", vbNull
    SetWindowTheme TreeView1.hwnd, "explorer", vbNull


    lStyle = SendMessage(ListView1.hwnd, LVM_GETEXTENDEDLISTVIEWSTYLE,  0 ,  0 )
    lStyle = lStyle Or LVS_EX_FULLROWSELECT Or LVS_EX_DOUBLEBUFFER 'Or LVS_EX_BORDERSELECT
    Call SendMessage(ListView1.hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE,  0 , ByVal lStyle)

    lStyle = SendMessage(TreeView1.hwnd, TVM_GETEXTENDEDSTYLE,  0 ,  0 )
    lStyle = lStyle Or TVS_EX_FADEINOUTEXPANDOS Or TVS_EX_AUTOHSCROLL
    Call SendMessage(TreeView1.hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE,  0 , ByVal lStyle)

Пока не фурычит.
Предполагаю ошибки в
Private Declare Function SetWindowTheme

а также в константах
Private Const TVS_EX_FADEINOUTEXPANDOS = &H40 '0x0040
Private Const TVS_EX_AUTOHSCROLL = &H20 '0x0020

Манифест естественно внедрен и испытания на Висте.
Идеи будут?
...
Рейтинг: 0 / 0
24.04.2010, 16:25
    #36596285
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Treeview/Listview SetWindowTheme(hwndList, L"Explorer", NULL);
Собственно надо (бы) вот так:
http://www.vbforums.com/showthread.php?t=537725
Код: plaintext
1.
2.
3.
Public Declare Unicode Function SetWindowTheme Lib "uxtheme.dll" _
(ByVal hWnd As IntPtr, ByVal pszSubAppName As String, ByVal pszSubIdList As String) As Integer 
'In Form_Load:
SetWindowTheme(lst.Handle, "explorer", Nothing)
Только где ж я этот Unicode воткну?
...
Рейтинг: 0 / 0
24.04.2010, 16:54
    #36596301
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Treeview/Listview SetWindowTheme(hwndList, L"Explorer", NULL);
Фу,...фу-фу-фу вот так прокатило.

Код: plaintext
1.
2.
3.
4.
Private Declare Function SetWindowTheme Lib "uxtheme" (ByVal hWnd As Long, _
    ByVal pszSubAppName As Long, ByVal pszSubIdList As Long) As Long

    SetWindowTheme ListView1.hWnd, StrPtr("explorer"),  0 
    SetWindowTheme TreeView1.hWnd, StrPtr("explorer"),  0 
Вопрос типа снят.
...
Рейтинг: 0 / 0
24.04.2010, 17:14
    #36596321
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Treeview/Listview SetWindowTheme(hwndList, L"Explorer", NULL);
Дима, ты в таких дебрях лазишь, хоть сбрось какую-то демку, что-бы
полюбоватся, ради каких красот все эти изыскания :)


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25.04.2010, 00:29
    #36596587
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Treeview/Listview SetWindowTheme(hwndList, L"Explorer", NULL);
Игорь,
не обижайтесь, но не привык везде и всюду раскрывать все карты.
На этом форуме я любитель VB6, на другом форуме я "специалист" по VOIP, например.
В рамках данного сообщества стараюсь вести себя честно.
В смысле стараюсь не хапать лишь, а также и отдавать. Т.е. если нашел решение сам (а в половине случаев оно так и получается), то найду минутку и опубликую результат.
Если неправ, поправьте.
...
Рейтинг: 0 / 0
25.04.2010, 09:53
    #36596694
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Treeview/Listview SetWindowTheme(hwndList, L"Explorer", NULL);
Дмитрий, у меня не было никаких претензий, ты задаешь не тривиальные вопросы
и как правило приходишь к какому-то решению и мне было интересно посмотреть
на программу, которая включает в себя результат такого упорного труда. Но
если нет, то нет и без всяких обид :)


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25.04.2010, 16:30
    #36596989
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Treeview/Listview SetWindowTheme(hwndList, L"Explorer", NULL);
Но тестовым (уже рабочим) примером по теме поделюсь.
Treeviw/Listview

Но сразу задам вопрос.
Все работает но есть проблема с ListView.
1) Если использовать LVS_EX_DOUBLEBUFFER (глюк виден на любой OS системе при запуске exe из-под манифеста, explorer стиль не причем). Делаем Form_resize или просто убираем форму на панель задач/восстанавливаем, headers в reportview не перересовываются, по ним надо пройтись мышкой, чтоб они снова нарисовались.
2) Если не использовать LVS_EX_DOUBLEBUFFER, особых минусов на Висте я не заметил, то с headers все нормально, но возникает другая проблема: при раздвижении столбцов не перерисовывается сам ListView, в нижней области где Items отсутствуют (веер из вертикальных разделителей столбцов). Это видно на Висте.

Т.к. Microsoft настойчиво рекомендует использовать LVS_EX_DOUBLEBUFFER для explorer-стиля (якобы там чего-то мерцает меньше, я не заметил), то видимо надо копать проблему 1. Либо я что-то не допонял, либо...
в большом проекте у меня ListView сабклассятся, можно попробовать перерисовывать hwnd(header).
Но сабклассятся не все ListView, увлекаться сабклассингом бы не хотелось...

Или наплевать на рекомендацию, убрать LVS_EX_DOUBLEBUFFER и перерисовывать сам ListView, но блин опять сабклассить, ибо как иначе отследить изменение ширины колонки.

P.S. И опять мой вопрос. Как файлики то тут правильно прикладывать?
...
Рейтинг: 0 / 0
25.04.2010, 22:57
    #36597420
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Treeview/Listview SetWindowTheme(hwndList, L"Explorer", NULL);
Дмитрий771) Если использовать LVS_EX_DOUBLEBUFFER (глюк виден на любой OS системе при запуске exe из-под манифеста, explorer стиль не причем). Делаем Form_resize или просто убираем форму на панель задач/восстанавливаем, headers в reportview не перересовываются, по ним надо пройтись мышкой, чтоб они снова нарисовались.

Лекарство в общем-то несложное:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Declare Function RedrawWindow Lib "user32" (ByVal hWnd As Long, _
   lprcUpdate As Any, ByVal hrgnUpdate As Long, ByVal fuRedraw As Long) As Long

Public Sub DrawHeaders()
    'перерисовка,ибо сам не удосуживается это сделать
    Dim pvHeaderhWnd As Long
    pvHeaderhWnd = SendMessageLong(ListView1.hwnd, LVM_GETHEADER,  0 ,  0 )
    Call RedrawWindow(pvHeaderhWnd, ByVal  0 &, ByVal  0 &, RDW_INVALIDATE Or RDW_FRAME Or RDW_UPDATENOW)
End Sub
Вопрос только когда это лекарство применять:
1)попробовал при form_paint, помогает во многих случаях
2)потом понял что надо еще когда items добавляются
3)потом добавил еще в ColumnClick
4) потом понял что если есть HScroll, то при перемещении ползунка влево-вправо headers опять стираются. В принципе поборолся через WM_PAINT самого listview, но как-то не очень красиво

и все это полумеры...не лечащие причину неперерисовки headers. Надо как-бы отрыть собаку, а не пытаться ее зарывать еще глубже, все равно при каких-то обстоятельствах завоняет.
И потом если уж рассчитывать на сабклассинг,
то хочу понять, на какое WM_ЧТО??? я должен рассчитывать чтобы понять что ListView сам обновился, и время сделать DrawHeaders() ибо злоупотребление перерисовкой потребляет ресурсы и нехорошо заметно.


А что касается LVS_EX_DOUBLEBUFFER , то к стилю explorer он никакого отношения не имеет и его м.б. имеет смысл применять даже на XP на классике, ибо он сильно снижает мелькалку при перерисовке формы и обновлениях ListView.

Но с этим глюком проще от него вообще отказаться и м.б. делать ListView.Refresh при раздвижении колонок, даже не знаю...
...
Рейтинг: 0 / 0
26.04.2010, 03:40
    #36597601
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Treeview/Listview SetWindowTheme(hwndList, L"Explorer", NULL);
Дмитрий77И потом если уж рассчитывать на сабклассинг,
то хочу понять, на какое WM_ЧТО??? я должен рассчитывать чтобы понять что ListView сам обновился
Плохо проверял,у меня до этого сабклассились только header-ы, и я сдуру залепил перерисовку в WM_PAINT хидеров, все действительно лечится через WM_PAINT самого ListView.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub Form_Load()
 
    OldListWindowProc = SetWindowLong(ListView1.hwnd, GWL_WNDPROC, _
        AddressOf NewListWindowProc)


Public Function NewListWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    'для событий listview
    If (Msg = &HF) Then 'WM_PAINT
        'Debug.Print "WM_PAINT"
        Form1.RedrawHeaders
    End If
    NewListWindowProc = CallWindowProc( _
        OldListWindowProc, hwnd, Msg, wParam, _
        lParam)
End Function

Непонятно правда почему оно по-умолчанию так себя ведет.
LVS_EX_DOUBLEBUFFER действительно лучше применять на всех OS.
Один мелкий глюк пока вижу на Висте, если строка выделена то точечки фокуса(если клавиатура уже применялась) при form_resize (стиль explorer) немного смазываются при авто-перерисовке, но думаю на это можно пока забить или оставить на потом...
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Treeview/Listview SetWindowTheme(hwndList, L"Explorer", NULL); / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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