100% прозрачность формы - Форум
Страница 1 из 11
Форум » VISUAL BASIC » Обсуждаем язык » 100% прозрачность формы (Именно формы, контролы должны оставаться видны.)
100% прозрачность формы
GlebonusДата: Вторник, 17.06.2008, 23:14 | Сообщение # 1
Генерал-майор
Группа: Проверенные
Сообщений: 273
Статус: Offline
САБЖ. Ну в смысле чтобы контролы были видны, а форма нет.
Да, и как реализовать в этом случае перетаскивание? Скажем за Picture1. Ведь тогда не будет видно заголовка формы.


 
vladikcomperДата: Среда, 18.06.2008, 14:14 | Сообщение # 2
Admin
Группа: Администраторы
Сообщений: 523
Статус: Offline
Пришлось импровизировать. Вышло следующее:

Code
Const LWA_COLORKEY = &H1
Const LWA_ALPHA = &H2
Const GWL_EXSTYLE = (-20)
Const WS_EX_LAYERED = &H80000
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

Private Sub Form_Load()
Me.BackColor = RGB(1, 1, 1)
Dim Ret As Long
Ret = GetWindowLong(Me.hWnd, GWL_EXSTYLE)
Ret = Ret Or WS_EX_LAYERED
SetWindowLong Me.hWnd, GWL_EXSTYLE, Ret
SetLayeredWindowAttributes Me.hWnd, Val(RGB(1, 1, 1)), 0, LWA_COLORKEY
End Sub

На работоспособность пока не проверял.


Сайт Влада. Администратор.
 
vladikcomperДата: Среда, 18.06.2008, 14:16 | Сообщение # 3
Admin
Группа: Администраторы
Сообщений: 523
Статус: Offline
Смысл такой: задаем форме цвет RGB(1,1,1) - цвет редкий, так что в контролах не встретится.
А потом делаем этот цвет прозрачным.
А чтобы не было видно заголовка => Form1.Border = 0

Quote (Glebonus)
Да, и как реализовать в этом случае перетаскивание? Скажем за Picture1. Ведь тогда не будет видно заголовка формы.

А нужно именно в форму? Зачем тогда прозрачность делать.
Можно реализовать в Picture1.


Сайт Влада. Администратор.
 
GlebonusДата: Среда, 18.06.2008, 19:13 | Сообщение # 4
Генерал-майор
Группа: Проверенные
Сообщений: 273
Статус: Offline
Спасибо. Работает. biggrin
Но расскажу поподробнее.
Мне это нужно для реализации темок в своей проге. И нужно реализовать поддержку полупрозрачности в картинках от темы, чтобы виден был рабочий стол за формой.
Есть только одно решение - делать форму прозрачной, а контролы оставлять видимыми. Однако поскольку спрятан заголовок мне нужно его восстановить. И нужно что то другое, за что можно перетаскивать. И я прошу мне с этим помочь.
И при этом возникает еще одна проблема - нет подходящего формата с полупрозрачными пикселями. PNG и Ico RGB + Альфа канал ни Picturebox, ни Image не поддерживают. sad wacko help


 
vladikcomperДата: Четверг, 19.06.2008, 13:25 | Сообщение # 5
Admin
Группа: Администраторы
Сообщений: 523
Статус: Offline
Quote (Glebonus)
нужно что то другое, за что можно перетаскивать

Вот пример, как можно перетаскивать за Image:

Code
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Function DoDrag(TheForm As Form)
If TheForm.WindowState <> vbMaximized Then
     ReleaseCapture
     SendMessage TheForm.hwnd, &HA1, 2, 0&
End If
End Function

Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
DoDrag Me
End Sub

Код для модуля формы.


Сайт Влада. Администратор.
 
vladikcomperДата: Четверг, 19.06.2008, 13:52 | Сообщение # 6
Admin
Группа: Администраторы
Сообщений: 523
Статус: Offline
Хм... Сделать фоновый рисунок формы прозрачным?
Щас попробуем. Сделать то, чего не делал никто...
Нет... Невозможно. Рисунок становится черным квадратом, причем непрозрачным.
Для прозрачного нанесения я использовал эту функцию:

Code
Private Declare Function AlphaBlending Lib "msimg32" Alias "AlphaBlend" (ByVal hdcDest As Long, ByVal nXOriginDest As Long, ByVal nYOriginDest As Long, ByVal nWidthDest As Long, ByVal nHeightDest As Long, ByVal hdcSrc As Long, ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, ByVal nWidthSrc As Long, ByVal nHeightSrc As Long, ByVal BF As Long) As Long

Private Function AlphaBlend(ByVal DestHDC As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal DestWidth As Long, ByVal DestHeight As Long, ByVal srcHDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal srcWidth As Long, ByVal srcHeight As Long, ByVal AlphaSource As Long) As Long
     Dim lngBlend As Long
     lngBlend = Val("&h" & Hex(AlphaSource) & "00" & "00")
     AlphaBlending DestHDC, XDest, YDest, DestWidth, DestHeight, srcHDC, xSrc, ycrc, srcWidth, srcHeight, lngBlend
End Function

Private Sub Form_Load()
Me.AutoRedraw = True
Picture1.AutoRedraw = True
Picture1.AutoSize = True
AlphaBlend Me.hdc, 0, 0, 100, 100, Picture1.hdc, 0, 0, 100, 100, 50
End Sub


Сайт Влада. Администратор.
 
GlebonusДата: Четверг, 19.06.2008, 18:08 | Сообщение # 7
Генерал-майор
Группа: Проверенные
Сообщений: 273
Статус: Offline
Опять и опять спасибо! biggrin
Правда зачем делать фоновый рисунок формы прозрачным... Просто нужен контрол который читал бы PNG или 32-битные иконки... Только эти форматы поддерживают полупрозрачность

Добавлено (19.06.2008, 18:08)
---------------------------------------------
http://www.viscomsoft.com/imageviewer.htm - идеальный вариант.
Поддерживает все форматы, вплоть до psd.
Однако у него тоже есть одна проблема - его фон всегда черный, и соответственно за ним не видно того что позади формы, хоть изображение в местах полупрозрачное. wacko help



 
vladikcomperДата: Пятница, 20.06.2008, 20:40 | Сообщение # 8
Admin
Группа: Администраторы
Сообщений: 523
Статус: Offline
Quote (Glebonus)
Опять и опять спасибо!

Не за что! Мне VB мучить не жалко! biggrin

Quote (Glebonus)
вплоть до psd.

У меня есть модуль, как загрузить PSD (без АПИ, вроде). Я пока не тестил на прозрачные документы.
Ах, да... У меня также есть модуль, загружающий PNG.

Quote (Glebonus)
есть одна проблема - его фон всегда черный

А узнать высоту-ширину и подогнать по размерам никак нельзя?
И как в контроле отображаются прозрачные PGN? Сливаются с черным фоном?

А может сделать для того рисунка отдельную полупрозрачную форму (без заголовка и границ)? Или задать прозрачность отдельных цветов.


Сайт Влада. Администратор.
 
GlebonusДата: Суббота, 21.06.2008, 00:16 | Сообщение # 9
Генерал-майор
Группа: Проверенные
Сообщений: 273
Статус: Offline
Vladikcomper, помоему ты не совсем меня понял.
Я пытаюсь сделать форму фонами которой будут полупрозрачные картинки. Соотвестственно видно саму форму и то, что позади ее, как в висте. причем это распределение прозрачных и непрозрачных и полупрозрачных пикселей разное, также как в висте. Поэтому нам нужен PNG или ICO 32bit, где поддерживаются полупрозрачные пиксели разной степени прозрачности.
Для удобства представлю форму в виде слоев (это никакой ни компонент, просто распределяю контролы по удобству.)
1 слой.
Графическая оболочка винды, рабочий стол. К форме конечно не относится, но виден сквозь форму при моем подходе.
2 слой
Сама форма. Правда ее нифига не видно, благодаря твоему листингу в сообщении #2 smile
3 слой
Сами проблемные PNG картинки, составляющие фон. Ну там углы, стороны и основная часть. Картинки в некоторых местах непрозрачные, в некоторых полупрозрачные, благодаря чему и видно все, что сзади формы.
4 слой
Заголовок формы с кнопками. Перетаскивается. Перетаскивание опять же благодаря твоему листингу в сообщении #5 smile . Кстати, не знаешь, где можно найти справочник по параметрам SendMessage?
5 слой
Ну контролы. Не имеет значения.
Ну вобщем все. Из всего этого складывается форма.

Если мы юзаем Image то самый важный третий слой у нас не не удается - vb нивкакую не поддерживает png или нормальный ico.

Если мы юзаем ImageViewer (пост #7) то между вторым и третьим слое вклинивается еще один слой - тот самый черный фон имейджвьювера.

Должна же быть какая-то альтернатива...

А теперь отвечаю на вопросы

Quote (vladikcomper)
А узнать высоту-ширину и подогнать по размерам никак нельзя?

да запросто. У этого контрола для этого есть даже встроенный метод.

Quote (vladikcomper)
И как в контроле отображаются прозрачные PGN? Сливаются с черным фоном?

Да... В том то и сложность...
И за ними ничего не видно
Quote (vladikcomper)
А может сделать для того рисунка отдельную полупрозрачную форму (без заголовка и границ)?

Тогда получится слишком много форм. Да и прозрачность у картинки не равномерная.


 
vladikcomperДата: Воскресенье, 22.06.2008, 13:41 | Сообщение # 10
Admin
Группа: Администраторы
Сообщений: 523
Статус: Offline
Quote (Glebonus)
где можно найти справочник по параметрам SendMessage?

У меня вроде... smile

Code
Функция SendMessage

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

SendMessage посылает сообщение окну. Функция вызывает оконную процедуру для обработки сообщения. Эта функция не возвращается, пока окно не завершит обработку сообщения

Возвращаемое значение  
Функция возвращает значение сообщения

Параметры  
hWnd
Дескриптор окна,в которое будет послано сообщение  
Msg
Идентификатор сообщения  
wParam
Дополнительные определенные данные сообщения  
lParam
Дополнительные определенные данные сообщения  

Пример  

' Запускаем хранитель экрана
SendMessage hwnd, WM_SYSCOMMAND, SC_SCREENSAVE, ByVal 0&


Сайт Влада. Администратор.
 
vladikcomperДата: Воскресенье, 22.06.2008, 14:22 | Сообщение # 11
Admin
Группа: Администраторы
Сообщений: 523
Статус: Offline
Quote (Glebonus)
Должна же быть какая-то альтернатива...

Не знаю-не знаю...
Идея прозрачного PNG очень сложная для реализации, кажется я не могу подобрать альтернативу,
зато могу попробовать сделать фоновый рисунок формы полу-прозрачным (в сплошь).


Сайт Влада. Администратор.
 
GlebonusДата: Понедельник, 23.06.2008, 22:58 | Сообщение # 12
Генерал-майор
Группа: Проверенные
Сообщений: 273
Статус: Offline
в
Quote (vladikcomper)
У меня вроде... smile

я имел ввиду по существующим. А параметры я и так знаю.
Даже если бы не знал 1мин. в гугле и ответ найден.
А вот параметры которые можно передавать не находятся. sad biggrin
Quote (vladikcomper)
в сплошь

sad


 
vladikcomperДата: Понедельник, 07.07.2008, 18:32 | Сообщение # 13
Admin
Группа: Администраторы
Сообщений: 523
Статус: Offline
Quote (Glebonus)
А параметры я и так знаю

Может, попробовать поискать на msdn.microsoft.com?

Quote (Glebonus)
в сплошь

Боюсь, что эту идею реализовать невозможно. sad


Сайт Влада. Администратор.
 
AlgorithmДата: Четверг, 06.10.2011, 17:08 | Сообщение # 14
Рядовой
Группа: Пользователи
Сообщений: 1
Статус: Offline
Влад, здравствуйте! В теме шла речь о прозрачности формы и было упоминание контрола PictureBox - не могли бы подсказать программный код реализующий прозрачнось этого контрола на VB6. Буду очень признателен и хочется заранее поблагодарить за помощь в осуществлении подобного с контролом!
 
Форум » VISUAL BASIC » Обсуждаем язык » 100% прозрачность формы (Именно формы, контролы должны оставаться видны.)
Страница 1 из 11
Поиск:

Создать бесплатный сайт с uCoz