Никак не могу разобраться с сохранением РЕГИОНА :(

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

Никак не могу разобраться с сохранением РЕГИОНА :(

Сообщение ALX_2002 » 26.03.2005 (Сб) 7:56

Отцы, хелпаните плиз - не могу найти пример по этой функции

В идеале мне нужно

1) Создать регион.
2) Сохранить регион в переменную.
3) Применить, сохранённый регион на форме.

С созданием региона проблем нет, но вот эту бодягу GetRegionData я никак сломить не могу... :oops:
Последний раз редактировалось ALX_2002 26.03.2005 (Сб) 16:22, всего редактировалось 1 раз.

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 26.03.2005 (Сб) 8:08

Так просто с GetRegionData работать не выйдет, нужно сначале ее конвертнуть:
Код: Выделить всё
Private Declare Function GetRegionData Lib "GDI32.dll" ( _
    ByVal hRgn As Long, ByVal dwCount As Long, ByRef lpRgnData As Any) As Long

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

Private Type RgnDataHeader
    dwSize As Long
    iType As Long
    nCount As Long
    nRgnSize As Long
    rcBound As RectAPI
End Type

Private Type RgnDataVB
    rdh As RgnDataHeader
    Buffer() As RectAPI
End Type

Private Function GetRegionDataVB(ByVal inRgn As Long) As RgnDataVB
    Dim RgnData() As Long, DataSize As Long
    Dim HeadSize As Long
    Dim RectSize As Long
    Dim NumRect As Long
   
    DataSize = GetRegionData(inRgn, 0, ByVal 0&)
    If (DataSize > 0) Then ' Get structure sizes
        HeadSize = Len(GetRegionDataVB.rdh)
        RectSize = Len(GetRegionDataVB.rdh.rcBound)
       
        ReDim RgnData(DataSize \ 4) As Long
        Call GetRegionData(inRgn, DataSize, RgnData(0))
        NumRect = (DataSize - HeadSize) \ RectSize
       
        If (NumRect = RgnData(2)) Then ' Populate VB UDT with region data
            ReDim Preserve GetRegionDataVB.Buffer(NumRect - 1) As RectAPI
            Call RtlMoveMemory(GetRegionDataVB.rdh, RgnData(0), HeadSize)
            Call RtlMoveMemory(GetRegionDataVB.Buffer(0), _
                RgnData(HeadSize \ 4), NumRect * RectSize)
        End If
    End If
End Function
الفيجوال بيسك الرابح

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 26.03.2005 (Сб) 8:17

Ух... Оперативно !! :shock: Пасиба - сейчас до инста дотопаю и обязательно попробую.

Огромный респект :D

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 26.03.2005 (Сб) 8:23

Только rtlmovememory добавить не забудь:
Код: Выделить всё
  Declare Sub RtlMoveMemory Lib "kernel32.dll" ( _
    ByRef Destination As Any, _
    ByRef Source As Any, _
    ByVal Length As Long)
الفيجوال بيسك الرابح

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 26.03.2005 (Сб) 11:21

Ммм... дядь GM научи ламу. Я никак не пойму как дальше юзать эту функцию...

Создаю я CreateEllipticRgn

Потом в эту функцию пихаю

А дальше мне нужно этот регион сохранить в переменную какю нибкдь

Чтобы при анимации его подгружать, а не пересчитывать его заного
:roll:

Научи плиз :?:

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 26.03.2005 (Сб) 14:53

Хм... разобрался только как свойства региона получать, а вот как его

сохранить, так чтобы потом в функцию SetWindowRgn

подсунуть никак понять не могу :scratch:

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 26.03.2005 (Сб) 15:10

Вот что я как раз хотел сделать. Только сохранять не на диск а в

переменную.

Но как это сделать на VB ??? :shock:

http://www.codenet.ru/progr/delphi/stat/regions/#a90

Кто силён в Delphi - помогите плз :shock:

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

Сообщение GSerg » 26.03.2005 (Сб) 16:44

Приведённый дельфийский код предельно прост, но скажи мне, ALX, что мешает тебе, получив свой HRGN, просто не удалять его всё время работы проги? :) Нафига сохранять его в переменную? Раз не нужно на хард, сохраняй HRGN, а внутренние данные система сохранит за тебя :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 26.03.2005 (Сб) 17:06

Вооо.... Доброго дня Gserg :). Проблемка проста до нельзя, но НЕ ПОЛУЧАЕТСЯ НИИИКАК :(

1) Есть тормозящий скринмейт.
2) Все тормоза уходят на постоянный пересчёт регионов.
3) Я пытался сохранять регионы просто в переменные - так как ты говоришь, но к сожалению после вызова функции

Код: Выделить всё
SetWindowRgn me.hwnd,RGN(N),true


!!! регион в системе стирается автоматически :( !!!!!

Т.е получается так. Первый раз вся анимация проходит великолепно, а второй раз регионов уже нет :(

Вот... А я хотел добиться ускорения, чтобы 1 раз все регионы просчитать, сохранить их или в переменные или в тот же ресурс файл из которого я беру картинки и дальше грузить регионы.

Буду очень признателен любой помощи :) :roll:

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

Сообщение GSerg » 27.03.2005 (Вс) 13:24

Привет, привет :)

Ну раз ты говоришь, что регион автоматически сдувается после назначения, то...
...то тогда насоздавай регионов, хэндлы храни в массиве (как и делаешь :) ), а непосредственно перед присвоением вызывай CombineRgn с флагом RGN_COPY, чтобы заиметь клон :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 27.03.2005 (Вс) 14:49

Хм..... Попробуем... Пасиб за идею :idea: :shock: :D


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

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

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

    TopList