Страница: 1 |
Страница: 1 |
Вопрос: StretchBlt
Добавлено: 08.10.05 00:13
Автор вопроса: Victor | Web-сайт:
Наблюдаю жуткие тормоза при вызове StretchBlt
Dim papi As POINTAPI
If PctCaptureDisabled Then Exit Sub
GetCursorPos papi
DrawPctCapture papi.x, papi.y
If PctCapture.AutoRedraw Then
If LensWindowVisible Then
frmLens.PctCapture.Cls
DrawPctCapture papi.x, papi.y
frmLens.PctCapture.Refresh
Else
PctCapture.Cls
DrawPctCapture papi.x, papi.y
PctCapture.Refresh
End If
Else
DrawPctCapture papi.x, papi.y
End If
End Sub
Private Sub DrawPctCapture(ByVal x As Long, ByVal y As Long, Optional ByVal RelToMP As Boolean = False)
Dim papi As POINTAPI
Dim DestHdc As Long
If x = -1 Then
GetCursorPos papi
Else
papi.x = x
papi.y = y
End If
If RelToMP Then
ToScreenCoords papi, MP.hWnd
End If
If PctCaptureZm = 0 Then PctCaptureZm = 6
If LensWindowVisible Then
With frmLens.PctCapture
' CaptureZoomIn papi, _
-Int(-.ScaleWidth / PctCaptureZm) + 1, _
-Int(-.ScaleHeight / PctCaptureZm) + 1, _
PctCaptureZm, _
.hDC, _
.ScaleWidth \ 2, .ScaleHeight \ 2
CaptureZoomIn2 papi, _
.ScaleWidth \ 2, .ScaleHeight \ 2, _
PctCaptureZm, _
.hDC, _
.ScaleWidth \ 2, .ScaleHeight \ 2
.PaintPicture imgCursor.Picture, .ScaleWidth \ 2 - 15, .ScaleHeight \ 2 - 15
End With
Else
With PctCapture
' CaptureZoomIn papi, _
-Int(-.ScaleWidth / PctCaptureZm) + 1, _
-Int(-.ScaleHeight / PctCaptureZm) + 1, _
PctCaptureZm, _
.hDC, _
.ScaleWidth \ 2, .ScaleHeight \ 2
CaptureZoomIn2 papi, _
.ScaleWidth \ 2, .ScaleHeight \ 2, _
PctCaptureZm, _
.hDC, _
.ScaleWidth \ 2, .ScaleHeight \ 2
.PaintPicture imgCursor.Picture, .ScaleWidth \ 2 - 15, .ScaleHeight \ 2 - 15
End With
End If
End Sub
Public Function CaptureZoomIn2(ByRef AroundPoint As POINTAPI, _
ByVal DestHalfW As Long, _
ByVal DestHalfH As Long, _
ByVal Zm As Long, _
ByVal hDCOut As Long, _
ByVal OutCX As Long, _
ByVal OutCY As Long)
Dim DestX As Long, DestY As Long
Dim SrcX As Long, SrcY As Long
Dim DestW As Long, DestH As Long
Dim SrcW As Long, SrcH As Long
Dim ScreenDC As Long
SrcW = -Int(-DestHalfW / Zm - 0.5)
SrcH = -Int(-DestHalfH / Zm - 0.5)
DestHalfW = SrcW * Zm
DestHalfH = SrcH * Zm
SrcX = AroundPoint.x - SrcW
SrcY = AroundPoint.y - SrcH
DestX = OutCX - DestHalfW - Zm \ 2&
DestY = OutCY - DestHalfH - Zm \ 2&
On Error GoTo eh
ScreenDC = GetWindowDC(0&)
StretchBlt hDCOut, _
DestX, DestY, _
(SrcW * 2 + 1) * Zm, (SrcH * 2 + 1) * Zm, _
ScreenDC, _
SrcX, SrcY, _
SrcW * 2 + 1, SrcH * 2 + 1, _
SRCCOPY
ReleaseDC 0&, ScreenDC
Exit Function
eh:
ReleaseDC 0&, ScreenDC
ErrRaise Err, "CaptureZoomIn2"
End Function
Примечания. PctCapture - PictureBox, Autoredraw = true
Рисуется либо на главной форме (из нее код), либо на frmLens (типа отдельного окошка).
Все плохо под WinMe. И скорость работы катастрофически падает при увеличении размеров окна.
Под WinXP все летает. На том же компе.
Ответы
Всего ответов: 2
Номер ответа: 1
Автор ответа:
Роман
Вопросов: 1
Ответов: 31
Web-сайт:
Профиль | | #1
Добавлено: 23.10.05 15:44
Дело в том что gdi32 на WinXP другая. Если заменить dll, то все наладится!
Номер ответа: 2
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #2
Добавлено: 28.10.05 23:58
Спасибо...
Не таскать же мне со своим проектом виндовскую gdi и заменять если WinME...
Как же мне решить проблему... У меня графический редактор. И на нем окно линзы, небольшое совсем. И на него при движении мышью над главным рисунком применяется StretchBlt из небольшой области возле курсора (грубо подсчитанной где-то среди того кода, что в вопросе). Так вроде ничего, но когда я рисую карандашом, получается вместо кривой ломаная. А с некоторыми другими инструментами совсем все плохо. А если отключить это окно - нормально. И в XP тоже нормально.
А когда я окно линзы крупным делаю, становится совсем плохо. Если оно где-то на полэкрана, прорисовка занимает где-то полсекунды. Хотя комп нормальный - Celeron 1.7GHz.
Похоже, ничего не придумаю. Похоже, просто отключу его.