Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: StretchBlt Добавлено: 08.10.05 00:13  

Автор вопроса:  Victor | Web-сайт: vt-dbnz.narod.ru | ICQ: 345743490 
Наблюдаю жуткие тормоза при вызове StretchBlt
Private Sub PctCapture_Paint()
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-сайт: www.BubnovRV.narod.ru
 Профиль | | #1
Добавлено: 23.10.05 15:44
Дело в том что gdi32 на WinXP другая. Если заменить dll, то все наладится!

Ответить

Номер ответа: 2
Автор ответа:
 Victor



ICQ: 345743490 

Вопросов: 42
Ответов: 385
 Web-сайт: vt-dbnz.narod.ru
 Профиль | | #2
Добавлено: 28.10.05 23:58
Спасибо...
Не таскать же мне со своим проектом виндовскую gdi и заменять если WinME...
Как же мне решить проблему... У меня графический редактор. И на нем окно линзы, небольшое совсем. И на него при движении мышью над главным рисунком применяется StretchBlt из небольшой области возле курсора (грубо подсчитанной где-то среди того кода, что в вопросе). Так вроде ничего, но когда я рисую карандашом, получается вместо кривой ломаная. А с некоторыми другими инструментами совсем все плохо. А если отключить это окно - нормально. И в XP тоже нормально.
А когда я окно линзы крупным делаю, становится совсем плохо. Если оно где-то на полэкрана, прорисовка занимает где-то полсекунды. Хотя комп нормальный - Celeron 1.7GHz.
Похоже, ничего не придумаю. Похоже, просто отключу его.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам