Probleme bei Icons



  • Hi
    Ich habe aus dem Tutorial http://winprog.org/tutorial/menus.html versucht ein Icon zu binden. Allerdings sagt er mir beim kompilieren immer:

    Error E2034 main.cpp 75: Cannot convert 'void *' to 'HICON__ *' in function __st
    dcall WndProc(HWND__ *,unsigned int,unsigned int,long)
    Error E2034 main.cpp 79: Cannot convert 'void *' to 'HICON__ *' in function __st
    dcall WndProc(HWND__ *,unsigned int,unsigned int,long)
    

    Ich verwende das so wie es im Tut beschrieben wird, es klappt allerdings trotzdem nicht...
    Weiß jemand was ich machen muss?

    DIV Iconer



  • Versuch einfach mal, die Kompiler-Meldungen zu interpretieren... Anscheindend gibts ein Problem in deiner Funktion WndProc.

    Kompiler schrieb:

    Cannot convert 'void *' to 'HICON__ *'

    Bedeutet, dass du irgendwo einen void-Zeiger statt einen Zeiger auf ein HICON benutzt.

    Deine Fehler kommen in den Zeilen 75 und 79. Poste die zwei Zeilen und dir kann bestimmt jemand helfen 😉



  • HICON hIcon, hIconSm;
    ...
    hIcon = LoadImage (NULL, "valet.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
    ...
    hIcon = LoadImage (NULL, "valet.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
    ...
    


  • Iconer schrieb:

    HICON hIcon, hIconSm;
    ...
    hIcon = LoadImage (NULL, "valet.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
    ...
    hIcon = LoadImage (NULL, "valet.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
    ...
    

    ➡

    Iconer schrieb:

    HICON hIcon, hIconSm;
    ...
    hIcon = (HICON)LoadImage (NULL, "valet.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE);
    ...
    hIcon = (HICON)LoadImage (NULL, "valet.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
    ...
    


  • Ohhh...daran hatte ich auch schon gedacht nur nhicht da^^
    Danke, funktioniert, darauf wäre ich jetzt erstmal nicht mehr gekommen^^



  • Ich hab da noch ne Frage: wie kann ich das Icon denn so laden, dass es auch als Icon vom Programm angezeigt wird? Also wie das Symbol vom Arbeitsplatz zum Beispiel.


  • Mod

    Indem nan z.B. SetIcon verwendet um dies währen der Laufzeit zu machen.
    Ansonsten wird für ein Programm das erste Icon mit der niedrigsten ID im Explorer angezeigt, wenn es sich nicht um eine registrierte Komponente handelt.



  • Ich meine, wenn das Prgoramm noch nicht gestartet worde ist...ich habe (glaube ich) in Erinnerung, dass das auch mal irgendwie ging...


  • Mod

    Sicher: Wie ich geschrieben habe, das Icon mit der niedrigsten ID bzw. das erste Icon das in der EXE gefunden wird, wird auch im Explorer verwendet.



  • Martin Richter schrieb:

    Indem nan z.B. SetIcon verwendet um dies währen der Laufzeit zu machen.
    Ansonsten wird für ein Programm das erste Icon mit der niedrigsten ID im Explorer angezeigt, wenn es sich nicht um eine registrierte Komponente handelt.

    SetIcon ist IMHO MFC...Das WinApi-Pendant ist SetClassLong.



  • Also es handelt sich nicht um ein Icon aus einer Resource-Datei...ich weiß jetzt aber nicht ob das was ändert...



  • Iconer schrieb:

    Also es handelt sich nicht um ein Icon aus einer Resource-Datei...ich weiß jetzt aber nicht ob das was ändert...

    Nö da ändert sich eigentlich nix...So sollte es funktionieren:

    // zum Beispiel unter WM_CREATE:
    SetClassLong(hWnd, GCL_HICON, reinterpret_cast<long>(LoadImage(...)));
    


  • Habe das jetzt so gemacht:

    SetClassLong(hMain, GCL_HICON, reinterpret_cast<long>(LoadImage(NULL, "valet.ico", IMAGE_ICON, 64, 64, LR_LOADFROMFILE)));
    

    Aber ich sehe immer noch kein Icon.
    Ich will das Icon bevor ich das Programm gestartet habe sehen, also statt diesem Fenster möchte ich das Icon...



  • Iconer schrieb:

    Habe das jetzt so gemacht:

    SetClassLong(hMain, GCL_HICON, reinterpret_cast<long>(LoadImage(NULL, "valet.ico", IMAGE_ICON, 64, 64, LR_LOADFROMFILE)));
    

    Aber ich sehe immer noch kein Icon.
    Ich will das Icon bevor ich das Programm gestartet habe sehen, also statt diesem Fenster möchte ich das Icon...

    Versuchs mal mit ner geringeren Größe, z.B.: 16x16 oder 32x32.



  • Auf die Idee bin ich auch schon gekommen, hat aber nichts gebracht.



  • Iconer schrieb:

    Ich will das Icon bevor ich das Programm gestartet habe sehen, also statt diesem Fenster möchte ich das Icon...

    Hi

    Wenn ich mich mal so einschalten darf: Wann willst du jetzt das Icon genau sehen? Als Symbol für deine Exe-Datei im Explorer oder als Symbol für dein Fenster (in der Taskbar und in der linken oberen Ecke deines Fensters)?

    So, wie ich das verstehe, willst du, dass das Icon im Explorer als Symbol für dein Programm angezeigt wird. Also wie jetzt?



  • Sry wenn das unverständlich war: Im Explorer



  • Dann ist das mit dem SetClassLong und so hinlänglich 🤡

    Martin Richter schrieb:

    Wie ich geschrieben habe, das Icon mit der niedrigsten ID bzw. das erste Icon das in der EXE gefunden wird, wird auch im Explorer verwendet.

    Irgendwas kann dann in deiner Resourcen-Datei nicht stimmen. Müsste so aussehen:

    ID_ICON_MAIN ICON DISCARDABLE "Data\\MeinIcon.ico"
    

    Der String sollte deinem (relativen oder totalen) Dateipfad für die Icon-Datei entsprechen. IC_ICON_MAIN durch deine Icon-ID oder eine Zahl ersetzen. Das "ICON" ist wichtig!

    Diese Syntax funktioniert so sicherlich nicht bei jedem Compiler. Also sag mal bitte, was du für einen Compiler hast und deinen Code in der Resourcen-Datei.



  • *hust*Resourcen-Datei? Geht das nicht anders? Es gibt 2 Gründe warum ich die nicht mag:
    1: Ich finde die Blöd 🙂
    2: nur Gott (und ein paar Auserwählt) wissen, wie man die beim Borland Compiler (nicht bei der IDE, sondern beim BCC) einbindet



  • Also nicht, dass ihr denkt, dass ich zu faul bin das zu suchen. Aber ich habe einiges probiert, aber das war alles irgendwo nicht funktionstüchtig.


  • Mod

    CodeFinder schrieb:

    Martin Richter schrieb:

    Indem nan z.B. SetIcon verwendet um dies währen der Laufzeit zu machen.
    Ansonsten wird für ein Programm das erste Icon mit der niedrigsten ID im Explorer angezeigt, wenn es sich nicht um eine registrierte Komponente handelt.

    SetIcon ist IMHO MFC...Das WinApi-Pendant ist SetClassLong.

    Nein! SetIcon ist nur ein MFC Wrapper für WM_SETICON. SetClassLong für das Icon ist ein ganz anderer Ansatz und beeinflusst alle Fenster einer Klasse. WM_SETICON beeinflusst nur dieses Fenster und kann dynamisch verwendet werden.


Anmelden zum Antworten