Балуюсь с 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?




