ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 09.01.2000

Diese Seite wurde zuletzt aktualisiert am 09.01.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Zurück...


Anzeige

(-hg) mailto:hg_renderpic@aboutvb.de

Mit der Methode MSDN-Library - VB-PaintPicturePaintPicture können Sie ein Picture-Objekt auf ein Form, eine PictureBox, ein UserControl usw. malen. Wenn Sie jedoch das Bild eines Picture-Objekts auf einen Geräte-Kontext (MSDN-Library - Device ContextDevice Context) malen wollen, etwa in Verbindung mit anderen API-Funktionen (in Speicher-Bitmap malen usw.), müssten Sie eigentlich dieses Bild erst mit PaintPicture auf ein geeignetes Formular-Objekt malen und dann von dort mit API-Funktionen wie MSDN-Library - BitBltBitBlt oder MSDN-Library - StretchBltStretchBlt in den Ziel-Geräte-Kontext kopieren.

Diesen Umweg können Sie sich sparen, wenn Sie die Methode Render des Picture-Objekts verwenden, die das Bild direkt in einen Geräte-Kontext malen kann. Allerdings können Sie hierbei keine RasterOpCodes wie bei PaintPicture, BitBlt und StretchBlt angeben. Im Objekt-Katalog erscheint sie folgendermaßen deklariert:

Sub Render( _
 hdc As Long, _
 x As Long, y As Long, _
 cx As Long, _
 cy As Long, _
 xSrc As OLE_XPOS_HIMETRIC, _
 ySrc As OLE_YPOS_HIMETRIC, _
 cxSrc As OLE_XSIZE_HIMETRIC, _
 cySrc As OLE_YSIZE_HIMETRIC, _
 prcWBounds As Any)

Allerdings birgt der Aufruf dieser Methode einige Tücken in sich. Da das Picture-Objekt aus der StdOle-Bibliothek stammt und ein waschechtes COM-Objekt ist, wird intern die Maßeinheit HiMetric verwendet. Das ist eine sehr hoch auflösende und in Visual Basic nur wenig gebräuchliche Maßeinheit. Sie werden somit kaum umhin kommen, vor dem Aufruf der Render-Methode meistens erst einige Umrechnungen vorzunehmen, wenn Sie nicht das volle Bild malen wollen. Zudem hat die Render-Methode die Eigenart, das Bild auf dem Kopf stehend zu malen und sich sowohl beim Kopieren des Bildes als auch beim Malen in der vertikalen Richtung um 1 Pixel zu verrechnen. Obendrein ist die Render-Methode auch noch sehr empfindlich bezüglich der Datentypen bei der Parameterübergabe - die Long-Werte hdc, x, y, cx und cy müssen ausdrücklich bei der Übergabe mit CLng konvertiert werden, auch wenn die gegebenen Werte bereits Long-Werte sein sollten.

Die hier vorgestellte Hilfsfunktion RenderPicture berücksichtigt alle Kapriolen der Render-Methode und hilft auch bei den notwendigen Umrechnungen der Maßeinheiten.

Damit diese Umrechnungen mit anderweitig von VB gelieferten Maßen übereinstimmen und keine Fehler durch abweichende, selbstermittelte Umrechnungsfaktoren entstehen können, werden die Umrechnungs-Methoden ScaleX und ScaleY eines VB-Containers verwendet. Wenn Sie die Funktion RenderPicture in einem Formular-Modul (Form, UserControl usw.) anlegen, können Sie den Parameter Container in der Prozedur-Deklaration weglassen und im Code das entsprechende Formular-Objekt direkt einsetzen. Alternativ dazu können Sie aber auch, sofern in Ihrer Anwendung immer ein aktives Formular (ActiveForm) geöffnet ist, die eingebaute automatische Verwendung dieses Formulars zum Zuge kommen lassen. Sie brauchen keinerlei Bedenken haben - die Aufrufe der ScaleX- bzw. ScaleY-Methoden beeinflussen nicht die aktuelle ScaleMode-Einstellung des betreffenden Formulars. Da also sowieso eine Umrechnungs-"Maschine" notwendig ist, kann RenderPicture auch gleich den Komfort bieten, neben den Standardmaßeinheiten (Pixels für den Ziel-Geräte-Kontext und Twips für das Bild-Objekt) die Übergabe von Werten in anderen Maßeinheiten zu erlauben und die Werte entsprechend umzurechnen. Im Gegensatz zur originalen Render-Methode des Bild-Objekts sind entsprechend der gewohnten PaintPicture-Methode einige der Positions- und Maß-Parameter optional.

Public Sub RenderPicture( _
 Picture As StdPicture, _
 ByVal hDC As Long, _
 ByVal XDest As Long, _
 ByVal YDest As Long, _
 Optional ByVal WidthDest As Long, _
 Optional ByVal HeightDest As Long, _
 Optional ByVal XSrc As Long, _
 Optional ByVal YSrc As Long, _
 Optional ByVal WidthSrc As Long, _
 Optional ByVal HeightSrc As Long, _
 Optional Container As Object, _
 Optional ByVal DestScaleMode As Integer = vbPixels, _
 Optional ByVal SrcScaleMode As Integer = vbTwips)

  Dim nXDest As Long
  Dim nYDest As Long
  Dim nWidthDest As Long
  Dim nHeightDest As Long
  Dim nXSrc As Double
  Dim nYSrc As Double
  Dim nWidthSrc As Double
  Dim nHeightSrc As Double
  Dim nContainer As Object
  
  If nContainer Is Nothing Then
    Set nContainer = ActiveForm
  End If
  With Picture
    nXDest = XDest
    If WidthDest = 0 Then
      nWidthDest = nContainer.ScaleX(.Width, vbHimetric, _
       vbPixels)
    Else
      nWidthDest = WidthDest
    End If
    If HeightDest = 0 Then
      nHeightDest = nContainer.ScaleY(.Height, vbHimetric, _
       vbPixels)
    Else
      nHeightDest = HeightDest
    End If
    nYDest = YDest + nHeightDest
    nHeightDest = nHeightDest * -1
    With nContainer
      If DestScaleMode <> vbPixels Then
        nXDest = .ScaleX(nXDest, DestScaleMode, vbPixels)
        nYDest = .ScaleY(nYDest, DestScaleMode, vbPixels)
        nWidthDest = .ScaleX(nWidthDest, DestScaleMode, _
         vbPixels)
        nHeightDest = .ScaleY(nHeightDest, DestScaleMode, _
         vbPixels)
      End If
      nYDest = nYDest - 1
      nXSrc = .ScaleX(xSrc, SrcScaleMode, vbHimetric)
      nYSrc = .ScaleY(ySrc, SrcScaleMode, vbHimetric) + _
       .ScaleY(1, vbPixels, vbHimetric)
    End With
    If WidthSrc = 0 Then
      nWidthSrc = .Width
    Else
      nWidthSrc = nContainer.ScaleX(WidthSrc, SrcScaleMode, _
       vbHimetric)
    End If
    If HeightSrc = 0 Then
      nHeightSrc = .Height
    Else
      nHeightSrc = nContainer.ScaleY(HeightSrc, SrcScaleMode, _
       vbHimetric)
    End If
    .Render CLng(hdc), CLng(nXDest), CLng(nYDest), _
     CLng(nWidthDest), CLng(nHeightDest), nXSrc, nYSrc, _
     nWidthSrc, nHeightSrc, 0&
  End With
End Sub

Mit der Funktion RenderPicture können Sie ein Bild aus einem Picture-Objekt in einen Geräte-Kontext kopieren


Modul modRenderPic (modRenderPic.bas - ca. 2,4 KB)






Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer