powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / xp/vista style; common controls 5/6; regsvr32 на x86/x64
62 сообщений из 62, показаны все 3 страниц
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36572637
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот здесь обсуждался вопрос:
/topic/740043&pg=1
Был предложен контрол
Konst_Oneназывается он UpDown
Было также упомянуто, что не удается придать ему XP/Vista стиль.
Причину я нашел довольно быстро:
я везде использую Common Controls 6 (глючные, как кто-то тут выразился), а они не поддерживают стили через манифесты.
Если использовать Common Controls 5, то вопрос со стилями решается.
Я не стал разводить полемику по этому поводу, не было времени, но сейчас думаю вернуться к данной теме. Тот контрол, бог с ним, но я использую всякие Listview/Treeview в большом к-ве и надо бы с ними разобраться.
Т.е. для придания приложению правильных стилей мне надо заменить контролы на 5-ю версию.
Вопрос с заменой на API я не рассматриваю, т.к. кодов много и это не тривиально.

И в связи с этим несколько вопросов.
1) Существует ли удобный способ замены/преобразования?
Т.е. понятно, что сначала добавлю \'5\', и когда все заменю, удалю \'6\'.
Но меня смущает сам процесс замены отдельно взятого контрола, ибо он может быть сильно напичкан свойствами, можно конечно и на бумажку переписать, но долго и надо аккуратно, чтоб не упустить ничего.

2) Как правильно установить(и удалить) COMCTL32.OCX (и ей подобные) на произвольную систему (возможны XP/Vista/Win2003/2008,в перспективе Win7(но пока не рассматриваю) и любая комбинация x86/x64).
Дело в том что с MSCOMCTL.OCX (6-я версия) я особо не парился, просто бухал в папку с программой при установке и все работало, при этом никаких глюков при установке и никакой самодеятельности на пользовательском компьютере. И это прекрасно прокатывает даже на x64-висте.
А что касается COMCTL32.OCX то ей надо делать regsvr32, причем cmd на Vista x64 пришлось запускать "от Админа". Насколько я понимаю эти тонкости, мой инсталлятор итак всегда запускается из-под админа, но все же я задумался...

Куда класть COMCTL32.OCX? В папку программы? Или в System32? Если в System32, то на x64 в System32 или в SysWOW64? И надо ли ее удалять? (если в System...?) А если она уже была до моей установки? И опять же надо ли делать regsvr32 /u (а вдруг была?) И не пошлет ли произвольная система мой инсталлер куда подальше с такими действиями? А вот ругань при установке мне меньше всего нужна...
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36572846
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе поигрался с инсталлятором (Smart Install Maker) на тестовом приложении из одного exe:
Есть 2 опции
I. Файл
1) Путь извлечения
2) Если файл существует: Спросить/Спросить если новее/Заменить/Заменить если новее/Пропустить
3) Деинсталировать: ДА/нет
II. ActiveX
1) Файл
2) Разрегистрировать при деинсталляции: ДА/нет

Остановился на варианте:
I. Файл
1) Путь извлечения =%SystemDir%\COMCTL32.OCX
2) Если файл существует:Пропустить
3) Деинсталировать: ДА
II. ActiveX
1) Файл=%SystemDir%\COMCTL32.OCX
2) Разрегистрировать при деинсталляции: нет

На x64 COMCTL32.OCX файл отправляется в SysWOW64, что наверно корректно.

Возникают 3 ситуации:
1) COMCTL32.OCX уже был в %SystemDir% и был зарегистрирован:
при установке ничего не меняется и пользуемся имеющимся файлом
при деинсталляции опять ничего не меняется, т.е. COMCTL32.OCX не удаляется и не разрегистрируется,т.е. все остается как было.
2) COMCTL32.OCX уже был в %SystemDir% но НЕ БЫЛ зарегистрирован:
при установке регистрируется имеющийся файл, им и пользуемся
при деинсталляции COMCTL32.OCX не удаляется но остается зарегистрированным
3) COMCTL32.OCX НЕ БЫЛО в %SystemDir%
при установке берется НАШ файл и регистрируется
при деинсталляции наш COMCTL32.OCX физически УДАЛЯЕТСЯ, хотя регистрация и остается, но бесполезна за отсутствием файла.

Вопросы все же по этой части остались:
Если файл существует:Пропустить
Опции "Спросить/Спросить если новее" меня не устраивают, это некрасиво и потом...передоверять юзеру ответ на вопрос с ответом на который сам сомневаешься... как то неправильно
Опции "Заменить/Заменить если новее" ??? Когда я пытался так поступать с cdosys.dll, виста элементарно ругалась, но в том случае я просто в итоге отказался от установки cdosys.dll, т.к. оно обязано присутствовать на всех OS начиная с XP и правильный для каждой OS.
Т.е. если "Заменить" то система со мной не поругается?
А если "Пропустить", то не рискую нарваться на неправильную версию? (понятно, что случай, когда user взял файл Г.ocx и переименовал его в COMCTL32.OCX не рассматривается..)

Разрегистрировать при деинсталляции: нет
Скажем так, если я напишу "ДА", то моя прога при удалении удалит регистрацию существовавшую до ее установки. Как то неправильно
А с другой стороны если я устанавливаю и регистрирую СВОЙ файл, то он удалиться, а регистрация останется, мусор в реестре...

Я сам ненавижу когда чья-то прога при установке слишком много на себя берет, а при удалении не умеет "вынести за собой мусор" (если вообще умеет себя удалить, есть экземпляры которые вообще не делают uninstall, не обязательно вирусы).
Хотелось бы конечно каких-то комментариев от тех кто на этом собак кушал.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36573544
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
системные библиотеки обычно не требуют деинсталяции. чисти только папку со своей программой.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36573606
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Существует ли удобный способ замены/преобразования?Открыть в текстовом редакторе *.vbp и заменить строку Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0; mscomctl.ocx на Object={6B7E6392-850A-101B-AFC0-4210102A8DA7}#1.3#0; COMCTL32.OCX.

В файлах *.frm заменить аналогичные строки в заголовках, а так же все строки типа MSComctlLib.TreeView на ComctlLib.TreeView.

Это не решит все проблемы сразу, но по крайней мере сэкономит 90% времени. Если у вас используется тулбар с SubMenu, то их придется переложить на обычные менюшки, потому что у оригинального тулбара никаких субменю нет. Других архитектурных отличий нет, разве что у некоторых объектов отсутствуют некоторые редко используемые свойства.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36575217
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneсистемные библиотеки обычно не требуют деинсталяции. чисти только папку со своей программой.
Т.е. вы предлагаете:
Код: plaintext
1.
Деинсталировать: НЕТ
Разрегистрировать при деинсталляции: НЕТ
?
остается поверить Вашему опыту.
А что ваш опыт говорит по поводу
Код: plaintext
Если файл существует: Заменить/Заменить если новее/Пропустить
?
Вариант "Пропустить" кажется мне наиболее безопасным. А не получится что там какое-нибудь непотребное старье лежит? (повторюсь, вариант что там лежит переименованная Г.ocx не рассматривается, ибо если таковая там лежит, то user "сам дурак").
Повторюсь также что любого варианта "заменить" я побаиваюсь, т.к. не хочу нарваться на "системную ругань" при инсталляции.

AntonariyДмитрий77Существует ли удобный способ замены/преобразования?Открыть в текстовом редакторе ....
В принципе я и сам так подумывал, за четкие инструкции чего на что менять спасибо.
AntonariyЕсли у вас используется тулбар с SubMenu, ....
Таковых не держим, есть только с кнопочками...
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36575273
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77
Возникают 3 ситуации:
1) COMCTL32.OCX уже был в %SystemDir% и был зарегистрирован:

Если файл более младшей версии находился и был зарегистрирован в каталоге: Ё:\У бабушки на печке\ то программа инсталлятора должна заменить его новой версией именно в этой папке.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36575304
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, бабушку с печкой можно и подвинуть...
только бабушки-дедушки отдыхают...
мне уже не до этого.
Потому что я сделал то что предложил Antonary и ужаснулся тому чего увидел.
Кнопки на Тулбар стали обычными, но это бог с ним...не самое страшное

Самые большие проблемы вижу с Listview...
FullRawSelect не вижу, многого не вижу.
У меня все алгоритмы с перестановкой столбцов основаны на....
ListView1(0).ColumnHeaders("Name").Position
что ж ее перерисовывать теперь каждый раз...
с картинками в заголовках столбцов проблемы...
ListSubItems(i). и т.п. не работатает...
.ListSubItems(i).ToolTipText

Я в печали....
6-ки м.б. и глючные но интеллекта поболе будет и я этим интеллектом сильно воспользовался при написании проги.

Неужели никак их нельзя со стилями подружить?

Т.е. какие варианты?
1) частичная замена 6->5, чтоб хоть что-то выглядело потребно, как то не то...
2) постепенная замена на API, ну эт.я замучаюсь с Listview
3) замена все же всего на 5 и дописывание через API, можно конечно, но опять кучу всего писать и все равно кучу всего изучать

а приложение этими сабклассами над контролами итак перегружено...

90% экономии времени это мягко сказано...до того как я это сделал (за 15 минут), я тоже думал что это и будет основная проблема.

Всего то нужно чтоб стили применялись, м.б. есть какое другое решение, не требующее переписывания 2/3 кодов, которые к сути-то программы не относятся.
М.б. есть современные какие контролы, аналог 6, но с поддержкой всех этих манифестов.

5-ку то в 6-ку небось легче превратить..
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36575820
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКнопки на Тулбар стали обычнымиА какими были? Хорошо бы скриншоты какие-нибудь.

авторFullRawSelect не вижуНужно с помощью апи добавить стиль LVS_EX_FULLROWSELECT (&H20). Это просто.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
pvSetExStyle ListView1.hWnd, LVS_EX_FULLROWSELECT, True

Private Sub pvSetExStyle(ByVal hWnd As Long, ByVal lStyle As Long, ByVal ToSet As Boolean)
Dim lS As Long
    If (m_hListView) Then
        lS = SendMessageLong(hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE,  0 ,  0 )
        If ToSet Then
            lS = lS Or lStyle
        Else
            lS = lS And Not lStyle
        End If
        Call SendMessageLong(hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,  0 , lS)
    End If
End Sub
авторУ меня все алгоритмы с перестановкой столбцов основаны на....LVCOLUMN.iOrder — это чуть сложнее, готового примера нет.

авторс картинками в заголовках столбцов проблемыКакие?

авторListSubItems(i). и т.п. не работатает...
Код: plaintext
ListView.ListItems(x).SubItems(i) = "это текст овое свойство, а не объектное"

автор.ListSubItems(i).ToolTipTextПожалуй, это самое сложное по сравнению с предыдущими пунктами. Но в принципе тоже ерунда.

автор3) замена все же всего на 5 и дописывание через API, можно конечно, но опять кучу всего писать и все равно кучу всего изучатьЭто лучший вариант.

автор90% экономии времени это мягко сказано...до того как я это сделал (за 15 минут), я тоже думал что это и будет основная проблема.Поверьте, это все равно быстрее, чем если бы вы взялись пересоздавать все руками. Быстрее только оставить все как было.

авторМ.б. есть современные какие контролы, аналог 6, но с поддержкой всех этих манифестов.Что-то есть на vbaccelerator, но не советую.

Все, что вы видите на скриншоте, это пятые контролы, приправленные api (крестик закрытия таба в контролы не входит, сам рисую). По-моему овчинка выделки стоит.

Jah loves you.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36575953
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
>>Кнопки на Тулбар стали обычными
>А какими были? Хорошо бы скриншоты какие-нибудь.
Да что скриншоты...
http://sql.ru/forum/actualthread.aspx?tid=750468
Плоским я сделал, но надо уменьшить высоту 420->360 (видимо в точках) иначе сверху вплотную к меню (как и было) а снизу большой зазор до Treeview/Listview.
(высота кнопки 330). 420 он лепит минимум для стандартных кнопок.
С этим промучился так и не нашел ответа...

>>У меня все алгоритмы с перестановкой столбцов основаны на ListView1(0).ColumnHeaders("Name").Position...
>LVCOLUMN.iOrder — это чуть сложнее, готового примера нет.

А вот это если не осилю, то грош цена...
Она у меня загружает со статическими индексами а все position запоминает в реестре и применяет сразу после загрузки или переставляет при настройке последовательности столбцов
я пока это отключил при загрузке, чтоб хотя бы запустить в компиляторе, но это боюсь основная проблема

Потом ширина первого столбца (где только иконка) почему-то прыгнула, пока не выяснял.

>Нужно с помощью апи добавить стиль LVS_EX_FULLROWSELECT (&H20).
с этим уже разобрался в первую очередь довольно быстро

С картинками и примечаниями разобраться думаю не сложно, но это потом.
Пока что задачи.
1) чтоб Запускалась в компиляторе
2) Чтоб закрывалась без вылета (в реестре запоминает несуществующие position)
3) Чтоб компилировалось

На пункте (3) думаю большинство глюков отловится.
Ну а потом играться и смотреть на глюки...

>>3) замена все же всего на 5 и дописывание через API, можно конечно, но опять кучу всего писать и все равно кучу всего изучать
>Это лучший вариант.
Лучший то он лучший, но это читай переписывать прогу с нуля. Надо все же сделать замену 6->5, получить рабочую прогу, а от контролов можно потом отказываться последовательно (по настроению), т.е. например StatusBar просто , а с Listview (у меня их 3шт-массив и сильно накручены) черт ногу сломит, поэтому отказаться в лоб это пуля в голову. Ну и если меня когда-либо хватит на все это, то в итоге убрать ссылку на контролы.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576024
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Konst_Oneсистемные библиотеки обычно не требуют деинсталяции. чисти только папку со своей программой.
Т.е. вы предлагаете:
Код: plaintext
1.
Деинсталировать: НЕТ
Разрегистрировать при деинсталляции: НЕТ
?.

нет, Я предлагаю регистрировать только новые версии системных библиотек исключительно в системных директориях. При деинсталляции их вообще не трогать.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576171
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

я написал
Код: plaintext
1.
Деинсталировать: НЕТ
Разрегистрировать при деинсталляции: НЕТ
вы пишите
Код: plaintext
При деинсталляции их вообще не трогать.
Это разве не одно и то же?

вы пишите
Код: plaintext
исключительно в системных директориях
я написал
Код: plaintext
 1 ) Путь извлечения =%SystemDir%\COMCTL32.OCX
То же самое?

вы пишите
Код: plaintext
Я предлагаю регистрировать только новые версии системных библиотек 
так предлагаете?
Код: plaintext
1.
 1 )Если файл существует: Заменить если новее
 2 )+зарегистрировать (даже если замены не было)
так ведь?
Пункт (2) во первых будет выполнен по-любому (в инсталляторе в ActiveX опции либо регистрировать, либо нет), а во вторых это правильно,т.к. вдруг там новая версия лежит и она не зарегистрирована.

Если так то что думаете по поводу возможной ругани системы при замене файла?
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576268
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПункт (2) во первых будет выполнен по-любому (в инсталляторе в ActiveX опции либо регистрировать, либо нет), а во вторых это правильно,т.к. вдруг там новая версия лежит и она не зарегистрирована

это делать не надо. если не заменяли, то ничего и не делаем
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576415
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
так заменить и регистрировать это независимые пункты.
(нет опции не регистрировать если не заменяли)

и потом регистрировать по любому разумно. Я когда-то бухнул ocx в system, регистрировать не стал, и забыл про нее. А инсталлер ее увидит, заменять не станет и регистрировать тоже не станет. И что?

У меня другая проблема возникла (с одной-главной формой).
Картиночки везде вдруг раз-все "черненько"-образные. Думал ресурся съелись, перегрузил VB, перегрузил PC-не помогает. Мувнул опять из резервной копии проекта (где "6") эту форму в подопытный проект, заменил все на "5" в блокноте. Работает, картинки цветные. Поковырялся с кодами, запустил, опять чернота. (exe даже пока скомпилировать не могу из-за проблем с кодами, чтоб посмотреть чего там будет:цветное или черное). В чем проблема?
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576422
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без тестового примера сказать сложно.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576670
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
легко сказать, предлагаете сделать тестовый из одного тулбара 6, переделать в 5 и посмотреть чего будет, вряд ли это воспроизведется. Вчера игрался такого не было. Я даже не могу exe сделать, пока не перепишу хорошую часть кодов, а это работа надолго. Ну допустим перепишу с черными картинками, потом перекину опять 6 в 5 и заменю коды в форме на то что переписал, но это ж повторится, а если буду дорабатывать проект уже с "5".? не дело...
Причем происходит как-то внезапно (сохранение даже не обязательно), но если раз произошло то не помогает уже ничего, т.е. даже на другом pc этот проект уже показывает черные.
Скорее всего внутренние ресурсы vb где-то на грани.
Можно конечно попробовать вручную пересоздать ImageList-ы. Посмотреть, что будет.
...уже посмотрел, добавил ImageList с двумя цветными картинками, цветными они были очень недолго, и главное эта скотина автосохраняет эту дрянь в этом непотребном виде.
Мне кажется слишком много всего в приложении, 5-е контролы не выдержат. Они гораздо более глючные чем 6-е.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576708
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Они гораздо более глючные чем 6-е.Вы не любите кошек? Вы просто не умеете их готовить )))
Я пришел к противоположному выводу.

Jah loves you.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576814
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да люблю я их готовить...
Даже с этим справился...
>>У меня все алгоритмы с перестановкой столбцов основаны на....
>LVCOLUMN.iOrder — это чуть сложнее, готового примера нет.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    If (StartParam.InPositionIcon >=  1 ) And (StartParam.InPositionIcon <=  13 ) Then
        With lvFormat
            .mask = LVCF_ORDER
            .iOrder = CInt(StartParam.InPositionIcon) -  1 
        End With
        Call SendMessage(ListView1( 0 ).hWnd, LVM_SETCOLUMN, ListView1( 0 ).ColumnHeaders("Icon").Index -  1 , lvFormat)
    End If
'    If (StartParam.InPositionIcon >= 1) And (StartParam.InPositionIcon <= 13) Then
'        ListView1(0).ColumnHeaders("Icon").Position = CInt(StartParam.InPositionIcon)
'    End If
и т.д. по тексту

а толку...эти почерневшие иконки меня вконец расстроили
Это признак нехватки ресурсов. Но ресурсы есть,если бы их не было,я бы получил "Out memory" в куче других прог. И с "6" такого никогда не было. А на тестовом приложении я вам это не покажу, потому что там будет один тулбар и один ImageList и им всегда все хватит.
А фиг его знает, м.б. в форме много кода, м.б. еще чего, м.б. сабклассинги на "5" случайно так действуют.

>замена все же всего на 5 и дописывание через API, можно конечно, но опять кучу всего писать и все равно кучу всего изучать
>Это лучший вариант.

Ну лучший наверно оставлять 6-ку и постепенно переписывать на API. Потому как заменить на "5" означает все разбомбить, кое-как запустить и потом долго восстанавливать из руин.

Кошки это хорошо, но на тек. момент больше хочется выть от безысходности. Вы мне там где-то давали контролы через API, пойти чтоль посмотреть, но это не на пару дней как надеялся через 5 (надежда еще теплится, но все меньше).
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576840
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько у вас форм в проекте?

Попробуйте создать новый проект, подключить пятые контролы, скопипастить на форму ImageList с этими черными иконками и то, что там у вас с ним связано.

Jah loves you.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576841
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77а толку...эти почерневшие иконки меня вконец расстроили
Это признак нехватки ресурсов. Но ресурсы есть,если бы их не было,я бы получил "Out memory" в куче других прог.
Почерневшие иконки это может быть признак нехватки GDI+ ресурсов? В частности там было ограничение на 9999(по моему) открытых дескриптора в рамках одного приложения. Сам на это нарывался.
Попробуй посмотреть в task manager'e
Закладка "Процессы", в меню "Вид" пункт "Выбрать столбцы", там поставить птицу на "Объекты GDI"

Ы?
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576846
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и ещё помниться была какая-то засада с цветностью иконки, которую помещаешь в imagelist, из-за этого она портилась при сохранении проекта
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576944
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneи ещё помниться была какая-то засада с цветностью иконки, которую помещаешь в imagelist, из-за этого она портилась при сохранении проектаImageList из ocx не поддерживает 32 бита.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576958
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Сколько у вас форм в проекте?
11штук, но проблема возникает только в основной, и только с ImageList-ами, и только после конвертации в версию 5, ну собственно все картинки в основном в них и сидят.
>скопипастить на форму ImageList с этими черными иконками и то, что там у вас с ним связано
цветным оно уже не станет даже в другом проекте.


>Попробуй посмотреть в task manager'e... "Объекты GDI"
попробовал
в среде разработки при запуске и вообще показывает 1200-1230 неважно "6" или "5".
Скомпилированный exe ("6") выдает в 2 раза меньше т.е.620-630.

>была какая-то засада с цветностью иконки, которую помещаешь в imagelist, из-за этого она портилась при сохранении проекта
для мелких стараюсь использовать 256цветов ибо делать больше в vb6 накладно, а меньше соотв. неэстетично.
Но данный глюк возникает не при сохранении а после нескольких просто запусков, но потом уже не лечится никак.
Возникло первый раз после того как
поигрался с кодом что привел выше (вместо .Position)
возможно после того как закомментировал сохранение этих position в реест при закрытии (до того как я это сделал VB у меня просто вылетал при закрытии вместе с компилятором из-за несоответствия кода 5 и 6, но глюка с иконками не было).
М.б. какое неосвобождение ресурсов при корректном именно закрытии приложения.
Для получения черного эффекта надо запутить и закрыть приложение (не среду) несколько раз.
Надо б поиграться конечно, свеже конвертированную форму только запомнить, чтоб каждый раз не переделывать... М.б. почему-то получается 1200*8=>9999 надо отследить...
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36576995
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77>Сколько у вас форм в проекте?
11штук, но проблема возникает только в основной, и только с ImageList-ами, и только после конвертации в версию 5, ну собственно все картинки в основном в них и сидят.11 форм — это скромный проект, нехватки ресурсов или переполнения GDI быть не может.
Дмитрий77>скопипастить на форму ImageList с этими черными иконками и то, что там у вас с ним связано
цветным оно уже не станет даже в другом проекте.
Вот я и хочу на это посмотреть.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36577146
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

У меня это произошло на простецком приложении с одной формой
Я просто делал анимацию иконки в трее, приложение было сервисом, и иконка обеспечивала связь с космосом. Приложение писал на NET в 2005 студии. Как потом выяснилось загрузка иконки в объект наращивала счетчик GDI дескрипторов, а уничтожение объекта не приводило к освобождению использованного дескриптора.
Игорь Горбоносв общем переделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private bmp( 0  To  1 ) As Icon
' Загружаю в начале
bmp(0) = Drawing.Icon.FromHandle(New Bitmap(ImageList1.Images.Item(0)).GetHicon)
bmp(1) = Drawing.Icon.FromHandle(New Bitmap(ImageList1.Images.Item(1)).GetHicon)
...
' Потом просто меняю иконку
Try
            Me.NotifyIcon1.Icon.Dispose()
            Me.NotifyIcon1.Icon = bmp(bFlag)
            'bmp.Dispose()
        Catch ex As Exception
            Me.NotifyIcon1.Visible = False
            Me.NotifyIcon1.Visible = True
            Me.NotifyIcon1.Icon.Dispose()
            Me.NotifyIcon1.Icon = bmp(bFlag)
            'bmp.Dispose()
        End Try
...
и счетчики замерли на 48 :) А чего только не перепробовал
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36577166
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VB6 в этом плане больше защищен от дурака. Нужно делать что-то уж совсем непотребное непосредственно через gdi, чтобы добиться такого эффекта. Или забывать выгружать навороченные динамические юзерконтролы.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36577377
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДмитрий77>скопипастить на форму ImageList с этими черными иконками и то, что там у вас с ним связано
цветным оно уже не станет даже в другом проекте.
Вот я и хочу на это посмотреть.
Я отослал вам на e-mail.
test6-это чистая "6", скопированная из оригинала чистой 6-ки
test5-это переделка 6->5 через блокнот + внутри ф-ция плоских кнопок и на всяк.случай в архиве эта же переделка но сразу после переделки, мне один раз удалось испортить даже в этом тесте

как испортил?
предположения:
был запущен большой проект 5, но как не крутил повторить не удалось
м.б. банально чуть попутал кавычки и пробелы в заголовке "5"-ки, в форме там кавычки и пробелы

GDI/gdi+ как бы в большом проекте используется не хило(из моих топиков с участием Бенедикта вам несложно это понять) , но на 6-ках никаких глюков никогда не было, думаю это ни причем.

TestBlack это собственно уже копия из большого проекта в чистую 5-ку после того как все уже произошло
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36577427
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-па! глюк происходит все-таки при сохранении.
Но не обязательно при первом сохранении, и не обязательно при первом запуске после рокового сохранения. Это ввело в заблуждение. Т.е. ресурсы походу вообще ни при чем, а причем:
AntonariyДмитрий77Существует ли удобный способ замены/преобразования?Открыть в текстовом редакторе *.vbp и заменить строку Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0; mscomctl.ocx на Object={6B7E6392-850A-101B-AFC0-4210102A8DA7}#1.3#0; COMCTL32.OCX.

В файлах *.frm заменить аналогичные строки в заголовках, а так же все строки типа MSComctlLib.TreeView на ComctlLib.TreeView.

Это не решит все проблемы сразу, но по крайней мере их создаст.

Никоим образом не обвиняю.Сам так хотел поступить
Значит че, надежней вооружиться карандашиком и блокнотиком (а лучше двумя мониторами и двумя PC, с этим хотя бы проблем нет) и вперед,добавляем 5-ку, меняем колеса по одному с проверкой промежуточных результатов. Под конец удаляем 6-ку?...анализом абракодабров в блокноте желания заниматься как бы нет...
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36577563
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Час сидел, вставлял эти картинки в ImageList-5. Напрасно, тот же эффект с 3-х запусков,сохранений. Получается, глючность ImageList v.5. Была идея попытаться пристыковать ImageList v.6 но понятно, провалилась. Тупик.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36577664
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если этот хренов ImageList-5 грузить картинками динамически при старте, то он не глючит, но для хранения изображений он никуда не годен.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Sub InitToolbar()
    Dim i As Integer
    Dim hToolbar As Long
    hToolbar = GetWindow(Toolbar1.hWnd, GW_CHILD)
    SetWindowLong hToolbar, GWL_STYLE, GetWindowLong(hToolbar, GWL_STYLE) Or TB_STYLE_FLAT
    For i =  0  To  34 
        ImageListToolBar.ListImages.Add , PictureToolBar(i).Tag, PictureToolBar(i).Picture
    Next i
    For i =  1  To  23 
        With Toolbar1.Buttons(i)
            If Len(.Key) >  0  Then
                .image = .Key
            End If
        End With
    Next i
End Sub

Но,блин, опять же, манифест исправно срезает нижнюю строчку иконки (если кнопка enabled=false) на классическом интерфейсе. В сочетании с добавлением 60-ти лишних точек к высоте тулбара снизу не есть очень гуд.(видимо это не исправить,т.к. тупица вычисляет высоту по выпуклым классическим кнопкам а не по flat) Пришлось перерисовывать disable-картинки урезанными на нижнюю строчку, чтоб было более менее и одинаково на разных с-мах. Да нет нормально, но это только один тулбар кот. почти без замены кода.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36577688
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а с этим, СтрипTAB-ом что делать? Нет стиль к нему прекрасно применяется, но как совместить цвета? Левые контролы я смотрел, но это не то. А нельзя просто рамку и тексты прозрачными сделать?
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36578343
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Я отослал вам на e-mail.Посмотрел.
Я почти уверен, что в ImageList вы добавляли gif с прозрачным фоном. ImageList с ним работать толком не умеет. Вместо этого нужно фон сделать фиолетовым, к примеру, и задать фиолетовый MaskColor, после этого все будет пучком 100%.

Jah loves you.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36578365
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не почти, а уверен на те же 100%, я вспомнил, как натыкался на этот эффект, и поначалу лечил его, заливая фон серым, а потом догадался, для чего нужен MaskColor.

Дмитрий77Нет стиль к нему прекрасно применяется, но как совместить цвета?Это вы про что?

Jah loves you.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36578394
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДа не почти, а уверен на те же 100%, я вспомнил, как натыкался на этот эффект, и поначалу лечил его, заливая фон серым, а потом догадался, для чего нужен MaskColor.

Дмитрий77Нет стиль к нему прекрасно применяется, но как совместить цвета?Это вы про что?

Jah loves you.

+1
очень похоже
масккалор хитрая штука и малиновый цвет битмапов в примерах от микрософта
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36578682
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЯ почти уверен, что в ImageList вы добавляли gif с прозрачным фоном.
Ну, не угадали.
В основном исходники иконок взяты отсюда: (Microsoft Fax XP)
fxsclntR.dll
Toolbar-128
Bitmap-130
Bitmap-131
Все эти дела ретушируются, бьются по 16х16 , раньше делал bitmap с белым фоном, но потом стал делать ico с прозрачным, но bimap-ы где-то остались частично. (инструменты vc++6;IcoFX 1.6 )

А что на счет моей идеи загрузки из PictureBox(0 to N)?
Иконки в PictureBox хранятся кстати надежно? В смысле вставляются в exe? Мне кажется да.
(потому что большие картинки надо вставлять в ресурсы, или тащить отдельно, насколько знаю...)

В принципе, у меня их не так много всего, чтобы было лениво нарисовать массив картинок.
Но и не так мало, чтобы над всем этим (да и над собой тоже) еще раз издеваться.
Мой способ работает на ура вроде как.

AntonariyДмитрий77Нет стиль к нему прекрасно применяется, но как совместить цвета?Это вы про что?
Кто-то тут обмолвился что TabStrip самый глючный, теперь понял. В XP/Vista стиле для него применяется градиентная подложка, т.е. все фреймы, label-ы etc кот. вы на него накладываете имеют цвет ButtonFace по умолчанию и будут выглядеть как заплатки.
Причем цвет подобрать невозможно, ибо там градиент. В основном все решения сводятся либо к очень большому к-ву кода, что на.. не нужно, ибо я не посвящаю программу TabStrip-у, либо какие-нибудь "красивые" (читай непотребные) tab-ы не имеющие с XP стилем ничего общего. Плюс практически все решения имеют глюк: при переключении стиля и запущенном окне это будет выглядеть непотребно, но это бог с ним: микросовтовские родные окна при переключении стиля тоже слегка страдают. Другая бяка, что эти новоявленные громоздские контролы могут быть подстроены под XP, но выдадут такую дрянь на Висте, что...шли бы они лесом.

Самое красивое и очень простое решение я нашел здесь:
http://www.vbforums.com/showthread.php?t=507336 и к нему склоняюсь.
Идея:
1) Frame или Picture должен быть полностью вписан в прямоугольную основную область TabStrip-а
(опытным путем нашел, что +10(точек?) от верхнего и левого края и (-50) от нижнего и правого края будет в самый раз.. если не так, поправьте )
2) взять цвет в верхнем левом углу первого таба и закрасить в этот цвет все вышеописанные Frame-ы Picture и все что внутри.
Градиентов конечно не будет, но это не очень заметно, а стильные полоски-подсветки вверху и общий характер цвета фона все сохраняется, выглядит отлично.
Вот код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long

Private Sub Command1_Click()
    Dim st As Long, pt As Long
    
    st = GetDC(TabStrip1.hwnd)
    pt = GetPixel(st,  2 ,  5 )
    
    FrameInTab.BackColor = pt
    Label1.BackColor = pt
...
End Sub

Автор высказывает следующие переживания (и он прав):
but when using it in the Form_Paint or Form_Initialize event in order to do it automatically, it's too fast and gets the color behind the form (i.e. desktop background).
и действительно,в Form_Initialize это не срабатывает.

Но помозговав с минутку, я таки нашел решение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 
Private Sub Form_Activate()
   Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
    Command1_Click 'код выше
    Timer1.Enabled = False
End Sub
И желание автора сбывается даже при Timer1.Interval=1 (1 миллисекунда задержки).
Посему вопрос:
имеет ли право это решение на жизнь? хорошо ли использовать таймер? Или можно отследить событие "стиль применен" иначе? Какой ставить интервал таймера чтоб не сглючило? (Interval=10 напр. не заметен, а если Interval=200, то уже заметно на глаз.)
Или все же есть более грамотное решение (а-ля прозрачный фон, Но естественно не +10 дополнит.глючных контролов + 100 страниц кода)
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36578899
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ основном исходники иконокНе суть важно, избавляйтесь от прозрачного фона. Или используйте свой способ, как хотите.
авторА что на счет моей идеи загрузки из PictureBox(0 to N)?Тогда уж в ресурсы программы, PB охочи до оперативки. А еще есть забавный контрол PictureClip, в него можно поместить один рисунок, например блок 1х10 иконок, и обращаться как к двумерному массиву, он порежет самостоятельно. Не знаю, правда, дружит ли он с прозрачным фоном.
авторНо и не так мало, чтобы над всем этим (да и над собой тоже) еще раз издеваться.По крайней мере в будущем имейте это ввиду, избавляйтесь от прозрачности заранее.
автор(опытным путем нашел, что +10(точек?) от верхнего и левого края и (-50) от нижнего и правого края будет в самый раз.. если не так, поправьте )Поправляю: высота табов зависит от размера шрифта, который может быть изменен системно. Эту высоту нужно выяснять сообщением TCM_GETITEMRECT. Еще вам будет полезна эта функция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Declare Function OpenThemeData Lib "uxtheme.dll" (ByVal hWnd As Long, ByVal pszClassList As Long) As Long
Private Declare Function CloseThemeData Lib "uxtheme.dll" (ByVal hTheme As Long) As Long

Public Function ThemesEnabled(hWnd As Long) As Boolean
Dim hTheme As Long
    hTheme = OpenThemeData(hWnd, StrPtr("Window"))
    CloseThemeData hTheme
    ThemesEnabled = hTheme <>  0 
End Function
При отключении стилей все эти дельты изменятся.
авторимеет ли право это решение на жизнь? хорошо ли использовать таймер?Да, если нет желания сабклассить форму в поисках подходящего сообщения. Или, если у вас на форме какой-нибудь юзерконтрол, можно использовать его событие Show.

авторИли все же есть более грамотное решениеКстати да, я однажды сделал прозрачный контейнер именно для использования с табстрипом. Могу выложить, если надо, он не глючный)
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36578921
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати да, я однажды сделалВернее нашел и доделал.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36579088
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Тогда уж в ресурсы программы, PB охочи до оперативки.
Ну хорошо, прямой вопрос.
50-100 маленьких иконочек 16х16х256цв в PictureBox-ах не отменит мировую революцию?
Потому как честно уже неохота это переделывать по крайней мере сейчас.
У меня еще ListView-ы впереди, ибо от идеи "все и сразу" я отказался, последовательно вожусь с каждым, и забот как видим хватает.

>Поправляю: высота табов зависит от размера шрифта, который может быть изменен системно.
Я поигрался: у меня в табе и всяких label-ах жестко зашит Ms Sans Serif 8, поэтому ничего не меняется. М.б. тогда не стоит заморачиваться?
При стилях немного съезжает, но я взял незаметный запас (на XP дельта больше-под нее и надо ориентироваться, на классике ,и похоже на висте тоже, градиентов нету и нет проблем) так что опять: может не заморачиваться?
Меня больше волновал вопрос разного разрешения экрана, компьютер же мыслит в пикселях, а у меня заданы точки, как VB стандартно предлагает. Но тесты показали, что все в порядке.

>Еще вам будет полезна эта функция:..OpenThemeData...
возможно, надо поковыряться.
Но только, я не вдумывался пока...ради момента переключения стилей... мммм
1) Таймером что ли долбить систему? ради отследить событие вероятность которого "раз в жизни да и то не факт", кто ж стили меняет при запущенных куче приложений...
2) Потом в моем варианте не так уж похабно этот момент выглядит, как в тех контролах.

>Кстати да, я однажды сделал прозрачный контейнер именно для использования с табстрипом. Могу выложить, если надо, он не глючный)
Я бы взглянул хотя бы из любопытства. ДА, если несложно.

Но уже склоняюсь к своему варианту. Видимо оставлю старт-таймер с интервал=10 (береженого бог бережет). Стараться имеет смысл только ради XP конкретно, ибо на Висте у меня все вообще
Original(градиентов похоже там и правда нет).
А я же разные контролы использую внутри Tab->Frame(Picture) примитивные, но все же, возиться придется возможно.
И потом принцип у меня: поменьше OCX. Microsoft Common Controls было исключением, через API тяжеловато бывает, но, видите как нарвался не по детски.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36579127
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий7750-100 маленьких иконочек 16х16х256цв в PictureBox-ах не отменит мировую революцию?Нет, конечно, но лучше используйте Image.
Дмитрий77ради отследить событие вероятность которого "раз в жизни да и то не факт"Дело не в этом, а в том, что я, например, для достижения нужного мне эстетического результата подгоняю все с точностью до пикселя, а при переключении стилей толщина всяких бордюров меняется, и там, где при включенных стилях все было идеально, при отключенных появляются всякие лишние полосы и т.п. В качестве выхода из положения использую эту функцию в Form_Resize.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36579368
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
я вот смотрю на этот ваш контрол.
Судя по всему чего-то очень простое.
Во-первых общий вопрос-если я его использую мне ж ни каких ocx за собой тащить не надо? Так? Вроде так.
Во вторых, как он поможет в решении с TabStrip?
Он ведь сам имеет какой-то цвет?
Т.е. кладу на него Label: Label будет иметь цвет вашего контрола. Кладу TextBox-Textbox не будет прозрачным, у меня Textbox-ы в половине случаев там используются, чтоб выделялся текст.
Но я основного не понял: мне же надо чтобы он сам был прозрачным, чтобы подложка была под цвет TabStpip (чтоб видеть градиенты). Т.е. я не улавливаю...

>для достижения нужного мне эстетического результата подгоняю все с точностью до пикселя, а при переключении стилей толщина всяких бордюров меняется

в случае с моей реализацией TabStrip, если подогнано под XP, то на остальных бордюров не будет в силу одинаковости цвета.

Но насчет "подгоняю"... Меня пока чуть злит Тулбар? Как его высоту подсократить через API? Понимаю что зависит от высоты кнопки, но как ему сказать через API: ну ка приведи высоту в соотв. с высотой кнопки и с учетом того что ты flat, потому что в OCX v.5 к высоте добавляется снизу лишнее, я уже писал выше. И как побороть обрезание иконки на одну строку снизу если Button.enable=false; Стиль=классика;манифест=используется, тоже упомянул про это. Т.е. я эту нижнюю строку рисунка вообще убрал для disable. (Типа enable-есть тень снизу;disable-тени нет), но с ней лучше было бы, картинки и так мелкие..16х16.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36579418
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Контрол имеет цвет только в дизайн-тайме, при запуске становится прозрачным, никаких библиотек не требует. Какие-то свойства нужно установить в дизайне, сейчас не помню и не на работе, чтобы посмотреть.

Насчет тулбара, выложите скриншот, а то не очень понятно, что там обрезается. Может и не обрезается, а перекрывается нижними контролами.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36579596
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariyникаких библиотек не требует.
Это конечно хорошо...
AntonariyКонтрол имеет цвет только в дизайн-тайме, при запуске становится прозрачным
Прозрачным он становится, но применительно к обсуждаемому вопросу он принимает цвет формы, а не цвет/градиент табстрипа.
И глюки с цветом шрифта на label что в него вставлена, даже в дизайн-тайм. Не понимаю чего происходит...Без тестового примера и объяснения рецепта приготовления вряд ли осилю.


AntonariyНасчет тулбара, выложите скриншот, а то не очень понятно, что там обрезается. Может и не обрезается, а перекрывается нижними контролами.
Ничего там не перекрывается...

из картинок обе проблемы хорошо видны.
С обрезанием все понятно.
Под ним ListView : Listview.top=toolbar.height
Просто для Control-6 я устанавливаю высоту ToolBar =360 в режиме flat в дизайне
а для Control-5 у меня этого режима в дизайне нет, поэтому приходится соглашаться на =420
Но когда я применяю код:
Код: plaintext
1.
2.
3.
   Dim hToolbar As Long
    hToolbar = GetWindow(Toolbar1.hWnd, GW_CHILD)
     SetWindowLong hToolbar, GWL_STYLE, GetWindowLong(hToolbar, _
        GWL_STYLE) Or TB_STYLE_FLAT
он становится плоским, но его высота сохраняется

Играть пытался
Код: plaintext
1.
2.
3.
4.
5.
    Const WM_USER = &H400
    Const TB_SETSTYLE = WM_USER +  56 
    Const TB_GETSTYLE = WM_USER +  57 
    Const TB_AUTOSIZE = (WM_USER +  33 )
    Const TB_SETBUTTONSIZE = (WM_USER +  31 )
    Call SendMessage(Toolbar1.hWnd, TB_AUTOSIZE,  0 ,  0 )
но ничего не выходит.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36580044
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПрозрачным он становится, но применительно к обсуждаемому вопросу он принимает цвет формыПо непонятной причине в режиме прозрачности он сам себя делает невидимым. Рабочий пример в аттаче, на форму кинут контрол, в дизайне никакие свойства не задаются, все в Form_Load.
авториз картинок обе проблемы хорошо видны.Понятно, это глюк Disabled. Нужно создать второй ImageList с кнопками для отключенного режима (я думал вы так и делаете), например сделав их черно-белыми. Еще можно попробовать стиль TBSTYLE_WRAPABLE, при его наличии работают всякие дополнительные эффекты. Например можно задать отступы от края кнопки до картинки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Sub SetButtonPadding(ByVal lPaddingX As Integer, ByVal lPaddingY As Integer)
Dim lxy As Long
    If m_hToolbar <>  0  Then
        lxy = MakeDWord(lPaddingX, lPaddingY)
        SendMessageLong m_hToolbar, TB_SETPADDING,  0 , lxy
    End If
End Sub

Public Function MakeDWord(LoWord As Integer, HiWord As Integer) As Long
    MakeDWord = (HiWord * &H10000) Or (LoWord And &HFFFF&)
End Function
Чтобы магия сработала, у SendMessage последний параметр обязательно должен быть объявлен как long.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36580051
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аттач забыл.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36580306
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
с контролом все понятно
Код: plaintext
1.
    TranspContainer1.BackColor = vbMagenta
    TranspContainer1.TransparentColor = vbMagenta
vbMagenta(это что за Magenta кстати?)-вот этого не хватало для понимания, но...
я использую textbox-ы locked=false (это даже не важно), чтоб можно было по ним ходить, а для них прозрачность не сработает

В данном конкретном случае думаю придется оставить свой вариант, а ваш иметь в виду на будущее.

>Нужно создать второй ImageList с кнопками для отключенного режима (я думал вы так и делаете), например сделав их черно-белыми.

Черно-белые картинки я и использую, каждая вторая на скриншоте, но в том же ImageList, когда делаю disabled, то меняю номер картинки. А второй ImageList это как? Там же вроде один только указывается?

>Например можно задать отступы от края кнопки до картинки:
Ну это мне как-то не очень нравится...

И вы ничего не сказали про "лишнюю высоту" тулбара 420-360=60.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36580335
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77vbMagenta(это что за Magenta кстати?)-вот этого не хватало для понимания, но...
Object BrowserConst vbMagenta = 16711935 (&HFF00FF)
Member of VBA.ColorConstants Такой себе ядовито-малиновый цвет :)
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36580573
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносДмитрий77vbMagenta(это что за Magenta кстати?)-вот этого не хватало для понимания, но...
Object BrowserConst vbMagenta = 16711935 (&HFF00FF)
Member of VBA.ColorConstants Такой себе ядовито-малиновый цвет :)Ну почему малиновый???))) Это расово фиолетовый цвет, RGB(255, 0, 255) чистоганом. Малиновый — RGB(220, 20, 60).
Цвет может быть любой, главное чтобы TransparentColor и BackColor совпадали.

Дмитрий77я использую textbox-ы locked=false (это даже не важно), чтоб можно было по ним ходить, а для них прозрачность не сработаетВы проверяли? Какая разница, какое у них состояние? Работает всегда. Не работает лишь для безоконных контролов, меток например, поэтому их приходится имитировать с помощью Print.

Дмитрий77А второй ImageList это как?А, ну да, в ocx эту возможность не включили (хочется взять и уе$%@tь). Вообще тулбару можно назначить два имаджлиста (a ListView целых три), один с картинками для кнопок в их нормальном состоянии, другой — в отключенном. Придется опять подключать апи. Кстати, в архиве с апишными контролами есть файл CommCtrl.tlb, в нем объявлены все CommonControls-константы и некоторые функции, рекомендую подключить. Откомпилированному файлу он не нужен.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Call CreateDisImageList
Call AddDisImageListBitmap(LoadResPicture("toolbar", vbResBitmap), vbMagenta)

Public Sub CreateDisImageList(Optional lWidth As Integer =  16 , Optional lHeight As Integer =  16 )
    If m_hDisImageList<> 0  Then ImageList_Destroy m_hDisImageList
    m_hDisImageList = ImageList_Create(lWidth, lHeight, ILC_COLOR32 Or ILC_MASK,  1 ,  1 )
    SendMessage m_hToolbar, TB_SETDISABLEDIMAGELIST,  0 , ByVal m_hDisImageList
End Sub

Public Function AddDisImageListBitmap(ByVal hBitmap As Long, Optional ByVal MaskColor As Long = CLR_NONE) As Long
    If m_hToolbar <>  0  And m_hImageList <>  0  Then
        If (MaskColor <> CLR_NONE) Then
            AddDisImageListBitmap = ImageList_AddMasked(m_hDisImageList, hBitmap, MaskColor)
        Else
            AddDisImageListBitmap = ImageList_Add(m_hDisImageList, hBitmap,  0 )
        End If
    End If
End Function
Картинка в ресурсах — bmp с фиолетовым фоном размером КолВоКнопок*16х16 пикселей 32хбитного цвета. Можно и меньше, но смысла экономить на спичках не вижу.

Дмитрий77Ну это мне как-то не очень нравится...Дело вкуса. На больших интерфейсах проще попадать по крупным кнопкам. На скриноте "Администратора образования" с предыдущей страницы как раз такие увеличенные кнопки, меньше, чем 32, но больше, чем 16.
Дмитрий77И вы ничего не сказали про "лишнюю высоту" тулбара 420-360=60.И вряд ли скажу без примера.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36580979
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyДмитрий77я использую textbox-ы locked=false (это даже не важно), чтоб можно было по ним ходить, а для них прозрачность не сработаетВы проверяли? Какая разница, какое у них состояние? Работает всегда. Не работает лишь для безоконных контролов, меток например, поэтому их приходится имитировать с помощью Print.
Проверял, с Textbox не получается(см.картинку). М.б. плохо проверял, еще проверю.
Antonariy
Дмитрий77А второй ImageList это как?А, ну да, в ocx эту возможность не включили (хочется взять и уе$%@tь). Вообще тулбару можно назначить два имаджлиста (a ListView целых три), один с картинками для кнопок в их нормальном состоянии, другой — в отключенном. Придется опять подключать апи. Кстати, в архиве с апишными контролами есть файл CommCtrl.tlb, в нем объявлены все CommonControls-константы и некоторые функции, рекомендую подключить. Откомпилированному файлу он не нужен.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Call CreateDisImageList
Call AddDisImageListBitmap(LoadResPicture("toolbar", vbResBitmap), vbMagenta)

Public Sub CreateDisImageList(Optional lWidth As Integer =  16 , Optional lHeight As Integer =  16 )
    If m_hDisImageList<> 0  Then ImageList_Destroy m_hDisImageList
    m_hDisImageList = ImageList_Create(lWidth, lHeight, ILC_COLOR32 Or ILC_MASK,  1 ,  1 )
    SendMessage m_hToolbar, TB_SETDISABLEDIMAGELIST,  0 , ByVal m_hDisImageList
End Sub

Public Function AddDisImageListBitmap(ByVal hBitmap As Long, Optional ByVal MaskColor As Long = CLR_NONE) As Long
    If m_hToolbar <>  0  And m_hImageList <>  0  Then
        If (MaskColor <> CLR_NONE) Then
            AddDisImageListBitmap = ImageList_AddMasked(m_hDisImageList, hBitmap, MaskColor)
        Else
            AddDisImageListBitmap = ImageList_Add(m_hDisImageList, hBitmap,  0 )
        End If
    End If
End Function
Картинка в ресурсах — bmp с фиолетовым фоном размером КолВоКнопок*16х16 пикселей 32хбитного цвета. Можно и меньше, но смысла экономить на спичках не вижу.

А в этот API-ImageList картинки из PictureBox вставить нельзя, как в обычный? С ресурсами сейчас неохота морочиться.

Antonariy
Дмитрий77И вы ничего не сказали про "лишнюю высоту" тулбара 420-360=60.И вряд ли скажу без примера.

Пример:
рисуем Toolbar в Control-5 У него кнопки обычные в дизайнере. Пытаемся сделать height=360. Не получается. Соглашамся на 420.
Через API делаем его FLAT (код был выше). Становится FLAT. Но высоту сохраняет 420. В итоге между ним и listview (см.правую картинку выше, listview.top=toolbar.height) образуется серый зазор Дельта=60, потому что норм. высота для flat =360 (см. левую картинку). Какой еще пример нужен?
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36580996
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А в этот API-ImageList картинки из PictureBox вставить нельзя, как в обычный?Да ради бога, просто для меня как раз проще с ресурсами.
Дмитрий77(см.картинку)Картинки не грузяццо.
Дмитрий77Какой еще пример нужен?Конкретный, в виде проекта.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36581631
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картинки в ресурсах и их фон -это отдельная тема.
32-бит-картинки-тоже отдельная тема.
Создание ImageList через API-тоже отдельная тема.
Для всех трех ImageList можно использовать обычный ImageList.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    ' Get the toolbar handle (we cannot just use tbrMain.hwnd as this is a container
    ' window for the actual toolbar control)
    hTBar = FindWindowEx(Toolbar1.hWnd,  0 &, "ToolbarWindow32", vbNullString)
        
'    DeactivateWindowTheme hTBar
    ' The style "TBSTYLE_FLAT" needs to be added.  Although this option is available
    ' in the property pages for the toolbar, it needs to be set here.
    
    ' Get the current style
    lngStyle = SendMessage(hTBar, TB_GETSTYLE,  0 &, ByVal  0 &)
    
    ' Add the TBSTYLE_FLAT style (could also apply other styles here)
    lngStyle = lngStyle Or TBSTYLE_FLAT
        
    ' Set the new style
    Call SendMessage(hTBar, TB_SETSTYLE,  0 &, ByVal lngStyle)

    ' Now add the ImageList's for the normal, hot, and disabled states
    lRes = SendMessage(hTBar, TB_SETIMAGELIST,  0 , ByVal ImageListToolBar.hImageList)
    lRes = SendMessage(hTBar, TB_SETHOTIMAGELIST,  0 , ByVal ImageListToolBarDis.hImageList)
    lRes = SendMessage(hTBar, TB_SETDISABLEDIMAGELIST,  0 , ByVal ImageListToolBarDis.hImageList)
    Call SendMessage(hTBar, TB_AUTOSIZE,  0 ,  0 )
    Toolbar1.Refresh
Очень полезный код, и хорошо что я его нашел/воспроизвел и не полез в дебри.
Нет не то.
Когда мы имеем TB_SETDISABLEDIMAGELIST, то мы вообще не отображаем картинку в режиме disable. Мы просто отображаем другую цветную (пусть бы и черно-белую) картинку, это не так хорошо смотрится как disabled, где винды рисуют "негатив".

Хорошо, я пошел другим путем. Просто перерисовал 16х16 в 17х17, оставив нижнюю строчку иконки пустой, т.е. та же картинка 16х16, но с добавлением пустой строки снизу и пустого столбца справа(слева). Antonariy, что думаете? Два проекта disable и disable17 я послал вам.
17 не похабно смотрится? там две кнопки, загружают разные Imageлисты в Toolbar и галка для реального disabled. Срезание будет на 16 на классич. интерфейсе на exe-шнике. Вот уменьшать картинки до 15 уже похабство.
Заодно с высотой Toolbar не глянете.
TB_AUTOSIZE делает высоту Toolbar 420 для 16х16 и 435 для 17х17.
Я считаю что это избыток, приблизительно 60 точек под кнопками лишние. Либо надо применить еще какой-нибудь стиль... Toolbar 6-й версии имеет базовую высоту 360 для 16х16.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36585317
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С высотой ничего в голову не приходит.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36585563
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyС высотой ничего в голову не приходит.
Да бог с ним. Уже подретушировал-извратился. Вставил один Toolbar в другой. Внешний 420 и обеспечивает "полоску" между меню и Toolbar. Внутренний 435 (т.к. 17х17 ) и его Top чуть смещен вниз, т.е. кнопки получились как бы посредине высоты внешнего Toolbar и низ скрыт. Получилось думаю нормально.

Счас занимаюсь самым мерзким Listview, ломаю голову над другим

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Public Const LVM_FIRST = &H1000
Public Const LVM_SETIMAGELIST = (LVM_FIRST +  3 )

'LVM_SETIMAGELIST
Public Const LVSIL_NORMAL =  0  'large icons
Public Const LVSIL_SMALL =  1  'small icons
Public Const LVSIL_STATE =  2  'state images
Public Const LVSIL_GROUPHEADER =  3  'for group header

...
    For i =  0  To  2 
        lRes = SendMessage(ListView1(i).hWnd, LVM_SETIMAGELIST, LVSIL_NORMAL, ByVal ImageListListView.hImageList)
        lRes = SendMessage(ListView1(i).hWnd, LVM_SETIMAGELIST, LVSIL_SMALL, ByVal ImageListListView.hImageList)
        lRes = SendMessage(ListView1(i).hWnd, LVM_SETIMAGELIST, LVSIL_GROUPHEADER, ByVal ImageListHead.hImageList)
    Next i

Вопрос конечно в LVSIL_GROUPHEADER . Не хочет ImageList-ы назначать-никакие.
По крайней мере использовать не получается.

Если сравнивать с Toolbar (полный код приведен выше), то там используется некая фишка:
Код: plaintext
1.
2.
    ' Get the toolbar handle (we cannot just use tbrMain.hwnd as this is a container
    ' window for the actual toolbar control)
    hTBar = FindWindowEx(Toolbar1.hWnd,  0 &, "ToolbarWindow32", vbNullString)
и все работает в лучшем виде, но я не уверен что для ListView надо делать

Код: plaintext
  hLview = FindWindowEx(ListView1(i).hWnd,  0 &, "ListViewWindow32", vbNullString)

Т.е. в Control-5 он тупо использует ImageListListView для header-ов, если назначить два первых ImageList через VB, а если их не назначать и пытаться применять LVM_SETIMAGELIST (при неназначенных ImageList) то картинок нет нигде.

И еще странность, но пока не копал.
У меня ширины столбцов для ListView считываются из реестра. Если запомнить их при закрытии приложения кот. Control-6 а потом открыть в Control-5 то столбцы сильно шире, и походу при тех же значениях Width. Ощущение что использует другие координаты. Можно конечно подкоректировать default-ы, но мне тогда придется удалять ветвь реестра где эти ширины хранятся при инсталляции новой версии, а не хотелось бы. А если не удалить то будет похабство при первом запуске, и user должен будет уменьшать их вручную.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36585638
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет LVSIL_GROUPHEADER. Заголовки столбцов это отдельный контрол:
Код: plaintext
1.
2.
Function pvHeaderhWnd() As Long
    If (m_hListView) Then pvHeaderhWnd = SendMessageLong(m_hListView, LVM_GETHEADER,  0 ,  0 )
End Function
Ему нужно присваивать ImageList персонально:
Код: plaintext
Call SendMessageLong(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , m_hILHeader)
авторно я не уверен что для ListView надо делатьНадо, надо. Не надо вот это:
Код: plaintext
lRes = SendMessage(ListView1(i).hWnd, LVM_SETIMAGELIST, LVSIL_GROUPHEADER, ByVal ImageListHead.hImageList)
авторУ меня ширины столбцов для ListView считываются из реестра. Если запомнить их при закрытии приложения кот. Control-6 а потом открыть в Control-5 то столбцы сильно шире, и походу при тех же значениях Width. Ощущение что использует другие координаты. Тоже на это натыкался, но не понял, в чем засада. Просто сделал кнопку, устанавливающую размеры по умолчанию, если расползутся. Происходит это редко.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36585886
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
пытаюсь по вашему методу:

Код: 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.
Public Const LVM_GETHEADER =  4127 
Public Const HDM_FIRST           As Long = &H1200
Public Const HDM_SETIMAGELIST    As Long = (HDM_FIRST +  8 )


'SendMessage function
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long

'-----------------------------

    Dim pvHeaderhWnd As Long
    For i =  0  To  2 
        pvHeaderhWnd = SendMessage(ListView1(i).hWnd, LVM_GETHEADER,  0 ,  0 )
        'MsgBox pvHeaderhWnd
        Call SendMessage(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , ByVal ImageListHead.hImageList)
    Next i
'----
    If StartParam.SortOrderIn =  0  Then
        ListView1( 0 ).SortOrder = lvwAscending
        With lvFormat
            .mask = LVCF_FMT Or LVCF_IMAGE
            .fmt = LVCFMT_IMAGE Or LVCFMT_BITMAP_ON_RIGHT  '
            .iImage = ImageListHead.ListImages("Ascending").Index -  1 
        End With
'....
    Call SendMessage(ListView1( 0 ).hWnd, LVM_SETCOLUMN, ListView1( 0 ).SortKey, lvFormat)

Не хочет...Ощущение что пытаюсь забить тот же гвоздь, но другим кувалдометром. MsgBox pvHeaderhWnd показывает вроде похожие на правду Long-и,
а HDM_SETIMAGELIST видимо не срабатывает, т.к. функция, что дальше, лепит картинку из основного ImageList, а не из желаемого.

Вашу SendMessage Long я конечно вижу, ну попытался еще вот так вот

Код: plaintext
1.
2.
3.
4.
Public Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
lParam As Long) As Long
но это ничего не дало.

Вообще-то...
>лепит картинку из основного ImageList
М-м-м...то что лепит это уже неплохо...
а не проще ли забить и добавить 3 лишние картинки в основной ImageList, жалко что ли...
Пусть оттуда их и берет. Что думаете?

==================================

AntonariyавторУ меня ширины столбцов для ListView считываются из реестра. Если запомнить их при закрытии приложения кот. Control-6 а потом открыть в Control-5 то столбцы сильно шире, и походу при тех же значениях Width. Ощущение что использует другие координаты. Тоже на это натыкался, но не понял, в чем засада. Просто сделал кнопку, устанавливающую размеры по умолчанию, если расползутся. Происходит это редко.
Дык расползутся они только один раз - при установке новой версии с "5" после старой версии с "6". (если user уже устанавливал программу ранее) Деинсталлятор старой версии не удаляет эти параметры из реестра. Единственный способ удалить при установке новой версии.
Они по разному интерпретируют одну и ту же ширину . Для "5" дефолты придется тупо уменьшить методом теста.
Или они еще "в процессе" могут глючить? Если так, то не радует...
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36585967
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Вообще-то...
>лепит картинку из основного ImageList
М-м-м...то что лепит это уже неплохо...
а не проще ли забить и добавить 3 лишние картинки в основной ImageList, жалко что ли...
Пусть оттуда их и берет. Что думаете?
Это дурной вариант..У меня размерность картинки другая: в основном листе 16х16, а в заголовках 12х12, можно конечно добавить поля по 2 с каждой стороны, но это съест место, опять эстетика пострадает...
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36586667
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все, разобрался
Вот это не работало
Код: plaintext
Call SendMessage(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , ByVal ImageListHead.hImageList)
т.к. я это делал слишком рано (в Form_load), из _Activate все заработало.

Теперь воюю с прозрачным цветом иконок в Listview-Header.
В Control-6 они будучи загнанными в ImageList изначально (иконки с прозрачными местами) были по умолчанию прозрачными.

Здесь:
Код: plaintext
1.
2.
3.
    For i =  0  To PictureHead.Count -  1 
        ImageListHead.ListImages.Add , PictureHead(i).Tag, PictureHead(i).Picture
    Next i
    Call SendMessage(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , ByVal ImageListHead.hImageList)
не фурычит, белый фон, можно сделать ButtonFace фон, но на XP-интерфейсе при наведении мыши оно себя выдает.

Пытался уже битмапы в ресурсы загонять, например делаю фон синим и типа

Код: plaintext
1.
2.
3.
4.
5.
    m_hImageList = ImageList_Create( 16 ,  16 , ILC_COLOR32 Or ILC_MASK,  1 ,  1 )
    ImageList_Add m_hImageList, LoadResPicture( 101 , vbResBitmap).Handle, vbBlue
    ImageList_Add m_hImageList, PictureHead( 1 ).Picture.Handle, vbBlue
    ImageList_Add m_hImageList, PictureHead( 2 ).Picture.Handle, vbBlue

    Call SendMessage(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , ByVal m_hImageList)

Не могу понять сути этой MaskColor. Что делать-то? Лучше конечно с обычными ico, кот. загружены в Picturebox-ы с бесцветным фоном и обычным ImageList, там тоже этот MaskColor есть,
но помогает только Backcolor, да и то не до конца, как выяснили.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36586937
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Не могу понять сути этой MaskColor. Что делать-то?Суть в том, что imagelist самостоятельно делает прозрачными области указанного цвета. Такие области называются маской. Свойство ImageLis'а MaskColor задает этот цвет.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36588429
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

для самого ListView это работает, а для header оно лепит цвет фона, в чем и проблема.
Тестовый пример

P.S. А файлы как нормально тут прилеплять?
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36589118
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю чего с этой прозрачностью делать.
По идее можно попытаться менять цвет фона ImageList, видимо читая цвет какого-то пикселя, как это придумал с TabStrip.
Но здесь куча сложностей:
1) Выделяется только один header, а фон един для всех картинок.
2) Надо будет эти картинки каждый раз перерисовывать-обновлять
3) Надо думать как считать текущий цвет каждого header
4) Надо еще понимать событие при кот. столбец меняет цвет. понятно сабклассинг этих хидеров (у меня это headres кажется и так сабклассятся, но от этого не легче).
5) а если там в xp гребаные градиенты используются как в TabStrip то вообще ж., фиг отследишь где чего и почему меняется.
Сдается мне, путь сей не есть правильный и как то проще делается.
Для кнопки напр. этот MaskColor надо задавать и он должен совпадать с MaskColor для ImageList. А с header я нигде никакого намека на это не вижу(автоматически здесь не работает). Но с 6-ми контролами вроде по default-у они прозрачные получаются (в смысле плюют на цвет фона), значит в API чего-то должно быть.
---------------------------------

А по поводу ширины столбцов. Не, там хуже. ColumnHeaders(i).width надо выкидывать в помойку сразу и не думая. Простые тесты показывают, что если 1-100; 2-200 ; 3-300 то ширина устанавливается не линейно, а по какой-то логарифмической шкале, и мало того что дикая нелинейность, если эти значения пытаться запоминать, то эта мерзость фиг их потом еще и отобразит также (т.е. реальные ширины будут в след. раз другие).
Но здесь хотя бы выход наклевывается. Что-нибудь типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Private Sub Command1_Click()
    Dim lvFormat As LV_COLUMN
    With lvFormat
        .mask = LVCF_WIDTH
    End With
    Call SendMessage(ListView1.hWnd, LVM_GETCOLUMN,  0 , lvFormat)
    MsgBox lvFormat.cx * Screen.TwipsPerPixelX
    
End Sub

Private Sub Command2_Click()
    Dim lvFormat As LV_COLUMN
    With lvFormat
        .mask = LVCF_WIDTH
        .cx = Text1.Text / Screen.TwipsPerPixelX 'Text1.Text -ширина в точках
    End With
    Call SendMessage(ListView1.hWnd, LVM_SETCOLUMN,  0 , lvFormat)
End Sub
будет думаю хорошим решением. Округляет конечно при делении, но более чем на 5-10точек не прыгает.Завтра буду мучиться, применять этот код.
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36593731
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77для самого ListView это работает, а для header оно лепит цвет фона, в чем и проблема.
Получилось. Чего только не пытался.
Уже вот это накопал
Код: plaintext
1.
2.
3.
4.
5.
6.
  Dim hdi As HDITEM
  With hdi
    .mask = HDI_FORMAT Or HDI_IMAGE
    .fmt = HDF_STRING Or HDF_IMAGE Or HDF_BITMAP_ON_RIGHT '
    .iImage =  0 
  End With
  Call SendMessage(hwndHdr, HDM_SETITEM,  1 , hdi)
вместо
Код: plaintext
1.
2.
3.
4.
5.
6.
    Dim lvFormat As LV_COLUMN
    With lvFormat
        .mask = LVCF_FMT Or LVCF_IMAGE
        .fmt = LVCFMT_IMAGE Or LVCFMT_BITMAP_ON_RIGHT  '
        .iImage = ImageListHead.ListImages("Ascending").Index '2
    End With
    Call SendMessage(ListView1( 0 ).hWnd, LVM_SETCOLUMN,  1 , lvFormat)
Помог вот этот пример:
http://btmtz.mvps.org/listview/
http://btmtz.mvps.org/listview/lvheadersorticons.zip
Вернее все-таки понимание(или так фишка легла) что здесь VB ImageList не прокатит:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
' ImageList_Create flags
Private Const ILC_MASK = &H1
Private Const ILC_COLOR32 = &H20

Private Declare Function ImageList_Create Lib "comctl32.dll" (ByVal cx As Long, _
ByVal cy As Long, ByVal flags As Long, ByVal cInitial As Long, ByVal cGrow As Long) As Long
Private Declare Function ImageList_ReplaceIcon Lib "comctl32.dll" (ByVal himl As Long, _
ByVal i As Long, ByVal hIcon As Long) As Long
...
Private Sub Form_Load()
'необходимо создать ImageList через API, иначе прозрачность иконок не сработает
    m_Himl = ImageList_Create( 12 ,  12 , ILC_MASK Or ILC_COLOR32,  3 ,  0 ) '
    ImageList_ReplaceIcon m_Himl, - 1 , PictureHead( 0 ).Picture.Handle 'Paper=0
    ImageList_ReplaceIcon m_Himl, - 1 , PictureHead( 1 ).Picture.Handle 'Ascending=1
    ImageList_ReplaceIcon m_Himl, - 1 , PictureHead( 2 ).Picture.Handle 'Descending=2
...
Private Sub Form_Activate()
    Dim pvHeaderhWnd As Long
    Dim i As Integer
    Dim lvFormat As LV_COLUMN
    For i =  0  To  2 
        pvHeaderhWnd = SendMessageLong(ListView1(i).hWnd, LVM_GETHEADER,  0 ,  0 )
        Call SendMessageLong(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , ByVal m_Himl) 'ImageListHead.hImageList)  '
    Next i

Кстати вопрос. Как уже упомянул,
>Вашу SendMessageLong я конечно вижу
Так вот в тестовом(мелком) примере у меня строчка (без Long)
Код: plaintext
Call SendMessage(pvHeaderhWnd, HDM_SETIMAGELIST,  0 , ByVal m_Himl)
съелась, а в большом проекте взяла и сглючила Bad Dll Convention.. типа того, а с SendMessageLong (as Long вместо as Any) прокатило. В чем засада?

-----------------------

На Висте в некоторых программах (но далеко не всех) примеры: Почта Виндоус, Fax and Scan listview имеет какой-то другой вид, т.е. не только шапка по-вистовски, но и сами Items в Report выглядят по-вистовски, т.е. с закругленными выделениями-примечаниями и с голубой прозрачной подсветкой. Это как сделать? Или это вообще принципиально другой контрол?
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36608765
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyавторУ меня ширины столбцов для ListView считываются из реестра. Если запомнить их при закрытии приложения кот. Control-6 а потом открыть в Control-5 то столбцы сильно шире, и походу при тех же значениях Width. Ощущение что использует другие координаты. Тоже на это натыкался, но не понял, в чем засада. Просто сделал кнопку, устанавливающую размеры по умолчанию, если расползутся. Происходит это редко.
Собственно, давно уже до этого сам допер. Но если интересно, официальное заключение:
FIX: Problem with ListView's ColumnHeader Width Property

How To Set the Column Width of Columns in a ListView Control

Принялся пока курочить другой свой exe-шник.
Новая проблема:

Код: plaintext
1.
2.
3.
    tmColour = ListView.ListItems(k +  1 ).ForeColor
    ListView.ListItems(k).ForeColor = tmColour
    ListView.ListItems(k).ListSubItems( 1 ).ForeColor = tmColour
    ListView.ListItems(k).ListSubItems( 2 ).ForeColor = tmColour


Изучаю пока вот это чудо:
http://btmtz.mvps.org/listview/
LVCustomDraw: How to use custom draw in the ListView
http://btmtz.mvps.org/listview/lvcustomdraw.zip

Неужели только сабклассить и NMLVCUSTOMDRAW ?
Или можно че попроще придумать?
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36610139
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Новая проблема:

Код: plaintext
1.
2.
3.
    tmColour = ListView.ListItems(k +  1 ).ForeColor
    ListView.ListItems(k).ForeColor = tmColour
    ListView.ListItems(k).ListSubItems( 1 ).ForeColor = tmColour
    ListView.ListItems(k).ListSubItems( 2 ).ForeColor = tmColour

Осилил:
Код: 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.
Public Function NewFormWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case Msg
        ' ======================================================
        Case WM_NOTIFY
            Static lvcd As NMLVCUSTOMDRAW
            MoveMemory lvcd, ByVal lParam, Len(lvcd)   ' every structs' member is a Long
            Select Case lvcd.nmcd.hdr.code
                Case NM_CUSTOMDRAW
                    Select Case lvcd.nmcd.dwDrawStage
                    ' ====================================================
                        Case CDDS_PREPAINT
                            ' Tell the listview we want CDDS_ITEMPREPAINT for each item
                            NewFormWindowProc = CDRF_NOTIFYITEMDRAW
                            Exit Function
                        ' ====================================================
                        Case CDDS_ITEMPREPAINT
                            Select Case lvcd.nmcd.hdr.hwndFrom 'в смысле какой контрол собрался перерисовываться
                                Case Form1.ListView1.hwnd
                                    'в Tag храним информацию о цвете строчки, если пусто, то по умолчанию
                                    If Len(Form1.ListView1.ListItems(lvcd.nmcd.dwItemSpec +  1 ).Tag) >  0  Then
                                        lvcd.clrText = Val(Form1.ListView1.ListItems(lvcd.nmcd.dwItemSpec +  1 ).Tag)
                                        'lvcd.clrTextBk = vbRed 'background of item, если надо
                                        MoveMemory ByVal lParam, lvcd, Len(lvcd)
                                        Exit Function
                                    End If
                                Case Else
                            End Select 'lvcd.nmcd.hdr.hwndFrom
                        Case Else
                    End Select   ' lvcd.nmcd.dwDrawStage
                Case Else
            End Select   ' nmh.code
        Case Else
    End Select   ' Msg
    NewFormWindowProc = CallWindowProc( _
        OldFormWindowProc, hwnd, Msg, wParam, _
        lParam)
End Function
Сабклассить надо родительский контрол.
В моем случае ListView был вставлен в PictureBox, а PictureBox был вставлен во Frame, а Frame вставлен в Form.
Чтобы добраться до этой "иголки", пришлось сабклассить PictureBox, этого оказалось достаточно.
Таблицу цветов строчек храню в их Tag-ах, т.е. достаточно
Item.tag=vbBlue
Listview1.Refresh
===============================
но Refresh на 5-х контролах свинит, т.е.даже не рефреш, а попытка изменить Item/SubItem кот. Selected но вне зоны видимости программно.
Т.е. у вас ListView напр. отображает строка=500, а selected строка=2
и программа меняет вам эту строку=2.(через vb-модель)
Дык вот свинья в том, что этот гад перепрыгнет на вторую строчку.
Если скажем у вас содержание ListView обновляется по таймеру(отдельные строки), то вы будете тянуть HScroll вниз, а эта скотина будет тянуть вас вверх.
Посему пришлось накатать еще ряд ф-ций, плюс быстро понял, что если с SubItems/Image начинаешь работать через API, то это можно даже без лишних сабклассингов, но VB-модель надо хоронить с момента первого применения API, ибо двояко(через API и через VB) можно прочитать разве что Item.Text , попытки двойного обращения будут вести к бардаку в голове и программе.

Код: 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.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
Public Const MAX_LVMSTRING As Long =  255 

Public Sub ListViewSetSubItemText(m_ListView As ComctlLib.ListView, m_Item As Long, m_SubItem As Long, m_Text As String)
    ' m_SubItem =0 почему-то вылетает не вылетает лишь если or LVIF_IMAGE
    Dim lvi As LV_ITEM
    With lvi
        .iItem = m_Item -  1 
        .iSubItem = m_SubItem
        .mask = LVIF_TEXT
        .pszText = m_Text
    End With
    Call SendMessage(m_ListView.hwnd, LVM_SETITEM,  0 , lvi)
End Sub
Public Sub ListViewSetItemPicture(m_ListView As ComctlLib.ListView, m_Item As Long, m_Image As String)
    Dim lvi As LV_ITEM
    With lvi
        .iItem = m_Item -  1 
        .iSubItem =  0 
        .mask = LVIF_IMAGE
        .iImage = m_Image
    End With
    Call SendMessage(m_ListView.hwnd, LVM_SETITEM,  0 , lvi)
End Sub

Public Function ListViewGetSubItemText(m_ListView As ComctlLib.ListView, m_Item As Long, m_SubItem As Long) As String
    'm_SubItem =0 прочтет item.text (0 можно устанавливать через vb-модель)
    Dim lvi As LV_ITEM
    Dim nRet As Long
    
    With lvi
        .mask = LVIF_TEXT
        .iSubItem = m_SubItem
        .pszText = Space(MAX_LVMSTRING) 'Space(32) '
        .cchTextMax = Len(.pszText)  'MAX_LVMSTRING
    End With
    nRet = SendMessage(m_ListView.hwnd, LVM_GETITEMTEXT, m_Item -  1 , lvi)
    ListViewGetSubItemText = Left$(lvi.pszText, nRet)
End Function
Public Function ListViewGetItemPicture(m_ListView As ComctlLib.ListView, m_Item As Long) As Long
    Dim lvi As LV_ITEM
    Dim nRet As Long
    
    With lvi
        .mask = LVIF_IMAGE
        .iItem = m_Item -  1 
        .iSubItem =  0 
    End With
    Call SendMessage(m_ListView.hwnd, LVM_GETITEM,  0 , lvi)
    ListViewGetItemPicture = lvi.iImage
End Function


================================
Хотелось бы тут вспомнить про Toolbar.
AntonariyДмитрий77Хотелось бы каких-то идей-направлений (хотя бы).NM_CUSTOMDRAW
Antonary, ну допустим влезу я во все это (первый опыт типа есть)
Код: 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.
' ==================================================================
' Toolbar

Public Type NMTBCUSTOMDRAW
  nmcd As NMCUSTOMDRAW
  hbrMonoDither As Long
  hbrLines As Long                ' For drawing lines on buttons
  hpenLines As Long             ' For drawing lines on buttons

  clrText As Long                  ' Color of text
  clrMark As Long                 ' Color of text bk when marked. (only if TBSTATE_MARKED)
  clrTextHighlight As Long    ' Color of text when highlighted
  clrBtnFace As Long            ' Background of the button
  clrBtnHighlight As Long      ' 3D highlight
  clrHighlightHotTrack As Long  ' In conjunction with fHighlightHotTrack will cause button to highlight like a menu
  rcText As RECT                       ' Rect for text

  nStringBkMode As Long
  nHLStringBkMode As Long
End Type

'  Toolbar custom draw return flags
Public Const TBCDRF_NOEDGES = &H10000                    ' Don't draw button edges
Public Const TBCDRF_HILITEHOTTRACK = &H20000       ' Use color of the button bk when hottracked
Public Const TBCDRF_NOOFFSET = &H40000                   ' Don't offset button if pressed
Public Const TBCDRF_NOMARK = &H80000                       ' Don't draw default highlight of image/text for TBSTATE_MARKED
Public Const TBCDRF_NOETCHEDEFFECT = &H100000   ' Don't draw etched effect for disabled items
А я сумею под него картинку подложить? Или только фон поменять монотонно (ну наверно на Transparent)?

И допустим я вымучаю все и вся и что-то сделаю. А всякие NM_<VISTA>DRAW или NM<XP>DRAW пошлют мой NMCUSTOMDRAW куда подальше. Простой пример для классики то есть, я ссылку давал, но XP/Vista стили действие того примера обнуляют, здесь небось тоже самое будет...
...
Рейтинг: 0 / 0
xp/vista style; common controls 5/6; regsvr32 на x86/x64
    #36610572
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А я сумею под него картинку подложить?NMCUSTOMDRAW.hdc в полном вашем распоряжении.
...
Рейтинг: 0 / 0
62 сообщений из 62, показаны все 3 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / xp/vista style; common controls 5/6; regsvr32 на x86/x64
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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