SetLayeredWindowAttribute

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
гравёр
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 30.03.2004 (Вт) 13:50

SetLayeredWindowAttribute

Сообщение гравёр » 30.03.2004 (Вт) 13:58

кто-нить использовал ее для создания формы прозрачной по цвету, т.е. dwFlags=LWA_COLORKEY?
там вторым параметром в функции идет ссыла на цвет COLORREF. я никак не могу найти, что это за colorref и как ссылку на него организовать.
будущее за машинами времени

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 30.03.2004 (Вт) 17:49

Это - Long с разложением по RGBA. Самый младший байт (0-255) - красный, самый старший - альфа-канал. А ссылку - как обычно.

гравёр
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 30.03.2004 (Вт) 13:50

Сообщение гравёр » 30.03.2004 (Вт) 23:04

я наверно ламер и мне следовало задать вопрос в разделе для начинающих :), но как сделать ссылку?
будущее за машинами времени

_Мика_
Гуру
Гуру
 
Сообщения: 1459
Зарегистрирован: 24.10.2003 (Пт) 15:05
Откуда: г. Москва, м.Речной вокзал

Сообщение _Мика_ » 31.03.2004 (Ср) 7:53

Интернет или на рабочий стол :?: по точнее вопросы задавайте
-Папа, а правда, что форумы делают людей дибилами?
-гы гы гы, сынок, лол!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.03.2004 (Ср) 9:52

Код: Выделить всё
Call SetLayeredWindowAttributes(Me.hWnd As Long, RGB(20,30,40), 128, LWA_COLORKEY)
Lasciate ogni speranza, voi ch'entrate.

гравёр
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 30.03.2004 (Вт) 13:50

Сообщение гравёр » 31.03.2004 (Ср) 17:51

alibek писал(а):
Код: Выделить всё
Call SetLayeredWindowAttributes(Me.hWnd As Long, RGB(20,30,40), 128, LWA_COLORKEY)

не работает, так как rgb() возвращает long, а в функции параметр типа byte. порылся в msdn, там сказано, что в функции используется ссылка на цвет. так как в vb организовать этй ссылку?
будущее за машинами времени

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.03.2004 (Ср) 18:01

Так используй такую декларацию:
Код: Выделить всё
Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Lasciate ogni speranza, voi ch'entrate.

гравёр
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 30.03.2004 (Вт) 13:50

Сообщение гравёр » 01.04.2004 (Чт) 5:31

работает, спасибо. :lol:
з.ы. интересно, нафиг, тогда весь этот гемор с colorref'ом нужен?
будущее за машинами времени

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.04.2004 (Чт) 9:46

Потому что все декларации рассчитаны на C. Там это не "гемор", а "читабельность и структурированность".
Lasciate ogni speranza, voi ch'entrate.

CoolCold
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 04.04.2004 (Вс) 8:45

SetLayeredWindowAttributes

Сообщение CoolCold » 04.04.2004 (Вс) 9:00

Хочу сделать вот что:
вывести текст на экран, то есть грубо говоря только lable и ничего кроме нее,но чтоб и бэкграунда не было видно.
Можно канечно через TextOut на dc рабочего стола,но это криво,думал сделать через прозрачную форму и прозрачную соответственно label на ней, но на SetLayeredWindowAttributes спотыкаюсь

что делаю:
Dim msg As Long
Dim hwnd As Long
hwnd = Form1.hwnd
msg = GetWindowLong(Form1.hwnd, GWL_EXSTYLE)
msg = msg Or WS_EX_LAYERED
SetWindowLong Form1.hwnd, GWL_EXSTYLE, msg
SetLayeredWindowAttributes hwnd, Form1.BackColor, 150, LWA_COLORKEY

и че то не получается...или я может вообще не правильно понял юзанье етого SetLayered...

fallen
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 06.04.2003 (Вс) 22:06

Сообщение fallen » 04.04.2004 (Вс) 18:14

да вроде все правильно. у меня точно так же и работает.
а в чем проблемма? окно непрозрачное или ошибку выдает?

Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Сообщение Max! » 04.04.2004 (Вс) 22:44

Папробуйте так
Код: Выделить всё
'В Generals:
Private Declare Function BeginPath Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function EndPath Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function PathToRegion Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" _
(ByVal hWnd As Long, ByVal hRgn As Long, _
ByVal bRedraw As Boolean) As Long
Dim mMove As Boolean
Dim SX As Integer
Dim SY As Integer
'В форму:
Private Sub Form_Load()
Const TEXT = "Hi i am Virus!"
Dim hRgn As Long
Font.Name = "A"
Font.Bold = True
Font.Size = 55
Width = TextWidth(TEXT)
Height = TextHeight(TEXT)
BeginPath hdc
Print TEXT
EndPath hdc
hRgn = PathToRegion(hdc)
SetWindowRgn hWnd, hRgn, False
Move (Screen.Width - Width) / 2, (Screen.Height - Height) / 2
End Sub


Код не мой я когдато нашол с исходником !!! Но мне кажется это то, что тебе нужно! 8) :wink:
Max!

CoolCold
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 04.04.2004 (Вс) 8:45

Сообщение CoolCold » 04.04.2004 (Вс) 23:23

да вроде все правильно. у меня точно так же и работает.
а в чем проблемма? окно непрозрачное или ошибку выдает?

прозрачным не делается :(

вот полный код:
Option Explicit
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 Declare Function UpdateLayeredWindow Lib "user32" (ByVal hwnd As Long, ByVal hdcDst As Long, pptDst As Any, psize As Any, ByVal hdcSrc As Long, pptSrc As Any, crKey As Long, ByVal pblend As Long, ByVal dwFlags As Long) As Long
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 Const GWL_EXSTYLE = (-20)
Private Const LWA_COLORKEY = &H1
Private Const LWA_ALPHA = &H2
Private Const ULW_COLORKEY = &H1
Private Const ULW_ALPHA = &H2
Private Const ULW_OPAQUE = &H4
Private Const WS_EX_LAYERED = &H80000

Private Sub Command1_Click()
Dim msg As Long
Dim hwnd As Long
Dim backcl As Long
hwnd = Form1.hwnd
backcl = Form1.BackColor
msg = GetWindowLong(hwnd, GWL_EXSTYLE)
msg = msg Or WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, msg

SetLayeredWindowAttributes hwnd, backcl, 150, LWA_COLORKEY
End Sub

если возможно пришли свой проект,может свойство формы там не выставил какое или что то еще..
email - coolcold at coolcold.org

CoolCold
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 04.04.2004 (Вс) 8:45

Сообщение CoolCold » 04.04.2004 (Вс) 23:55

А код с регионами - да,работает,в принципе то что нужно,но хочется сделать красивее, да и Layered Windows технически правильнее имхо.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

    TopList