[ notebookFun @ 04.04.2010. 19:37 ] @
Interesuje me da li je moguce napraviti okruglu ili elipsoidnu formu. Ako ima neko neki gotov source ili tutorial bio bih mu zahvalan!
[ t.marko016 @ 04.04.2010. 20:42 ] @
Sve ovo ide u Form:

Code:

Option Explicit

Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long

Private Const RGN_OR = 2
Private Const RGN_DIFF = 4
Dim CreateForm As Long

Private Sub Form_Load()
CreateForm = CreateRoundRectRgn(0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY, [b]25, 25[/b])
SetWindowRgn Me.hwnd, CreateForm, False
End Sub


Menjaj sdrzaj brojeva koji su Bold i dobices oblik koji ti odgovara.

U naslov si napisao transparentnost forme, to znaci da je forma providna a ne oblika elipse .
[ notebookFun @ 04.04.2010. 21:19 ] @
Znam da je providnost, ali sam mislio da se uz pomoc providnosti i slike u obliku eklipse pravi takva forma!
[ t.marko016 @ 04.04.2010. 21:27 ] @
Ako sam razumeo ti hoces da napravis nevidljivu formu i da umesto nje bude neka okrugla slika?

Moze da oblikujes formu u obliku neke slike tim kodom a ovo sa slikom i providnosti je science fiction bar za mene.
[ deerbeer @ 04.04.2010. 21:32 ] @
Tako i treba . slika tj. 32bit bitmapa mora da ima alfa kanal za transparenciju.
Na osnovu tih vrednosti treba da napravis region tj. konturu (Imam rutinu za to ali je kod u C++ pa ne znam koliko ce ti to pomoci u VB)
pomocu kojeg ces da oblikujes prozor sa f-ijom SetWindowRgn .

Prozor mora biti kreiran sa WS_EX_LAYERED stilom koji dozvoljava transparentost
Ako je alfa vrednost u bitmapi nula to je nevidljivi deo prozora ,a ako je razlicit od nule vidljivi deo .
Pogledaj takodje na msdnu f-ije SetLayeredWindow i UpdateLayeredWindow.
[ Marko_L @ 04.04.2010. 22:36 ] @
Napravi bitmapu na osnovu koje hoćeš da praviš providnost. Sve što hoćeš da bude providno ofarbaj u crno (RGB 0 0 0) i dodaj sliku kao pozadinu na formi. Onda ubaci ovaj kod
Code:
Option Explicit

Const LWA_COLORKEY = &H1
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.dll" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

Private Sub Form_Load()
    Dim ret As Long
    Dim clr As Long
    clr = RGB(0, 0, 0)
    ret = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
    ret = ret Or WS_EX_LAYERED
    SetWindowLong Me.hwnd, GWL_EXSTYLE, ret
    SetLayeredWindowAttributes Me.hwnd, clr, 0, LWA_COLORKEY
End Sub
[ vuchko.vuchko @ 06.04.2010. 18:35 ] @
Ili jednostavno postavi da ti podloga forme bude crna i to je to...

Citat:
Code:
Option Explicit

Const LWA_COLORKEY = &H1
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.dll" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

Private Sub Form_Load()
    Form1.BackColor = 0
    Dim ret As Long
    Dim clr As Long
    clr = RGB(0, 0, 0)
    ret = GetWindowLong(Me.hwnd, GWL_EXSTYLE)
    ret = ret Or WS_EX_LAYERED
    SetWindowLong Me.hwnd, GWL_EXSTYLE, ret
    SetLayeredWindowAttributes Me.hwnd, clr, 0, LWA_COLORKEY
End Sub
[ Marko_L @ 06.04.2010. 20:11 ] @
Pa tako će mu cela forma biti transparentna, a koliko sam razumeo on hoće da samo deo forme bude transparentan, tj. da ima nepravilan oblik forme.
[ deerbeer @ 06.04.2010. 21:06 ] @
Sta ako prozor treba da bude nepravilnog oblika ?
Treba mu rutina koja iz 32bit bitmape izdvaja region tj. konturu i povrsinu prozora da definise sa SetWindowRgn .
U suprotnom mora unapred znati koju povrsinu (region) zauzima vidljivi deo prozora tj. bitmape .
Kod iscrtavanja bitmape preko prozora treba koristiti Winapi AlphaBlend f-iju .



[ vuchko.vuchko @ 07.04.2010. 13:57 ] @
Pa ako treba prozor bas da bude nepravilnog oblika to je objasnijo t.marko016 , a moze ovako kao sto sto je Marko na pisao a ja doradio...

Ovako je isto dobro,jer je sada cijela forma transparentna, npr. mozes postaviti borserstile=0 i na formi napraviti oblik koji je potreban.