Излагаю суть проблемы, я уже довольно давно программирую на VB6, если быть точным 3 года, так вот, при создании нестандартных форм, ну с применением картинок, то возникает проблема с прорисовкой картинки, белый фон удаляется, но не полностью, по кроям остаются мелкие белые точки или полоски.
Я перепробовал много разных кодов, но эффект один и додже.
Я привиду исходный код примера, а вы может скажите где ошибка.
Public Function RSS_region()
Dim hRgn As Long, tRgn As Long
Dim X As Integer, Y As Integer, X0 As Integer
Dim hDC As Long, BT As BITMAP
hDC = CreateCompatibleDC(frmReLAX.hDC)
If hDC Then
SelectObject hDC, frmReLAX.Picture
GetObject frmReLAX.Picture, Len(BT), BT
hRgn = CreateRectRgn(1, 0, BT.bmWidth, BT.bmHeight)
For Y = 0 To BT.bmHeight
For X = 0 To BT.bmWidth
While X <= BT.bmWidth And GetPixel(hDC, X, Y) <> vbWhite
X = X + 1
Wend
X0 = X
While X <= BT.bmWidth And GetPixel(hDC, X, Y) = vbWhite
X = X + 1
Wend
If X0 < X Then
tRgn = CreateRectRgn(X0, Y - 2, X + 1, Y + 1)
CombineRgn hRgn, hRgn, tRgn, 4
DeleteObject tRgn
End If
Next X
Next Y
SetWindowRgn frmReLAX.hwnd, hRgn, True
DeleteObject SelectObject(hDC, frmReLAX.Picture)
End If
DeleteDC hDC
End Function
Надеюсь пояснять ненадо.
Да ещё, при создание угольньных форм без огруглостей, код работает нормально.
Я бы прилипил файл с картинкой - примером, но не допёр как.
Я лично такие формы не создаю - изврат имхо. Хотя есно если писать что-то декаративное, вроде авторана для диска, может изврат и оправдан... В серезном приложении кривая форма портит всю серезность приложения
Public Function RSS_region()
Dim hRgn As Long, tRgn As Long
Dim X As Integer, Y As Integer, X0 As Integer
Dim hDC As Long, BT As BITMAP
hDC = CreateCompatibleDC(frmReLAX.hDC)
If hDC Then
SelectObject hDC, frmReLAX.Picture
GetObject frmReLAX.Picture, Len(BT), BT
hRgn = CreateRectRgn(1, 0, BT.bmWidth, BT.bmHeight)
For Y = 0 To BT.bmHeight
For X = 0 To BT.bmWidth
While X <= BT.bmWidth And GetPixel(hDC, X, Y) <> vbWhite
X = X + 1
Wend
X0 = X
While X <= BT.bmWidth And GetPixel(hDC, X, Y) = vbWhite
X = X + 1
Wend
If X0 < X Then
tRgn = CreateRectRgn(X0, Y - 2, X + 1, Y + 1)
CombineRgn hRgn, hRgn, tRgn, 4
 eleteObject tRgn
End If
Next X
Next Y
SetWindowRgn frmReLAX.hwnd, hRgn, True
 eleteObject SelectObject(hDC, frmReLAX.Picture)
End If
 eleteDC hDC
End Function
Да ещё, Вы сами как создаёте, такие формы, поделитесь кодиком плизз, и вот ещё вопросик, как у Вас тут прицеплять файлы?
Ну что ж, на твой выбор предлагаю (а ты уж сам выберешь или что-то новое найдешь)
1)Его я нашел где-то в интернете:
Option Explicit
Private Declare Function SelectClipPath Lib "gdi32" (ByVal hdc As Long, ByVal iMode As Long) As Long
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
Private Const RGN_COPY = 5
Private Sub Form_Load()
' Don't forget to set Form.BorderStyle property to None !
Const TXT = " Cool programm" & vbCrLf & " from" & vbCrLf & "Cool Company" & vbCrLf & "CopyLeft by Ark"
Dim hRgn As Long
Font.Name = "Times New Roman"
Font.Bold = True
Font.Size = 60
Width = TextWidth(TXT)
Height = TextHeight(TXT)
BeginPath hdc
Print TXT
' Здесь вместо текста можно рисовать фигуры
EndPath hdc
hRgn = PathToRegion(hdc)
SetWindowRgn hWnd, hRgn, False
'Hачинаем фантазировать с формой. Можно так
'Picture = LoadPicture("c:\windows\облака.bmp"
' А можно так
' dclr = 256 / (TextHeight(TXT) / 30)
' clr = 0
' For i = 120 To 120 + TextHeight(TXT) Step 30
' Line (0, i)-Step(5000, 0), RGB(0, 0, clr)
' clr = clr + dclr
' Next i
' Можно дать форме градиентную заливку и т.д.
' Двигаем к центру, а можно в таймере крутить
Move (Screen.Width - Width) / 2, (Screen.Height - Height) / 2
End Sub
2)А вот над этим я долго сам бился:
Option Explicit
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" (ByVal H As Long, ByVal W As Long, ByVal E As Long, ByVal O As Long, ByVal W2 As Long, ByVal i As Long, ByVal u As Long, ByVal S As Long, ByVal c As Long, ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, ByVal PAF As Long, ByVal f As String) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function BeginPath Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount 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 Long) As Long
Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, _
ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Function SetCreateForm(ByVal propHwnd As Long, ByVal propHDC As Long)
Dim rComb As Long
Dim dl As Long
Dim vFont As Long
Dim vFontOld As Long
Dim vDC As Long
Dim f As POINTAPI
Private Sub Form_DblClick()
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, CLR_BLACK, 128, LWA_COLORKEY
End Sub
И в модуле:
Option Explicit
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
 ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
 ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, _
ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Public Const GWL_EXSTYLE = (-20)
Public Const WS_EX_LAYERED = &H80000
Public Const LWA_COLORKEY = &H1
Public Const LWA_ALPHA = &H2
Public Const CLR_WHITE = &HFFFFFF
Public Const CLR_BLACK = &H0&
Все понятно, все известно?
Последний случай делает прозрачным заданный цвет. Т. е. делаешь форму того цвета, и ставишь её без бордюра
-АлександР-, мне было некогда и потому не заглядывал на форум, но ладно, хоть и с запозданием, но всё же заглянул, ты спросил долго ли выполняется мой код, понятия долга у всех разное, для меня принципе пойдёт, можно было конечно же побыстрее но всё же пойдёт.
На счёт кодов, мне немного некогда было смотреть и потому, ответ напишу немного позже.