Bitmap über DC in PictureBox

27/06/2008 - 21:53 von Manfred Maierhofer | Report spam
Hallo nochmal,

hab nun versucht ein VB6 Programm für eine Bildschirmlupe auf Systemebene zu
konvertieren. Ist natürlich ein bißchen etwas anderes da global, aber würde
zur Not ebenfalls meinen Bedarf decken. Sieht soweit auch ganz gut aus,
keine Fehler mehr, nur wird kein Bild in die PictureBox1 geladen. Was hab
ich falsch gemacht?
Würde mich über Unterstützung von den Profis sehr freun.


Public Class Form1

Private Declare Function GetDesktopWindow Lib "user32" () 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 nSrcWidth As Long, _
ByVal nSrcHeight As Long, _
ByVal dwRop As Long) As Long

Private Declare Function GetDC Lib "user32" ( _
ByVal hwnd As Long) As Long

Private Declare Function ReleaseDC Lib "user32" ( _
ByVal hwnd As Long, _
ByVal hDC As Long) As Long

Private Declare Function GetCursorPos Lib "user32" ( _
ByVal lpPoint As pointAPI) As Long

Private Declare Function GetWindowRect Lib "user32" ( _
ByVal hwnd As Long, _
ByVal lpRect As RECT) As Long

Private Structure pointAPI
Public x As Int32
Public y As Int32
End Structure

Private Structure RECT
Public Left As Int32
Public Top As Int32
Public Right As Int32
Public Bottom As Int32
End Structure

Private Const SRCCOPY = &HCC0020 ' (DWORD) dest = source
Private Const SRCAND = &H8800C6 ' (DWORD) dest = source AND dest
Private Const SRCERASE = &H440328 ' (DWORD) dest = source AND (NOT
dest )
Private Const SRCINVERT = &H660046 ' (DWORD) dest = source XOR dest
Private Const SRCPAINT = &HEE0086 ' (DWORD) dest = source OR dest

Dim DhDC As Long
Dim DhWnd As Long

Private Sub Form_Load()
TrackBar2.Value = 1000 / Timer1.Interval
DhWnd = GetDesktopWindow
DhDC = GetDC(DhWnd)

End Sub

Private Sub Form_Unload(ByVal Cancel As Integer)
'Call ReleaseDC(DhWnd, hDC)

End Sub

Private Sub TrackBar2_ValueChanged(ByVal sender As Object, ByVal e As
System.EventArgs) Handles TrackBar2.ValueChanged
Timer1.Interval = 1000 / TrackBar2.Value
Me.Text = Int(1000 / TrackBar2.Value)
End Sub

Private Sub TrackBar2_Scroll(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles TrackBar2.Scroll
Timer1.Interval = 1000 / TrackBar2.Value
Me.Text = Int(1000 / TrackBar2.Value)
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Timer1.Tick
Dim mPos As pointAPI
Dim x As Integer, y As Integer, w As Integer, h As Integer, sw As
Integer, sh As Integer
Dim zoomVal As Integer
GetCursorPos(mPos)

'Picturebox1.Cls()
'PictureBox1.ScaleMode = vbPixels

zoomVal = TrackBar1.Value
w = PictureBox1.Width
h = PictureBox1.Height

sw = w * (1 / zoomVal)
sh = h * (1 / zoomVal)

x = mPos.x - sw \ 2
y = mPos.y - sh \ 2

Dim bm As New Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height)
Dim bm_gr As Graphics = Graphics.FromImage(bm)
Dim bm_hdc As IntPtr = bm_gr.GetHdc

'Vergrößerter Abschnitt anzeigen
StretchBlt(bm_hdc, 0, 0, w, h, DhDC, x, y, sw, sh, SRCCOPY)

PictureBox1.Image = bm
End Sub
End Class


Gruß,

Manfred
 

Lesen sie die antworten

#1 Armin Zingler
27/06/2008 - 23:59 | Warnen spam
"Manfred Maierhofer" schrieb
Hallo nochmal,

hab nun versucht ein VB6 Programm für eine Bildschirmlupe auf
Systemebene zu konvertieren. Ist natürlich ein bißchen etwas anderes
da global, aber würde zur Not ebenfalls meinen Bedarf decken. Sieht
soweit auch ganz gut aus, keine Fehler mehr, nur wird kein Bild in
die PictureBox1 geladen. Was hab ich falsch gemacht?
Würde mich über Unterstützung von den Profis sehr freun.



Ich würde erst einmal den Code nach VB.Net portieren. Du kannst ein
VB6-Projekt in VB.Net öffnen und durch den Wizard einiges automatisch
konvertieren lassen; zumindest die Korrektur von Long nach Integer.


Armin

Ähnliche fragen