Помогите решить проблему с TransparentBlt в Win98 и т.п.!!!!

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

Помогите решить проблему с TransparentBlt в Win98 и т.п.!!!!

Сообщение MagicMan » 18.11.2004 (Чт) 11:14

:?:
Добрый День!!!

Столкнулся с траблой - после длительной работы над проектом наткнулся на то что под 98 прога не запускается - пишет не найден msimg32.dll - хотя в системе он есть. Порылся в инете - в микрософте написано что под 98 и т.п. команда TransparentBlt может обрабатываться некорректно - а как решить не пишут!!!! Эта команда пристутствует в компоненте кнопки в стиле XP - файл .ctl я выложил на http://www.anti-spammer.ru/files/xpb.zip и прикрепил к этому посту.
Выход есть - это заменить все кнопки - но у меня их больше сотни!!! Думаю есть решение по гуманнее.....

Жду совета,
Юрий.

ICQ: 75006889
magicman@anti-spammer.ru
Вложения
Xpb.zip
Компонент кнопки
(5.14 Кб) Скачиваний: 93

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.11.2004 (Чт) 11:43

Когда-то я тут набрасывал... Ага...
Код: Выделить всё
Public Sub TransparentBlt(ByVal hdc 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 crTransparent As Long, _
                          Optional ByVal tmpMaskDC As Long = 0, _
                          Optional ByVal tmpInterDC As Long = 0, _
                          Optional ByVal tmpResultDC As Long = 0)
                         
  'Если предполагаются интенсивные вызовы, то неэффективно каждый раз
  'создавать и удалять DC. Поэтому можно создать их один раз в
  'вызывающем модуле, а сюда передавать через параметры. Тогда здесь ничего
  'не будет создаваться/удаляться.
  'Ответственность за наличие битмапов нужных типов в этих DC несёт вызывающий.
 
  Dim tmpMaskBitmap As Long
  Dim tmpResultBitmap As Long
  Dim tmpInterBitmap As Long
  Dim prevBkColor As Long
 
  If tmpMaskDC = 0 Then
    tmpMaskDC = CreateCompatibleDC(hdc)
    tmpMaskBitmap = CreateBitmap(nWidth, nHeight, 1, 1, ByVal 0&)
    DeleteObject SelectObject(tmpMaskDC, tmpMaskBitmap)
  End If
 
  If tmpInterDC = 0 Then
    tmpInterDC = CreateCompatibleDC(hSrcDC)
    tmpInterBitmap = CreateCompatibleBitmap(hSrcDC, nWidth, nHeight)
    DeleteObject SelectObject(tmpInterDC, tmpInterBitmap)
  End If
 
  If tmpResultDC = 0 Then
    tmpResultDC = CreateCompatibleDC(hdc)
    tmpResultBitmap = CreateCompatibleBitmap(hdc, nWidth, nHeight)
    DeleteObject SelectObject(tmpResultDC, tmpResultBitmap)
  End If
 
  'Маска накладываемой картинки -> maskDC
  prevBkColor = SetBkColor(hSrcDC, crTransparent)
  BitBlt tmpMaskDC, 0, 0, nWidth, nHeight, hSrcDC, xSrc, ySrc, vbNotSrcCopy
  SetBkColor hSrcDC, prevBkColor
 
  'Копия накладываемой картинки -> interDC
  BitBlt tmpInterDC, 0, 0, nWidth, nHeight, hSrcDC, xSrc, ySrc, vbSrcCopy
 
  'Маскированная накладываемая картинка -> interDC
  BitBlt tmpInterDC, 0, 0, nWidth, nHeight, tmpMaskDC, 0, 0, vbSrcAnd
 
  'Копия фона -> resultDC
  BitBlt tmpResultDC, 0, 0, nWidth, nHeight, hdc, x, y, vbSrcCopy
 
  'Инвертируем маску
  BitBlt tmpMaskDC, 0, 0, nWidth, nHeight, 0, 0, 0, vbDstInvert
 
  'Маскированный обратной маской фон -> resultDC
  BitBlt tmpResultDC, 0, 0, nWidth, nHeight, tmpMaskDC, 0, 0, vbSrcAnd
 
  'Слияние двух маскированных картинок через XOR
  BitBlt tmpResultDC, 0, 0, nWidth, nHeight, tmpInterDC, 0, 0, vbSrcPaint
 
  'Вывод результата
  BitBlt hdc, x, y, nWidth, nHeight, tmpResultDC, 0, 0, vbSrcCopy
 
  If tmpMaskBitmap Then DeleteDC tmpMaskDC: DeleteObject tmpMaskBitmap
  If tmpInterBitmap Then DeleteDC tmpInterDC: DeleteObject tmpInterBitmap
  If tmpResultBitmap Then DeleteDC tmpResultDC: DeleteObject tmpResultBitmap
End Sub

Public Sub TransparentStretchBlt(ByVal hdc 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 nSrcWidth As Long, ByVal nSrcHeight, _
                          ByVal crTransparent As Long, _
                          Optional ByVal tmpMaskDC As Long = 0, _
                          Optional ByVal tmpInterDC As Long = 0, _
                          Optional ByVal tmpResultDC As Long = 0)
 
  Dim tmpMaskBitmap As Long
  Dim tmpResultBitmap As Long
  Dim tmpInterBitmap As Long
  Dim prevBkColor As Long
 
  If tmpMaskDC = 0 Then
    tmpMaskDC = CreateCompatibleDC(hdc)
    tmpMaskBitmap = CreateBitmap(nWidth, nHeight, 1, 1, ByVal 0&)
    DeleteObject SelectObject(tmpMaskDC, tmpMaskBitmap)
  End If
 
  If tmpInterDC = 0 Then
    tmpInterDC = CreateCompatibleDC(hSrcDC)
    tmpInterBitmap = CreateCompatibleBitmap(hSrcDC, nWidth, nHeight)
    DeleteObject SelectObject(tmpInterDC, tmpInterBitmap)
  End If
 
  If tmpResultDC = 0 Then
    tmpResultDC = CreateCompatibleDC(hdc)
    tmpResultBitmap = CreateCompatibleBitmap(hdc, nWidth, nHeight)
    DeleteObject SelectObject(tmpResultDC, tmpResultBitmap)
  End If
 
  'Маска накладываемой картинки -> maskDC
  prevBkColor = SetBkColor(hSrcDC, crTransparent)
  StretchBlt tmpMaskDC, 0, 0, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, vbNotSrcCopy
  SetBkColor hSrcDC, prevBkColor
 
  'Копия накладываемой картинки -> interDC
  StretchBlt tmpInterDC, 0, 0, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, vbSrcCopy
 
  'Маскированная накладываемая картинка -> interDC
  BitBlt tmpInterDC, 0, 0, nWidth, nHeight, tmpMaskDC, 0, 0, vbSrcAnd
 
  'Копия фона -> resultDC
  BitBlt tmpResultDC, 0, 0, nWidth, nHeight, hdc, x, y, vbSrcCopy
 
  'Инвертируем маску
  BitBlt tmpMaskDC, 0, 0, nWidth, nHeight, 0, 0, 0, vbDstInvert
 
  'Маскированный обратной маской фон -> resultDC
  BitBlt tmpResultDC, 0, 0, nWidth, nHeight, tmpMaskDC, 0, 0, vbSrcAnd
 
  'Слияние двух маскированных картинок через XOR
  BitBlt tmpResultDC, 0, 0, nWidth, nHeight, tmpInterDC, 0, 0, vbSrcPaint
 
  'Вывод результата
  BitBlt hdc, x, y, nWidth, nHeight, tmpResultDC, 0, 0, vbSrcCopy
 
  If tmpMaskBitmap Then DeleteDC tmpMaskDC: DeleteObject tmpMaskBitmap
  If tmpInterBitmap Then DeleteDC tmpInterDC: DeleteObject tmpInterBitmap
  If tmpResultBitmap Then DeleteDC tmpResultDC: DeleteObject tmpResultBitmap
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

MagicMan
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 18.11.2004 (Чт) 11:03

Сообщение MagicMan » 18.11.2004 (Чт) 12:12

Я заменил вызов из msimg32.dll на Вашу функцию, добавил недостающих API - но все равно картинку не показывает.

Жду ответа,
Юрий.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.11.2004 (Чт) 12:22

Ну чё могу посоветовать - только искать баги в кнопке :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

MagicMan
Новичок
Новичок
 
Сообщения: 48
Зарегистрирован: 18.11.2004 (Чт) 11:03

Сообщение MagicMan » 18.11.2004 (Чт) 13:22

херово

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 20.07.2005 (Ср) 15:52

Держи пример - собрал на скорую руку из того что валялось...
Вложения
LogoTr.rar
(5.7 Кб) Скачиваний: 137
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


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

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

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 67

    TopList  
cron