Нужен аналог StretchBlt для трапеций и под углом

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

Нужен аналог StretchBlt для трапеций и под углом

Сообщение Денис » 26.05.2009 (Вт) 10:37

Сильно не бейте, если кто-то ранее спрашивал что-то подобное (я искал, но не нашел ничего полезного).
Балуюсь с WinAPI и вот появилась идейка рекурсивно отражать содержимое экрана в форму, чтобы получить эффект расположенных друг напротив друга зеркал. у меня есть изображение с фотокамеры: монитор, клавиатура, стол. И в мониторе хочется в realtime отображать картинку на экране (вместе с открытыми окнами и т.п.) Проблема в том, что монитор находится под углом к объективу и на фото ложится в проекции, как показано на рисунке.

Изображение

Вопрос заключается в том, возможно ли такое в gdi?
Очень не хотелось бы лезть в плюсы и директ-иксы с их бешенными простынями деклараций.
Пока что у меня получилось написать только прямоугольник с прямыми углами, а нужна косоугольная трапеция. Вот мои наработки на данный момент:
Код: Выделить всё
Option Explicit

Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
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 StretchBlt Lib "gdi32" (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 hSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Declare Function SetStretchBltMode Lib "gdi32" (ByVal hdc As Long, ByVal nStretchMode As Long) As Long

Private Const STRETCH_HALFTONE = 4
Private Const SRCCOPY = &HCC0020

Private MyDW As Long
Private MyDC As Long
Private dX As Long
Private dY As Long
Private Aspect As Long

Private Sub Form_Load()
   
   MyDW = GetDesktopWindow
   Call SetStretchBltMode(Me.hdc, STRETCH_HALFTONE)
   Aspect = 4 / 3
   
End Sub

Private Sub Form_Resize()

   dY = Me.Height
   dX = Me.Width

Exit Sub

'Здесь будет рассчитываться соотношение сторон, пока не дошел до этого.

End Sub

Private Sub tmr1_Timer()
   
   MyDC = GetDC(MyDW)
   'Вот где-то здесь надо произвести шаманские действия по превращению сорса в косоугольную проекцию.
   Call StretchBlt(Me.hdc, 0, 0, dX, dY, MyDC, 0, 0, Screen.Width, Screen.Height, SRCCOPY)
   'Полагаю, после этого придется еще лишние части от формы отрезать.

End Sub


И еще вопросик вдогонку: после некоторого времени работы программы комп начинает подтормаживать, а еще через некоторое время глюкает совсем (слетает оформление (чернеет), и начинается слайд-шоу). Похоже, я чего-то не знаю про работу StretchBlt?
Вложения
sample.jpg
Изображение обработано в фотошопе (каким должен быть результат) и уменьшено.
sample.jpg (22.99 Кб) Просмотров: 373
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Нужен аналог StretchBlt для трапеций и под углом

Сообщение Debugger » 26.05.2009 (Вт) 11:15

Есть такое.
Поставь интервал у таймера побольше.
1) SrtretchBlt'ишь картинку (уменьшаешь)
2) PlgBlt'ишь картинку (подгоняешь под параллелограмм)
И вообще, посмотри "Золотые топики": viewtopic.php?f=15&t=36567. А оттуда на viewtopic.php?t=31093&highlight=.


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

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

Сейчас этот форум просматривают: AhrefsBot, Majestic-12 [Bot], Yandex-бот и гости: 50

    TopList