Специалисты по VB и Delphi

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

Специалисты по VB и Delphi

Сообщение Odrick » 18.05.2005 (Ср) 16:55

Хм... Наткнулся на одну замечательную статью, описывающую методы замены цветов по маске:
http://delphigfx.mastak.ru/2d/010/2d_10.htm
В конце приводиться пример по замене цветов на DirectX. Это все правда на Delphi... Насколько реально сделать то же на VB? Может кто-то помочь? Я в Delphi не силен...
То, что для одних константа, для других только переменная...

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 18.05.2005 (Ср) 17:22

Там используется DelphiX. Это библиотека для "комфортной и удобной" работы с DirectX 7-8 под Delphi. Не думаю, что её можно использовать в VB. Так что ищи пример с использованием "родных" интерфейсов DX. Его-то можно будет почти что построчно перевести на VB (в теории, конечно.)
Моду создают модоки, а распространяют модозвоны.

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 18.05.2005 (Ср) 18:54

Да вот нет больше таких примеров - все что нарыл... В принципе родной VB-шный PictureBox умеет такое делать. Если в него врисовывать цветной квадрат с помощью PaintPicture с параметром vbSrcAnd, то серый цвет на исходном рисунке корректно заменяется на этот цвет. Но вот как полученный рисунок с PictureBox'a на поверхность DirectDraw потом всунуть? Есть вроде один метод: GetSurfaceFromDC. Но как его правильно использовать, ума не приложу... Конструкция типа:
Set MySurface = dd.GetSurfaceFromDC(Picture1.hDC)
дает ошибку.
Может кто знает? Это было бы решением проблемы...
То, что для одних константа, для других только переменная...

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 18.05.2005 (Ср) 20:58

Так и GDI-шные API (в частности, BitBlt) тоже умеют это делать! Рисование по маске с ними будет быстрее, чем с PaintPicture. Насчет GetSurfaceFromDC - даже не знаю, что ответить. Тупое решение: попробуй поставить у PictureBox AutoRedraw в True. Может поможет? О результатах сообщи.
Моду создают модоки, а распространяют модозвоны.

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 19.05.2005 (Чт) 9:40

В общем вроде нашел как это делаеться:

Код: Выделить всё
Public Function GetPicFromDC(ByVal DC As Long, ByVal Width As Integer, ByVal Height As Integer) As DirectDrawSurface7
Dim Surf As DirectDrawSurface7, Desc As DDSURFACEDESC2
With Desc
   .lFlags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT
   .ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
   .lWidth = Width
   .lHeight = Height
End With
Set Surf = DD.CreateSurface(Desc) 'Create a empty surface

'BitBlt the given DC to the surface
Dim SurfDC As Long
SurfDC = Surf.GetDC()
BitBlt SurfDC, 0, 0, Width, Height, DC, 0, 0, vbSrcCopy
Surf.ReleaseDC(SurfDC)

Set GetPicFromDC = Surf
End Function


еще не пробовал, но на первый взгляд все правильно и логично :)
То, что для одних константа, для других только переменная...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 19.05.2005 (Чт) 10:26

Хм, не работает, однако :(
То, что для одних константа, для других только переменная...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 20.05.2005 (Пт) 11:38

В общем все довольно просто получаеться. Даже проще, чем в статье описано. По большому счету нет смысла делать попиксельно наложение маски. Вся соль в том, что поверхность DirectDraw имееет DC, с которым можно работать стандартными апи-шными функциями. Вот я наваял такую элементарную функцийку:
Код: Выделить всё
Public Sub MergeSurfaces(Dest as DirectDrawSurface7, Source as DirectDrawSurface7, SourStartX as Integer, SourStartY as Integer, DestWidth as Integer, DestHeight as Integer, DestStartX as Integer, DesctStartY as Integer, Method as Long)
    Dim DC1 as Long
    Dim DC2 as Long

    DC1 = Dest.GetDC
    DC2 = Source.GetDC

    BitBlt DC1, DestStartX, DestStartY, DestWidth, DestHeight, DC2, SourStartX, SourStartY, Method

    Dest.ReleaseDC DC1
    Source.ReleaseDC DC2
End Sub

Потом вызываем эту функцию и подставляем первым парамертом исходную порхность с рисунком, вторым - поверхность со сплошной цветовой маской. Ну а дальше по тексту - координаты, ширина, высота и т.д. А последний парамерт - это самое интересное. Если подставить vbSrcCopy - произведется простое копирование (что иногда очччень полезно), если vbSrcAnd - как раз наше пресловутое сложение с маской. Проверил - работает на ура :) Може, правда где то с синтаксисом наглючил, но смысл тот :)
То, что для одних константа, для других только переменная...


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

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

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

    TopList