Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Кто может поправить UserControl? Добавлено: 23.07.05 23:31  

Автор вопроса:  HACKER
Есть юзерконтрол, писал я, но почему-то он не работает... наверно потому что писал я :) Вообщем кто знает чего он не рисует, подскажите...

сам он
http://www.webfile.ru/420226

его код


Private Declare Function DrawTransparent Lib "msimg32.dll" Alias "TransparentBlt" (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 crTransparent As Long) As Long

Public Function TransparentBlt(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 TransparentColor As Long) As Long
  DrawTransparent destHDC, XDest, YDest, destWidth, destHeight, srcHDC, XSrc, ycrc, srcWidth, srcHeight, TransparentColor
End Function

Private Sub UserControl_Show()
UserControl.BackColor = Picture1.Point(0, 0)

  Dim clr As Long, w As Long, h As Long
  w = Picture1.ScaleWidth
  h = Picture1.ScaleHeight
  clr = Picture1.Point(0, 0)
  Call TransparentBlt(UserControl.hdc, 0, 0, w, h, Picture1.hdc, 0, 0, w, h, clr)
  UserControl.Refresh
End Sub

Ответить

  Ответы Всего ответов: 25  

Номер ответа: 1
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #1 Добавлено: 23.07.05 23:37
там токо щас Picture1 прописан, так что остальные и не должен, но всё же, покажите как хоть сделать прозрачный Picture1

Ответить

Номер ответа: 2
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #2 Добавлено: 24.07.05 06:00
Для справки.
TransparentBlt на 9x содержит ошибку, приводящую к очень быстрому исчерпанию графических ресурсов системы.

Ответить

Номер ответа: 3
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #3 Добавлено: 24.07.05 18:08
пока WinXP, если прям возникнут серёзные баги на 9x, возможно сделаем проверку оси, и в 9х небудем использовать TransparentBlt

Ответить

Номер ответа: 4
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #4 Добавлено: 25.07.05 18:07
блин, ну хорошо :( Поставлю вопрос по другому.

Как в ЮзерКонтроле нарисовать картинку но так чтобы определённый цвет остался прозрачным, не только пока мы в юзерконтроле, но и остался прозрачным когда мы юзерконтрол на форму прилепим. Знаю что у юзерконтрола есть Transparent но мне это не подходит! К примеру я кидаю на контрол Image в котором загружен определёный gif с прозрачностью. Пока мы в юзерконтроле - всё ок, прозрачного цвета в Image не видно, как только рисую контрол на форму - лажа... цвет прозрачный делается не прозрачным :( Чё делать?

Ответить

Номер ответа: 5
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #5 Добавлено: 25.07.05 18:27
А, и ты тоже...
Тёмыч давно написал. http://mix.web.ur.ru/GIF.rar

Ответить

Номер ответа: 6
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #6 Добавлено: 25.07.05 23:13
та я рад что тёмыч написал, аналогичный примеров много, там кода в несколько КБ, а задача маленькая, уверен решается в несколько строчек, а не в несколько КБ... Может ты знаешь функцию которая проприсовывает картинку игнорируя определённый цвет?

Ответить

Номер ответа: 7
Автор ответа:
 AASoft



Вопросов: 86
Ответов: 920
 Профиль | | #7 Добавлено: 26.07.05 00:48
che delat`, che delat`, regiony ispol`zovat`...primer na etom sakte gdeto byl

Ответить

Номер ответа: 8
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #8 Добавлено: 26.07.05 01:58
HACKER
Бросай к чёрту контролы, рисуй вживую, а то контролы - это как секс с презервативом :)))

Ответить

Номер ответа: 9
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #9 Добавлено: 26.07.05 12:56
2HOOLIGAN, ну я бы сказал больше...

Солнце, воздух и вода
не помогут никогда.
Только спирт и онанизм
укрепляют организм.
Онанизм наш лучший друг -
развивает мышцы рук,
уменьшает вес му#ей
и расходы на бля#ей.

Контрол - вешь хорошая, когда в исходниках. Ежели не в них - то если не на VB :)

Ответить

Номер ответа: 10
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #10 Добавлено: 26.07.05 16:12
:( чё то вы меня растроили... Причём тут контролы или не контролы... Тут чистое API программирование, к примеру, не на контроле, так как на форме нарисовать картинку игнорируя определённый цвет?

Ответить

Номер ответа: 11
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #11 Добавлено: 27.07.05 11:10
DrawIcon :)

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 27.07.05 15:57
мда... чё-то ты LOL слабенькую функцию предложил, она нефига не умеет.

Функция DrawIcon

     Описание:
 function DrawIcon(DC: HDC; X, Y: Integer; Icon: HIcon): Bool;
     Рисует пиктограмму.

     Параметры:
     ;DC: Идентификатор контекста устройства.
     X, Y: Верхний левый угол пиктограммы.
     Icon: Рисуемая пиктограмма.

     Возвращаемое значение:
     Не нуль - в случае успешного завершения; 0 - в противном случае.

 функция находится в файле user32.dll

Ответить

Номер ответа: 13
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #13 Добавлено: 27.07.05 16:50
о что я надыбал

Option Explicit

'Здесь находятся функции, переменные и типы, необходимые для прорисовки прозрачного фона
'некоторые переменные закоментированны, так как они уже были описанны в модуле Declare
'условием корректной работы этой функции является то, что PictureBox (PicSkin.hdc) из которого мы берем картинку должен
'быть обязательно AutoRedraw = True иначе при определенных условиях формы и того где мы будем вызывать
'эту функцию (Form_Paint или еще где), может некорректно прорисовываться картинка или вообще не прорисовываться

'Завершением работы программы или контрола после использования функции TransparentBlt должна быть функция ClearTransparent


Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type

Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long
Private Declare Function SetBkColor Lib "gdi32" (ByVal hDC As Long, ByVal crColor As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private nRet As Long, W As Integer, H As Integer
Private MonoMaskDC As Long, hMonoMask As Long
Private MonoInvDC As Long, hMonoInv As Long
Private ResultDstDC As Long, hResultDst As Long
Private ResultSrcDC As Long, hResultSrc As Long
Private hPrevMask As Long, hPrevInv As Long
Private hPrevSrc As Long, hPrevDst As Long

Public Sub TransparentBlt(OutDstDC As Long, DstDC As Long, SrcDC As Long, SrcRect As RECT, DstX As Integer, DstY As Integer, TransColor As Long)
Dim TransColor As Long

    W = SrcRect.Right - SrcRect.Left
    H = SrcRect.Bottom - SrcRect.Top
    
    Call ClearTransparent
    
    MonoMaskDC = CreateCompatibleDC(DstDC)
    MonoInvDC = CreateCompatibleDC(DstDC)
    hMonoMask = CreateBitmap(W, H, 1, 1, ByVal 0&;)
    hMonoInv = CreateBitmap(W, H, 1, 1, ByVal 0&;)
    hPrevMask = SelectObject(MonoMaskDC, hMonoMask)
    hPrevInv = SelectObject(MonoInvDC, hMonoInv)
    
    ResultDstDC = CreateCompatibleDC(DstDC)
    ResultSrcDC = CreateCompatibleDC(DstDC)
    hResultDst = CreateCompatibleBitmap(DstDC, W, H)
    hResultSrc = CreateCompatibleBitmap(DstDC, W, H)
    hPrevDst = SelectObject(ResultDstDC, hResultDst)
    hPrevSrc = SelectObject(ResultSrcDC, hResultSrc)
    
    Dim OldBC As Long
    OldBC = SetBkColor(SrcDC, TransColor)
    nRet = BitBlt(MonoMaskDC, 0, 0, W, H, SrcDC, SrcRect.Left, SrcRect.Top, vbSrcCopy)
    TransColor = SetBkColor(SrcDC, OldBC)
    
    nRet = BitBlt(MonoInvDC, 0, 0, W, H, MonoMaskDC, 0, 0, vbNotSrcCopy)
    
    nRet = BitBlt(ResultDstDC, 0, 0, W, H, DstDC, DstX, DstY, vbSrcCopy)
    
    nRet = BitBlt(ResultDstDC, 0, 0, W, H, MonoMaskDC, 0, 0, vbSrcAnd)
    
    nRet = BitBlt(ResultSrcDC, 0, 0, W, H, SrcDC, SrcRect.Left, SrcRect.Top, vbSrcCopy)
    
    nRet = BitBlt(ResultSrcDC, 0, 0, W, H, MonoInvDC, 0, 0, vbSrcAnd)
    
    nRet = BitBlt(ResultDstDC, 0, 0, W, H, ResultSrcDC, 0, 0, vbSrcInvert)
    
    nRet = BitBlt(OutDstDC, DstX, DstY, W, H, ResultDstDC, 0, 0, vbSrcCopy)
    
End Sub

Public Sub ClearTransparent()
    hMonoMask = SelectObject(MonoMaskDC, hPrevMask)
    
    ;DeleteObject hMonoMask
    
    hMonoInv = SelectObject(MonoInvDC, hPrevInv)
    ;DeleteObject hMonoInv
    
    hResultDst = SelectObject(ResultDstDC, hPrevDst)
    ;DeleteObject hResultDst
    
    hResultSrc = SelectObject(ResultSrcDC, hPrevSrc)
    ;DeleteObject hResultSrc
    
    ;DeleteObject MonoMaskDC
    ;DeleteObject MonoInvDC
    ;DeleteObject ResultDstDC
    ;DeleteObject ResultSrcDC
End Sub


этот в код в принципе рисует, но почему-то цвет прозрачный не делает, т.е. рисует без него. Может у кого-то получится этим примером добиться прозрачности на картинке?

Ответить

Номер ответа: 14
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #14 Добавлено: 27.07.05 16:52
кто надумает тестить, проще


не
    W = SrcRect.Right - SrcRect.Left
    H = SrcRect.Bottom - SrcRect.Top

а

    W = Picture1.Width
    H = Picture1.Height

Ответить

Номер ответа: 15
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #15 Добавлено: 27.07.05 17:21
УРА!!! ПОЛУЧИЛОСЬ!

1) AutoRedraw = True
2) BackStyle = Opaque

3) ...


Option Explicit

Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long
Private Declare Function SetBkColor Lib "gdi32" (ByVal hDC As Long, ByVal crColor As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private nRet As Long, W As Integer, H As Integer
Private MonoMaskDC As Long, hMonoMask As Long
Private MonoInvDC As Long, hMonoInv As Long
Private ResultDstDC As Long, hResultDst As Long
Private ResultSrcDC As Long, hResultSrc As Long
Private hPrevMask As Long, hPrevInv As Long
Private hPrevSrc As Long, hPrevDst As Long

Private Sub TransparentBlt(OutDstDC As Long, DstDC As Long, SrcDC As Long, DstX As Integer, DstY As Integer, DstH As Integer, DstW As Integer, TransColor As Long)
'Dim TransColor As Long

    W = DstW
    H = DstH
    
    Call ClearTransparent
    
    MonoMaskDC = CreateCompatibleDC(DstDC)
    MonoInvDC = CreateCompatibleDC(DstDC)
    hMonoMask = CreateBitmap(W, H, 1, 1, ByVal 0&;)
    hMonoInv = CreateBitmap(W, H, 1, 1, ByVal 0&;)
    hPrevMask = SelectObject(MonoMaskDC, hMonoMask)
    hPrevInv = SelectObject(MonoInvDC, hMonoInv)
    
    ResultDstDC = CreateCompatibleDC(DstDC)
    ResultSrcDC = CreateCompatibleDC(DstDC)
    hResultDst = CreateCompatibleBitmap(DstDC, W, H)
    hResultSrc = CreateCompatibleBitmap(DstDC, W, H)
    hPrevDst = SelectObject(ResultDstDC, hResultDst)
    hPrevSrc = SelectObject(ResultSrcDC, hResultSrc)
    
    Dim OldBC As Long
    OldBC = SetBkColor(SrcDC, TransColor)
    nRet = BitBlt(MonoMaskDC, 0, 0, W, H, SrcDC, DstX, DstY, vbSrcCopy)
    TransColor = SetBkColor(SrcDC, OldBC)
    
    nRet = BitBlt(MonoInvDC, 0, 0, W, H, MonoMaskDC, 0, 0, vbNotSrcCopy)
    
    nRet = BitBlt(ResultDstDC, 0, 0, W, H, DstDC, DstX, DstY, vbSrcCopy)
    
    nRet = BitBlt(ResultDstDC, 0, 0, W, H, MonoMaskDC, 0, 0, vbSrcAnd)
    
    nRet = BitBlt(ResultSrcDC, 0, 0, W, H, SrcDC, DstX, DstY, vbSrcCopy)
    
    nRet = BitBlt(ResultSrcDC, 0, 0, W, H, MonoInvDC, 0, 0, vbSrcAnd)
    
    nRet = BitBlt(ResultDstDC, 0, 0, W, H, ResultSrcDC, 0, 0, vbSrcInvert)
    
    nRet = BitBlt(OutDstDC, DstX, DstY, W, H, ResultDstDC, 0, 0, vbSrcCopy)
    
End Sub

Public Sub ClearTransparent()
    hMonoMask = SelectObject(MonoMaskDC, hPrevMask)
    
    ;DeleteObject hMonoMask
    
    hMonoInv = SelectObject(MonoInvDC, hPrevInv)
    ;DeleteObject hMonoInv
    
    hResultDst = SelectObject(ResultDstDC, hPrevDst)
    ;DeleteObject hResultDst
    
    hResultSrc = SelectObject(ResultSrcDC, hPrevSrc)
    ;DeleteObject hResultSrc
    
    ;DeleteObject MonoMaskDC
    ;DeleteObject MonoInvDC
    ;DeleteObject ResultDstDC
    ;DeleteObject ResultSrcDC
End Sub

Private Sub UserControl_Show()
'Dim r As RECT
Dim clr As Long
clr = Picture1.Point(1, 1)
UserControl.BackColor = clr
  
  Call TransparentBlt(UserControl.hDC, UserControl.hDC, Picture1.hDC, Picture1.Top, Picture1.Left, Picture1.Height, Picture1.Width, clr)
UserControl.Refresh
End Sub



картинка прорисовывается без того цвета который я задам clr т.е. прозрачная! Осталась 1 трабла :) поскольку BackStyle = Opaque и по другому никак... а у меня на frmMain лежит Image с картинокй на весь экран, это типа фон, так вот нужно прорисовать на контроле ту чать этой картинки (Image) которую перекрывает UserControl, затем я поверх того что получится прорисую мою картинку (с помощью кода который выше) и всё будет ти топ! Знаю что вроде BitBlt надо использовать, но как именно, вообщем у меня нечего не получилось, немогу вырезать кусочек который перекрывает контрол и прорисовать этот кусочек на контроле. Помогите плиз!!!!

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам