Как достать точку из под формы?

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

Сообщение ALX_2002 » 03.04.2005 (Вс) 14:54

Челы, вопрос по сабжу.

По скольку я технологии прорисовки окон до конца не знаю, то спрашиваю вас :oops:

1) Когда одно окно лежит на другом, информация ( матрица с набором значений пикселей нижней формы где то хранится или она просчитывается заного при передвижении верхнего окна по нижнему ? )

2) Можно ли её скопировать как нибудь ? :oops:
(GetDiBits)
Знаю, что звучит бредово. Но в нашей жизни вобще трезво мыслить страшно :)

В общем, если можно или нельзя - то расскажите схему работы графики плииз

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

Сообщение GSerg » 03.04.2005 (Вс) 15:03

Рассказываю схему работы графики :)

У ряда окон (ряд невелик, так что не обольщайтесь :) ) установлен общеклассовый стиль CS_SAVEBITS. Это значит, что при отображении такого окна будет сохранено во временный битмап всё, что это окно собой перекроет. А при его исчезновении эта информация будет скопирована обратно.
Этот стиль имеют окна типа тултипов и менюшек. Потому что появляются часто и места занимают немного.
Соответственно, для таких окон, наверное, теоретически можно добиться от винды того самого сохранённого битмапа (но где его искать я даже примерно не представляю, и без исходников сами знаете чего здесь не разобраться :) ).

А для всех остальных окон перекрытие происходит без сохранения. И когда окно исчезает, нижележащие перерисовываются.


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

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

Сообщение ALX_2002 » 03.04.2005 (Вс) 15:08

А десктоповому окну такой класс установить нельзя ? :oops:

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

Сообщение Amed » 03.04.2005 (Вс) 15:10

SetWindowLong.

Очевидно, можно, но
GSerg писал(а):наверное, теоретически можно добиться от винды того самого сохранённого битмапа (но где его искать я даже примерно не представляю, и без исходников сами знаете чего здесь не разобраться).

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

Сообщение ALX_2002 » 03.04.2005 (Вс) 15:34

усёк - долбануться можно. Вот только одно понять не могу, как же тогда скринмейты Delphi - шные пашут. Каким то образом они получают изображение, накладывают на него битмапину.

Вот объясните мне - как они енто творят ??? :shock:

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

Сообщение GSerg » 03.04.2005 (Вс) 15:47

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

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

Сообщение ALX_2002 » 03.04.2005 (Вс) 16:06

А что ж они тогда получают ? :shock: Они же рисуют под себя, то что на экране

тот же Kamikaze Cat

По ходу не вырезание формы делают. :shock:

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

Сообщение GSerg » 03.04.2005 (Вс) 16:23

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

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

Сообщение ALX_2002 » 03.04.2005 (Вс) 17:06

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

Сообразил - если запустить 2 штуки таких и одного повозить по другому, то видно как верхний берёт картинку нижнего, но с лагами

При вырезании форм такого не происходит.

Хотя... кто знает.... :?

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

Сообщение GSerg » 03.04.2005 (Вс) 17:40

Дык чё сомневаться :)
Поюзай GetWindowRgn, посмотри, чё возвращается :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение ALX_2002 » 03.04.2005 (Вс) 22:38

Хм а по ходу ты прав..... :( ...

Тогда встречный вопр.... А можно ли всё таки хранить регион

картинки как нибудь в виде строки ? или ещё в каком нибудь другом

виде ?, так чтобы потом можно было его применить на окно ? :roll:

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

Сообщение GSerg » 04.04.2005 (Пн) 3:58

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

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

Сообщение ALX_2002 » 04.04.2005 (Пн) 23:18

Ну дык ГЛЮЧИТ по ЖУТКОМУ :oops: ... ответ зранее знаю - из-за корявых лапок...

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

Сообщение GSerg » 05.04.2005 (Вт) 3:25

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

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

Сообщение ALX_2002 » 05.04.2005 (Вт) 6:42

1) Сначала мучался с именами регионов, кое как сделал
у меня рисунки в ресурс файле хранятся под именами типа

RUN0,RUN1,RUN2, а потом JUMP0,JUMP1,JUMP2

Парился долго, т.к почему то в Collection нельзя писать вместо индексов набор символов. Но вроде всё таки перебрал все и регионы сделал.


2) Память засирает, хотя DeleteObject использую.

3) Тормозит ещё больше :(


Короче - нииикак не получается. :oops:

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

Сообщение GSerg » 05.04.2005 (Вт) 7:34

1. Можно имена давать любые. Хоть с точками с запятой.
2. Мдя? Уж на что 98 чувствительна к ресурсам GDI, и то не заметила :)
3. Гы :) Только что проверил: 100000 вызывов CreateRoundRectRgn с одними и теми же параметрами занимают примерно 2400 мс, а 100000 вызовов на копирование одного такого же региона, заранее созданного, занимают 50 мс.

Код: Выделить всё
Option Explicit

Private Declare Function CombineRgn Lib "gdi32.dll" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32.dll" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Const RGN_COPY As Long = 5

Private Sub Form_Load()
  Dim r As Long, rcopy As Long, i As Long, t As Long
 
  t = GetTickCount
  For i = 1 To 100000
    r = CreateRoundRectRgn(10, 10, 50, 50, 20, 20) 'например
    DeleteObject r
  Next
  t = GetTickCount - t
  Debug.Print t
 
 
  rcopy = CreateRoundRectRgn(10, 10, 50, 50, 20, 20)
  r = CreateRoundRectRgn(100, 100, 150, 150, 120, 120)
  t = GetTickCount
  For i = 1 To 100000
    CombineRgn rcopy, r, 0, RGN_COPY
  Next
  DeleteObject rcopy
  DeleteObject r
 
  t = GetTickCount - t
  Debug.Print t
End Sub
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение ALX_2002 » 06.04.2005 (Ср) 17:30

Уф.... Запарился... Никогда бы не подумал, что написание скринмейта может так напрячь

С регионами всё класно получается.

+ Скорость работы возросла
+ Нагрузка на проц упала

Запарился с загрузкой регионов.

Т.к скринмейт должен ходить как вправо так и влево, то мне приходится хранить регионы как на движение вправо так и влево.

Т.е я сначала поочереди гружу картинки на форму, где чел идёт вправо, и сохраняю регионы, потом рисую с помощью STRETCHBLT картинку в обратную сторону и снова сохраняю регионы.

Уфф.. Коряво....

Думаю как упростить....

Пред.

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

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

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

    TopList