Picture !!!!! HELP !

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Max!
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 502
Зарегистрирован: 03.04.2003 (Чт) 22:08
Откуда: Литва

Picture !!!!! HELP !

Сообщение Max! » 26.10.2004 (Вт) 21:02

Есть Picture1 в нём ресунок , есть пустые места ! Ворпос как сделать чтоб Picture1 обрезался по контору ресунка , чтоб небыло пустых мест !!!! :?: :?: :?: :?: Очень нужно !!!!
Max!

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

Сообщение Max! » 26.10.2004 (Вт) 22:14

HEEEELLLPP :evil: :evil: :evil: :evil:
Max!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 26.10.2004 (Вт) 22:30

Вот пример, обрезающий форму по картинке. Всё белое (255, 255, 255) отрезается. Разберись сам, - мну сейчас некогда :(

Код: Выделить всё
Private Type BITMAPINFO
    bmiHeader As BITMAPINFOHEADER
    bmiColors As RGBQUAD
End Type

Private Const DIB_RGB_COLORS = 0&
Private Const BI_RGB = 0&

Private Const pixR As Integer = 3
Private Const pixG As Integer = 2
Private Const pixB As Integer = 1

Private Type BITMAP '14 bytes
    bmType As Long
    bmWidth As Long
    bmHeight As Long
    bmWidthBytes As Long
    bmPlanes As Integer
    bmBitsPixel As Integer
    bmBits As Long
End Type

Private Type BITMAPINFOHEADER '40 bytes
    biSize As Long
    biWidth As Long
    biHeight As Long
    biPlanes As Integer
    biBitCount As Integer
    biCompression As Long
    biSizeImage As Long
    biXPelsPerMeter As Long
    biYPelsPerMeter As Long
    biClrUsed As Long
    biClrImportant As Long
End Type

Private Type RGBQUAD
    rgbBlue As Byte
    rgbGreen As Byte
    rgbRed As Byte
    rgbReserved As Byte
End Type
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal x1 As Long, ByVal y1 As Long, ByVal X2 As Long, ByVal Y2 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 Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

' DIB stuff.
Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long

' Fir the form to the pixels that don't match the color.
Private Sub ShapeForm(ByVal pic As PictureBox, ByVal transparent_color As Long)
Const RGN_OR = 2
Dim bytes_per_scanLine As Integer
Dim wid As Long
Dim hgt As Long
Dim bitmap_info As BITMAPINFO
Dim pixels() As Byte
Dim buffer() As Byte
Dim transparent_r As Byte
Dim transparent_g As Byte
Dim transparent_b As Byte
Dim border_width As Single
Dim title_height As Single
Dim x0 As Long
Dim y0 As Long
Dim start_c As Integer
Dim stop_c As Integer
Dim R As Integer
Dim C As Integer
Dim combined_rgn As Long
Dim new_rgn As Long

    ScaleMode = vbPixels
    pic.ScaleMode = vbPixels
    pic.AutoRedraw = True
    pic.Picture = pic.Image

    ' Prepare the bitmap description.
    wid = pic.ScaleWidth
    hgt = pic.ScaleHeight
    With bitmap_info.bmiHeader
        .biSize = 40
        .biWidth = wid
        ' Use negative height to scan top-down.
        .biHeight = -hgt
        .biPlanes = 1
        .biBitCount = 32
        .biCompression = BI_RGB
        bytes_per_scanLine = ((((.biWidth * .biBitCount) + 31) \ 32) * 4)
        .biSizeImage = bytes_per_scanLine * hgt
    End With

    ' Load the bitmap's data.
    ReDim pixels(1 To 4, 1 To wid, 1 To hgt)
    GetDIBits pic.hDC, pic.Image, _
        0, hgt, pixels(1, 1, 1), _
        bitmap_info, DIB_RGB_COLORS

    ' Process the pixels.
    ' Break the tansparent color apart.
    UnRGB transparent_color, transparent_r, transparent_g, transparent_b

    ' Find the form's corner.
    border_width = (ScaleX(Width, vbTwips, vbPixels) - ScaleWidth) / 2
    title_height = ScaleX(Height, vbTwips, vbPixels) - border_width - ScaleHeight

    ' Find the picture's corner.
    x0 = pic.Left + border_width
    y0 = pic.Top + title_height

    ' Create the form's regions.
    For R = 1 To hgt
        ' Create a region for this row.
        C = 1
        Do While C <= wid
            start_c = 1
            stop_c = 1

            ' Find the next non-white column.
            Do While C <= wid
                If pixels(pixR, C, R) <> transparent_r Or _
                   pixels(pixG, C, R) <> transparent_g Or _
                   pixels(pixB, C, R) <> transparent_b _
                Then
                    Exit Do
                End If
                C = C + 1
            Loop
            start_c = C

            ' Find the next white column.
            Do While C <= wid
                If pixels(pixR, C, R) = transparent_r And _
                   pixels(pixG, C, R) = transparent_g And _
                   pixels(pixB, C, R) = transparent_b _
                Then
                    Exit Do
                End If
                C = C + 1
            Loop
            stop_c = C

            ' Make a region from start_c to stop_c.
            If start_c <= wid Then
                If stop_c > wid Then stop_c = wid

                ' Create the region.
                new_rgn = CreateRectRgn( _
                    start_c + x0, R + y0, _
                    stop_c + x0, R + y0 + 1)

                ' Add it to what we have so far.
                If combined_rgn = 0 Then
                    combined_rgn = new_rgn
                Else
                    CombineRgn combined_rgn, _
                        combined_rgn, new_rgn, RGN_OR
                    DeleteObject new_rgn
                End If
            End If
        Loop
    Next R

    ' Restrict the form to the region.
    SetWindowRgn hWnd, combined_rgn, True
    DeleteObject combined_rgn
End Sub

'Usage:
' Fit the form to the picture.
ShapeForm picShape, &HFFFFFF


Вроде, не очень сложный код, у меня просто сейчас времени нет совсем...

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

Сообщение Max! » 26.10.2004 (Вт) 23:08

Обрезающих форму по картинке кодов у меня хоть закапывай , а мне нужно шоб форма на месте была а сам Picturebox обрезался по картинке , еслиб мне было легко то яб не стал спрашивать ! :x
Max!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 27.10.2004 (Ср) 8:00

Ага. А если вместо hwnd формы подсунуть hwnd пикчера, то что станет?

YB
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 21.10.2004 (Чт) 7:17
Откуда: Н.Новгород

Сообщение YB » 27.10.2004 (Ср) 9:12

Если картинка загружается из файла, то autosize=true. Если ваяешь сам, то пересчитывай размер пикчи при каждом вводе данных.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 27.10.2004 (Ср) 9:53

Имеется в виду обрезание пикчера по сложной границе рисунка, зачастую не прямолинейной.

Сейчас пробовать некогда :(
Вечером приду и сам попробую разобраться...

Mleha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 146
Зарегистрирован: 06.10.2004 (Ср) 7:49
Откуда: Ангарск

Сообщение Mleha » 27.10.2004 (Ср) 15:26

А если создать контрол с рисунком и обрезать его?
В модуле есть функция, которая удаляет нужный цвет.
Вложения
mdlrgn.rar
(753 байт) Скачиваний: 22

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4160
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 27.10.2004 (Ср) 17:06

Зачем контрол? Просто Image поддерживает прозрачный цвет.


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

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

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

    TopList