Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Форма произвольной формы с ровными краями / 13 сообщений из 13, страница 1 из 1
20.07.2010, 17:42
    #36750839
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
Возможно ктото из вас уже делал такое, подскажите.

Делал через функцию (вырезаешь цвет (маску)):
Public Sub SetTranspColor(ByVal hwnd As Long, ByVal color As Long)
Call SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) Or WS_EX_LAYERED)
Call SetLayeredWindowAttributes(hwnd, color, 0, LWA_COLORKEY)
End Sub
... но получается грубыми краями.

Дальше делал по другому варианту (GDI) через UpdateLayeredWindow, картинку загружал PNG с альфа каналом через GdipLoadImageFromFile. Все замечательно, все красиво и гладко но нет контролов на форме. (:

Еще есть вариант таскать 2 формы...но както это не серьезно.


Дак подскажите как же сделать нормальную красивую с четкими (гладкими) краями произвольную форму + контролы?
...
Рейтинг: 0 / 0
20.07.2010, 18:00
    #36750878
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
вот прикрипил фото

то что получается при использовании PNG и UpdateLayeredWindow - справа
то что получаетя при использовании SetLayeredWindowAttributes - слева
...
Рейтинг: 0 / 0
20.07.2010, 19:46
    #36751072
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
ak787,

не делал такого, но судя по примечанию в описанию функции UpdateLayeredWindow(),

The source DC should contain the surface that defines the visible contents of the layered window. For example, you can select a bitmap into a device context obtained by calling the CreateCompatibleDC function.

Я понимаю это так, что всё, включая элементы управления, должно быть уже отрисовано в source DC (и это выглядит логично).
...
Рейтинг: 0 / 0
20.07.2010, 19:47
    #36751078
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
Бенедикт,
это я знаю, забыл упомянуть в вопросе, этого тоже не хотелось бы рисовать все контролы
...
Рейтинг: 0 / 0
20.07.2010, 19:53
    #36751088
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
ak787Бенедикт,
это я знаю, забыл упомянуть в вопросе, этого тоже не хотелось бы рисовать все контролы
не прочилал предыдущий пост внимательно, нет все надо рисовать заново...

"CreateCompatibleDC function" создает "пустой" DC... и поэтому нужно все прорисовывать заново, что очень не хотелось бы, ввиду такой проблемы как "утечка GDI" (сам еще не сталкивался)
...
Рейтинг: 0 / 0
20.07.2010, 20:25
    #36751132
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
ak787ak787Бенедикт,
это я знаю, забыл упомянуть в вопросе, этого тоже не хотелось бы рисовать все контролы
не прочилал предыдущий пост внимательно, нет все надо рисовать заново...Если б встроенные VB-шные контролы поддерживали WM_PRINT, WM_PRINTCLIENT, то проблема была бы сравнительно легко решаемой. Но они, ЕМНИП, не поддерживают.

ak787"CreateCompatibleDC function" создает "пустой" DC... и поэтому нужно все прорисовывать заново, что очень не хотелось бы, ввиду такой проблемы как "утечка GDI" (сам еще не сталкивался)ИМХО, не об утечке ресурсов GDI (которая обычно является следствием банального незакрытия операторных скобок) стоит беспокоиться.

Попробуйте покопаться на vbAccelerator -е.
...
Рейтинг: 0 / 0
20.07.2010, 21:19
    #36751186
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
Бенедикт
Попробуйте покопаться на vbAccelerator -е.
вот версия где "заусенки" на картинке (слева) и есть через ту функцию что там описана
...
Рейтинг: 0 / 0
20.07.2010, 22:59
    #36751312
bac
bac
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
ak787,

Как-то находил пример, прикладываю архив.
Так же есть программа для рисования произвольных форм (генерит исходник на VB) если надо могу намылить.
...
Рейтинг: 0 / 0
20.07.2010, 23:40
    #36751365
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
bacak787,

Как-то находил пример, прикладываю архив.
Так же есть программа для рисования произвольных форм (генерит исходник на VB) если надо могу намылить.
наверное мне не совсем это нужно, все равно спасибо
...
Рейтинг: 0 / 0
20.07.2010, 23:45
    #36751375
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
а тему наверное можно даже закрывать, думаю все равно никто ничего не предложит, весь день читаю разные форумы, везде спотыкаются ровно на этом же месте и предлагают либо "рисовать" используя GDI, либо "таскать" 2 формы...

для меня оказался самый удачный вариант "таскать 2 формы", оказывается ничего даже не тормозит и не заметно вовсе ;)

Форма таскается просто, обрабатываю сообщение WM_MOVE от главной формы в функции WindowProc.
...
Рейтинг: 0 / 0
20.07.2010, 23:46
    #36751378
Бенедикт
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
bac,
нет, через регионы получится как раз "ступеньками".

ak787вот версия где "заусенки" на картинке (слева) и есть через ту функцию что там описанаДа, почитал дома, действительно. Автор написал "опишу работу с UpdateLayeredWindow() в следующей статье", но, видимо, наткнулся на ту же проблему, статьи нет.

Пока видны вполне ожидаемые результаты: народ либо использует отрисовку клиентской части окна, включая дочерние окна (контролы) через WM_PRINT , либо фигурные границы делает одним или несколькими отдельными (не дочерними) окнами (без контролов) . Впрочем, это по результатам очень быстрого поиска.
...
Рейтинг: 0 / 0
20.07.2010, 23:51
    #36751391
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
т.е. я использую 2 формы: одна обычная (главная) с контролами, другая - произвольной формы "таскается" вместе с главной

сам код для использования произвольной формы для картинки PNG с альфа каналом тут
...
Рейтинг: 0 / 0
20.07.2010, 23:53
    #36751393
ak787
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Форма произвольной формы с ровными краями
Бенедиктbac,
нет, через регионы получится как раз "ступеньками".

ak787вот версия где "заусенки" на картинке (слева) и есть через ту функцию что там описанаДа, почитал дома, действительно. Автор написал "опишу работу с UpdateLayeredWindow() в следующей статье", но, видимо, наткнулся на ту же проблему, статьи нет.

Пока видны вполне ожидаемые результаты: народ либо использует отрисовку клиентской части окна, включая дочерние окна (контролы) через WM_PRINT , либо фигурные границы делает одним или несколькими отдельными (не дочерними) окнами (без контролов) . Впрочем, это по результатам очень быстрого поиска.

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


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