Office: (Office 2003) AnwendungsIcon von Datei auslesen und als Picture anzeigen

Helfe beim Thema AnwendungsIcon von Datei auslesen und als Picture anzeigen in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; Hallo, ich will ja nicht drauf rum hacken, für diesen Teil gabs auch schon in meinen Beitrag 7# einen Lösungsansatz.*grins Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von grzi, 30. Januar 2010.

  1. AnwendungsIcon von Datei auslesen und als Picture anzeigen


    Hallo,

    ich will ja nicht drauf rum hacken, für diesen Teil gabs auch schon in meinen Beitrag 7# einen Lösungsansatz.*grins
     
    Horst Wessels, 2. Februar 2010
    #16
  2. \@Sascha:
    Bin beim Stöbern mal wieder über dein GDIPlus gestolpert:

    hier im besonderen die Funktion: GetFileIcon

    Habe nur ein kleines Problem:

    GetFileIcon "c:\Test.Txt"

    liefert mir ein StdPicture, welches ich doch mit

    Code:
    direkt in eine Datei speichern können sollte!

    GEHT aber NICHT!

    In SavePicGDIplus wir in der Zeile
    Code:
    gemeckert, da kein Image übergeben wurde?
    Eine Idee woran das liegt? Ich vermute mal am Bildtyp Icon als bmp - komme da aber nicht weiter...


    Mdl_GDIPlus.zip
     
  3. \@grzi:
    Tja, GetIconPic gibt ein Icon zurück.
    Ein StdPicture-Objekt kann diverse Formate kapseln und das Handle, welches zurückgegeben wird, ist kein Bitmap-Handle (hBmp), sondern ein Icon-Handle (hIcon).
    GDIPlus kann keine Icons speichern, aber Images aus Icon-Handles erzeugen - nur eben leider nicht mit der Funktion GdipCreateBitmapFromHBITMAP, sondern mit GdipCreateBitmapFromHICON.

    Ändere die Save-Prozedur der Einfachheit halber quick&dirty:
    Code:
    Ciao, Sascha
     
    Sascha Trowitzsch, 2. Februar 2010
    #18
  4. AnwendungsIcon von Datei auslesen und als Picture anzeigen

    Image wird übergeben, aber das Ergebnis von GdipCreateBitmapFromHBITMAP ist 7, wodurch das Erstellen übersprungen wird...

    Code:
    Code:
     
  5. \@Sascha:
    Hätte mich etwas aufmerksamer durch die Deklarationen arbeiten sollen *rolleyes.gif*

    Ja jetzt funktioniert die Sache wie gewünscht!
    Wo finde ich denn noch etwas mehr zu deinen Funktionen und was evtl. Ergebnisse bedeuten? - So das man von dem "Quick & Dirty" etwas wegkommt... *wink.gif*


    Für alle Interessenten:
    Code:
    Code:
     
  6. [OT]
    GDIPlus ist leider überhaupt nicht auf VB zugeschnitten, sondern auf C++ oder .NET, da klassenorientiert.
    In VB ist es deshalb etwas umständlich zu handhaben und man muss mit all den Deklarationen und Pointern statt Objekten arbeiten.
    Die Doku steht unter http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx , aber, wie gesagt, man muss sie für VB "umdeuten"; das sog. Flat-API enthält keinerlei Informationen über die Syntax hinaus. Es gibt im Netz dazu diverse Stellen mit VB-GDI+-Code - viel ist etwa unter ActiveVB zu finden, ab Tipp 658 in Tips'n Tricks - ActiveVB.
    Wenn man absolut korrekt sein wollte, dann müsste man immer die Rückgabewerte der API-Funktionen auswerten und eine Fehlerbehandlung implementieren, was ich im Interesse von Übersicht meist weglasse. Wie sowas sonst aussehen kann und zu "pfeilförmigem Code" führt, sieht man hier: VB 5/6-Tipp 0688: Grafik mittels GDI+ als TIFF speichern - ActiveVB.

    Die Rückgabewerte für die Funktionen stehen hier.
    Die 7 etwa bedeutet lediglich "Win32-Fehler". Das sagt nichts weiter, als dass der Fehler irgendwo aus unter dem GDI+ liegenden Win-API herrührt. In unserem Fall ist das eben das Missverständnis zwischen Bitmap- und Icon-Handle.

    Nicht quick&dirty wäre, gleich zu ermitteln, ob das StdPicture ein Icon oder ein Bitmap enthält, statt einfach beide Funktionen auszuprobieren.
    Dazu hat es an sich eine Type-Eigenschaft, die bei Icons eigentlich 3 zurückgeben müsste. Tut es meist aber nicht. Die Eigenschaft ist darum nicht verlässlich.
    Ich gestehe, dass ich keine API-Funktion kenne, die ermitteln könnte, um welche Art von Handle es sich bei einem Long-Wert handelt. Ich finde nur Umwege über Fehlerrückgabewerte, z.B. über GetIconInfo. Das ist dann allerdings auch nicht eleganter, als der Code oben.

    Ciao, Sascha
     
    Sascha Trowitzsch, 2. Februar 2010
    #21
  7. Danke für die Hilfe und Infos!

    Das ein oder andere hatte ich auch schon in activeVB gefunden, das mit dem Typ hatte mich auch schon verunsichert, weshalb ich ja auch anfänglich nur die Vermutung hatte, dass das Icon als Bmp interpretiert wird...
     
  8. AnwendungsIcon von Datei auslesen und als Picture anzeigen

    Das Ganze funktioniert ja ganz gut, aber ein kleines Problem habe ich noch...

    Die "Icons" weisen als Bitmap einen schwarzen Rand auf, der normalerweise transparent ist. Wäre dieser Weis, könnte man mit Lebans Transparent den optischen Makel direkt beheben - das Tool funktioniert aber nur mit Weisem Rand!

    Ich habe zwar eine Lösung gefunden - die kann ich allerdings nicht mit meinem Wissen umsetzen:

    Bitmap Basics - A GDI tutorial
    Hier Kapitel2 mit Beispiel:
    http://www.mvps.org/user32/gdi02.zip

    Es geht hier wohl um die Umsetzung dieser Zeilen in Lebans Transparenz:
    Code:
    Vielleicht hat ja jemand genug Kentnisse, den Trick mit dem ersten Pixel einzupflegen!

    Es geht darum, den ersten Pixel als Hintergrundfarbe zu setzen und erst danach die Transparenz für ein Bild zu berechnen.

    Bei schwarz müsste dann über
    Code:
    die Hintergrundfarbe gesetzt werden - aber wie und wo???

    Zur Vollständigkeit Lebans Transparent:
    Transparent
     
  9. Grzi, bevor ich hier weiteren Code poste:
    - Benutzt du nun die GDI+-Routine? Wenn ja, dann sollte auch das Transparenzproblem mit GDI+ gelöst werden, nicht mit GDI32, wie in deinen Links.
    - Wo wird das Icon nun angezeigt? In einem Bildsteuerelement, einem MSForms-Image, einem Treeview, Listview, oder wie?
    - Wird das Teil denn als Datei wieder abgespeichert, was #17 impliziert?

    Ciao, Sascha
     
    Sascha Trowitzsch, 4. Februar 2010
    #24
  10. Habe zwischenzeitlich etwas experimentiert:
    Mit der dem SavePicGDIPlus befehl erstelles Bild weist den schwarzen Hintergrund auf!

    Lade ich das Bild als stdole.StdPicture in ein MSFPictureCtr, dann zeigt dies einen weisen Hintergrund!

    Also muss beim SavePicGDIPlus die Hintergrundfarbe geändert worden sein - oder?

    Das Bild speichere ich ich momentan als Datei ab - einfach um besser zu begreifen was da so alles passiert *wink.gif*

    Ziel: ohne Datenfile in ein AcImageCtr

    Mein nächster Ansatz wäre aus Lebans Transparent die Function MakeTransparent etwas für meine Dienste zu missbrauchen...
     
  11. Hi,

    Die Save-Routine ändert die Hintergrundarbe nicht - es gibt schlicht gar keine!
    Da es sich um ein Icon handelt, wird dessen Maske im StdPicture transparent.
    Den Alpha-Kanal können aber die meisten Controls (MSForms-Image, Treeview/Listview über ImageList) nicht anzeigen und stellen den transparenten Hintergrund daher schwarz dar.
    Das Gleiche passiert in der Save-Routine.

    Im Anhang dein Modul von oben (bzw. von mir *wink.gif* ) mit einer modifizierten Save-Routine: Als optionaler Parameter (FlattenColor) kann die Farbe angegeben werden, die statt des schwarzen Hintergrunds eingesetzt wird. (Wird der Parameter nicht angegeben, dann bleibt's beim Alten.)
    Beispielaufruf:
    SavePicGDIplus(GetFileIcon("c:\Test.Txt"), "c:\Test\TXT.bmp", PicTypeBMP, , &HFFFFFFFF )

    &HFFFFFFFF = Farbcode: Alle Kanäle (ABGR) auf 255, also Weiß.
    Rot wäre etwa &HFF0000FF

    Ciao, Sascha
     
    Sascha Trowitzsch, 5. Februar 2010
    #26
  12. Erst mal ein dickes DANKE!

    In der Form, in der die GDI+ online ist, lief die Geschichte bei mir noch nicht, aber in etwas abgewandelter Form geht es jetzt...

    Habe die neue Save-Funktion in die ältere Variante einkopiert und die 4 neu deklarierten Funktionen noch eingefügt danach lief die Geschichte einwandfrei!

    Mdl_GDIPlus.zip

    Hier noch ein Beispiel:

    Code:
    Aufruf z.B.

    Code:
    Pfad ist der komplette String mit Dateiname und Erweiterung, IconImage ist ein AcImageCtr und dann folgt das Zielformat (BMP, GIF, JPG, PNG)

    AcImageCtr und PNG mit Weiss => wird direkt als Transparenter Hintergrund umgesetzt!
     
  13. AnwendungsIcon von Datei auslesen und als Picture anzeigen

    Hier noch ein fertiges Beispiel, welches ich als SubForm einsetze...
    06.02.2010 Dokumenten Verwaltung.zip
    ACHTUNG! Nur Acc2007! Falls gewünscht, kann ich noch eine Ac2002/2003er Version online stellen - ohne Funktionsgarantie!

    Es ist zwar möglich die Funktionen auch unter Ac2000-2003 zu nutzen, allerdings gibt es da noch kein ImageCtr, welches im Endlosformular eingesetzt werden kann! Hier muss auf ein gebundenes Ole ausgewichen werden!

    @Sascha: Habe da noch etwas mit dem GDIPlus, was ich mir nicht erklären kann: Unter Win7 und Acc2003 kann ich mit dem Code aus der Bsp-DB keine PNG und BMP mehr erstellen - kommen Files mit Größe 0KB raus!

    Kennst du dieses Problem?
     
  14. Bei Win7 und Vista kommt automatisch GDI+ 1.1 zum Einsatz.
    Das unterscheidet sich stellenweise etwas von GDI+ 1.0.
    Eigentlich ermittelt das Modul, welche Version verwendet wird. Kannst du mal schauen, was in dieser Zeile der Save-Prozedur passiert:

    If bIsGdip11 And (PicType = picTypeGIF) Then TParams.Count = 1 Else TParams.Count = 0

    Ist auf Win7 bIsGdip11 = True?
    Falls ja: Lass mal das zweite Kriterium weg, so dass bei allen Dateitypen TParam.Count = 1 ist.
    (...Nur so ins Blaue... *wink.gif* )

    Ciao, Sascha
     
    Sascha Trowitzsch, 7. Februar 2010
    #29
  15. JA die Zeile war es wohl! Läuft jetzt auch unter Win7!

    Und wo kann es jetzt durch diese Änderung zu Problemen kommen?
    Soweit ich das überblicke nur bei Versionen unter GDI+ 1.0 oder?

    Zumindest habe ich unter XP mit Ac2007 bis jetzt keine Änderung im Verhalten festgestellt...
     
Thema:

AnwendungsIcon von Datei auslesen und als Picture anzeigen

Die Seite wird geladen...
  1. AnwendungsIcon von Datei auslesen und als Picture anzeigen - Similar Threads - AnwendungsIcon Datei auslesen

  2. VBA7, Declare Function FindWindow Lib

    in Microsoft Excel Hilfe
    VBA7, Declare Function FindWindow Lib: Hallo Allerseits, Frage: Anpassung eines bereits Geschrieben Codes (Forum). Würde ich gern verwenden da es gut Passt. Quelle> VBA Beispiele Seite Datei schließen - Hajo's Excelseiten Datei>...
  3. Name der Datei durch Excel geändert

    in Microsoft Excel Hilfe
    Name der Datei durch Excel geändert: Hallo und guten Abend, Die Datei wird mittels Button (VBA) zwischen gesichert. Das Makro sichert zuvor die Datei und erstellt zus. eine Sicherungsdatei mit der Erweiterung Beispiel-"Sich"....
  4. Zugriff auf nicht vorhandene Datei seitens Excel

    in Microsoft Excel Hilfe
    Zugriff auf nicht vorhandene Datei seitens Excel: Hallo, wann immer ich in Excel Daten in eine Zelle gebe, dauert es ca. 1-2 Minuten, bevor Excel die weitere Bearbeitung freigibt. Unten links gibt es den Hinweis "Zugriff auf Datei erfolgt". Dies...
  5. Makro öffnet unerwartete Datei

    in Microsoft Excel Hilfe
    Makro öffnet unerwartete Datei: Hallo Forum, ich brächte euer Schwarmwissen. Arbeite mit Excel eine Auftragsbearbeitung. Dort habe ich mir einen Button mit Makro erstellt und nutze diesen schon lange. Das Makro generiert ein...
  6. Große Textdatei - Formate entschlacken

    in Microsoft Word Hilfe
    Große Textdatei - Formate entschlacken: Hallo, ich arbeite seit längerem mit einer ziemlich großen Datei (mittlerweile 2000 Seiten), die sozusagen mein Zettelkasten ist. Alles ist leicht auffindbar durch Überschriften (2 Ebenen) und...
  7. Word 2000-Datei beschädigt?

    in Microsoft Word Hilfe
    Word 2000-Datei beschädigt?: Mein Problem: Obwohl sich das Dokument (drei Seiten mit einigen Tabellen) vorher problemlos schließen ließ (ohne Änderung im Text), verlangt Word jetzt beim Schließen immer wieder die...
  8. Zwei Dateien vergleichen - Zielinfo in unterschiedlichen Spalten

    in Microsoft Excel Hilfe
    Zwei Dateien vergleichen - Zielinfo in unterschiedlichen Spalten: Hallo, ich benötige eure Unterstützung. Ich habe zwei Dateien (Excel) dahingehend abgleichen ob in der einen Datei (Master) Zieldaten (Boxennummern - jede in einer Zeile) und deren Folgedaten...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden