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