vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Icon aus ImageList auf PictureBox kopieren 
Autor: HarryLobster
Datum: 03.09.18 12:00

Ich möchte mit der API-Funktion BltBit ein Icon auf eine PictureBox kopieren. Das Icon soll sich in einer ImageList befinden.

Das klappt nicht, da diese Grafiken keinen Device Context besitzen, der für die BltBit-Funktion nötig ist.

Meine Frage: wie bekomme ich für eine Grafik aus einer ImageList einen DC ?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Icon aus ImageList auf PictureBox kopieren 
Autor: Zardoz
Datum: 03.09.18 14:47

Hallo HarryLobster,
mit BitBlt wird das wohl nicht funktionieren.
Probier' mal das:
  Picture1.PaintPicture ImageList1.ListImages(1).ExtractIcon, 0, 0
oder das:
  ImageList1.ListImages(1).Draw Picture1.hdc, 1000, 1000
oder das:
  Set Picture1.Picture = ImageList1.ListImages(1).ExtractIcon
Wenn AutoRedraw der Picturebox auf True steht, nach dem Zeichnen
evtl. ein Picture1.Refresh um ein Neuzeichnen zu erzwingen.

Gruss,

Zardoz

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Icon aus ImageList auf PictureBox kopieren 
Autor: HarryLobster
Datum: 03.09.18 17:03

Vielen Dank für die Antwort, aber wegen der vielen weiteren Möglichkeiten (neben der Performance, Transparenz, etc.) von BltBit kann/möchte ich nur diese Funktion verwenden.

Ich muss also entweder einen DC für ein StdImage erzeugen oder ich muss als Quelle gleich eine PictureBox nehmen. Aber da ich sehr viele Icons habe, möchte ich das gerne vermeiden...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Icon aus ImageList auf PictureBox kopieren 
Autor: Zardoz
Datum: 03.09.18 22:16

Hallo HarryLobster,
transparent zeichnen kann BltBit nur über den Umweg mit einer
Schwarz-Weiß-Maske. Mit einem Std-Picture wird es wahrscheinlich
auch nicht funktionieren, weil die Variable nur den Handle aus
der Imagelist übernimmt und dort läßt sich der Handle auch nicht
über eine selbsterzeugte DC ansprechen. Du könntest beim Programm-
start einmalig alle Icons von der Imagelist in eine Picturebox
übertragen und diese dann mit TransparentBlt in die sichtbare
Grafik zeichnen. Hier mal ein Ansatz:
Controls: Button, ImageList, 2 * Picturebox
Private Declare Function TransparentBlt Lib "msimg32.dll" (ByVal hdcDest As _
  Long, _
  ByVal nXOriginDest As Long, ByVal nYOriginDest As Long, ByVal nWidthDest As _
  Long, ByVal nHeightDest As Long, _
  ByVal hDCSrc As Long, ByVal nXOriginSrc As Long, ByVal nYOriginSrc As Long, _
  ByVal nWidthSrc As Long, _
  ByVal nHeightSrc As Long, ByVal crTransparent As Long) As Long
 
Private Mask&, maxX&, maxY&, N&, SW&, SH&, ImgH&, ImgW&
 
Private Sub Form_Load()
 
  Dim i&, x1&, y1&
 
  Me.ScaleMode = vbPixels
  Me.WindowState = vbMaximized
  Randomize
  Mask = RGB(255, 0, 128)
  With ImageList1
    N = .ListImages.Count
    ImgW = .ImageWidth
    ImgH = .ImageHeight
    .BackColor = Mask
  End With
  If N = 0 Then
    MsgBox "Keine Icons!", vbExclamation + vbOKOnly
    Unload Me
    Exit Sub
  End If
 
  maxX = Int(0.5 + Sqr(N))
  maxY = -Int(-(N / maxX))
  With Picture2
    .Visible = False
    .BorderStyle = vbBSNone
    .ScaleMode = vbPixels
    .Move 8, 8, maxX * ImgW, maxY * ImgH
    .AutoRedraw = True
    For i = 1 To N
      ImageList1.ListImages(i).Draw .hDC, ImgW * x1, ImgH * y1
      x1 = (x1 + 1) Mod maxX
      If x1 = 0 Then y1 = y1 + 1
    Next i
  End With
 
  SW = 1024
  SH = 768
  With Picture1
    .BorderStyle = vbBSNone
    .ScaleMode = vbPixels
    .Move 8, 8, SW, SH
    .AutoRedraw = True
  End With
 
  Command1.TabIndex = 0
  Command1.Caption = "Zeichne"
  Command1.Move SW + 16, 8
  Call Command1_Click
 
End Sub
 
Private Sub Command1_Click()
 
  Dim i&, Pos&, x1&, y1&, P1hdc&, P2hdc&
 
  P1hdc = Picture1.hDC
  P2hdc = Picture2.hDC
 
  Picture1.Line (0, 0)-(SW, SH), RGB(0, 0, 64), BF
  For i = 1 To 200
    Pos = Int(Rnd * N)
    x1 = (Pos Mod maxX) * ImgW
    y1 = (Pos \ maxX) * ImgH
    Call TransparentBlt(P1hdc, Rnd * (SW - ImgW), Rnd * (SH - ImgH), ImgW, _
      ImgH, _
      P2hdc, x1, y1, ImgW, ImgH, Mask)
  Next i
 
End Sub

Gruss,

Zardoz

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Icon aus ImageList auf PictureBox kopieren 
Autor: HarryLobster
Datum: 04.09.18 12:46

Vielen Dank für Deine Mühe, das probiere ich mal aus.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Icon aus ImageList auf PictureBox kopieren 
Autor: HarryLobster
Datum: 06.09.18 07:48

Ich habe mich der Einfachheit halber von der ImageList verabschiedet und verwende jetzt ein Array von PictureBoxen. Da ich im späteren Verlauf nur den Long-Wert vom DeviceContext verwende, frisst das auch nicht viel Brot...Danke für die Unterstützung.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel