Einbetten von Grafiken/Icons in einer Win32-Anwendung



  • Hallo alle zusammen,
    ich brauche Hilfe bei der Einbettung von Grafiken in meiner API. Ich habe mehrere Buttons erstellt und manche mit Icons versehen. Diese habe ich ganz normal mit LoadImage() geladen:

    HANDLE hHelpIcon = LoadImage(NULL, "D:\\...\\help.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
    if (hHelpIcon)
    	SendMessage(hHelpButton, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hHelpIcon);
    

    Alles funktioniert wunderbar, wenn ich aber das Programm auf einem anderen starte, werden keine Icons geladen. Wie kann ich das ändern? Ich dachte, dass solche Elemente automatisch in die Exe eingebettet werden... 😞 Und sagt bloß bitte nicht, dass ich sie in das Projekt als Ressourcen einfügen soll, weil das sehr umständlich wird. Außerdem werden die Ressourcendateien beim Compilieren "zerschossen" (benutzerdefinierte Struktur und Kommentare entfernt).

    Danke.



  • Pack die Dateien doch einfach in den Ordner deiner exe-datei. Dann muesstest du die problemlos mit LoadIcon() laden koennen (sofern du die Icon-Dateien auch auf den anderen Rechner kopierst).
    Eingebunden werden die Icons in die exe nur wenn du sie in eine entsprechende Resource packst.

    Gruss
    Dirk



  • [Rewind] schrieb:

    Und sagt bloß bitte nicht, dass ich sie in das Projekt als Ressourcen einfügen soll, weil das sehr umständlich wird.

    Ja, sag ich dir aber.

    [Rewind] schrieb:

    Außerdem werden die Ressourcendateien beim Compilieren "zerschossen" (benutzerdefinierte Struktur und Kommentare entfernt).

    Danke.

    Das ärgert mich auch immer ungemein, daher hab ich immer eine Kopie der *.rc Datei in einem Unterordner und mache dort die Änderungen per Hand, danach wird diese Datei über die zu kompilierende *.rc Datei drüberkopiert. Gibt vieleicht auch elegantere Lösungen, aber die sind mir nicht bekannt.



  • ........ schrieb:

    Das ärgert mich auch immer ungemein, daher hab ich immer eine Kopie der *.rc Datei in einem Unterordner und mache dort die Änderungen per Hand, danach wird diese Datei über die zu kompilierende *.rc Datei drüberkopiert. Gibt vieleicht auch elegantere Lösungen, aber die sind mir nicht bekannt.

    Ich mach das auch so... Na gut, dann muss ich wohl die Kackdinger einfügen.


  • Mod

    [Rewind] schrieb:

    Außerdem werden die Ressourcendateien beim Compilieren "zerschossen" (benutzerdefinierte Struktur und Kommentare entfernt).

    Welcher Compiler zerschießt bitte die RC Datei?
    Meinst Du etwa den Ressourcen-Editor vom VS? Das wäre die IDE...

    Die IDE speicher die RC Datei in einem eigenen Format.
    Wenn man eine "handgeschriebene" rc Datei verwenden möchte, dann wird normalerweise eine rc2 Datei angelegt die man in die RC Datei included.



  • Martin Richter schrieb:

    Welcher Compiler zerschießt bitte die RC Datei?
    Meinst Du etwa den Ressourcen-Editor vom VS? Das wäre die IDE...

    Mein Fehler, ich meinte den Editor vom VS.

    Wenn ich die Icons in das Projekt einfüge und die Ressourcen-ID mit dem MAKEINTRESOURCE()-Makro verwende, kommt

    Unhandled exception at 0x76f28cde in ...: 0xC0000005: Access violation reading location 0x00000066.

    Der Debugger zeigt zwar auf die Funktion zur Erstellung des Fensters, in dem die Icons dargestellt werden sollen, aber der Ursprung des Fehlers beläuft sich auf die Zeilen zum Laden und Anzeigen des Symbols. Was mach ich falsch? 😕
    Das wundert mich, weil die LoadImage()-Funktion das Symbol anscheinend lädt, sonst würde die Windowsnachricht gar nicht abgeschickt werden und es gäbe ein Button ohne das Symbol, aber jetzt...


  • Mod

    Bei welcher Code Zeile?



  • Martin Richter schrieb:

    Bei welcher Code Zeile?

    Wenn du's konkret haben möchtest: hier ist die Zeile, auf die der Debugger zeigt:

    hMainWindow = CreateDialog(hInst, MAKEINTRESOURCE(IDR_MAINWINDOW), hWnd, reinterpret_cast<DLGPROC>(DlgProc));
    

    Und das ist die Zeile, die den Fehler verursacht (bei einer direkten Angabe der Adresse der Icon-Datei gibt es keinen Fehler):

    HANDLE hHelpIcon = LoadImage(NULL, MAKEINTRESOURCE(IDC_HELPICON), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
    if (hHelpIcon)
    	SendMessage(hHelpButton, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hHelpIcon);
    

    Das Symbol ist ins Projekt importiert worden und in der .rc-Datei heißt es dann:
    IDC_HELPICON ICON "help.ico"



  • [Rewind] schrieb:

    hMainWindow = CreateDialog(hInst, MAKEINTRESOURCE(IDR_MAINWINDOW), hWnd, reinterpret_cast<DLGPROC>(DlgProc));
    

    Offensichtlich hat Deine DlgProc die falsche Signatur. Hättest Du das richtig gemacht, bräuchtest Du den Cast nicht. Korrigiere das erstmal!



  • [Rewind] schrieb:

    HANDLE hHelpIcon = LoadImage(NULL, MAKEINTRESOURCE(IDC_HELPICON), IMAGE_ICON, 16, 16, LR_LOADFROMFILE);
    

    Beim direkten Laden aus der Resource (was MAKEINTRESOURCE mir suggeriert):
    - 1. Parameter sollte nur für "OEM"-Resourcen NULL sein
    - LR_LOADFROMFILE macht keinen Sinn



  • "Einbetten von Grafiken/Icons in einer API" API ist die Abkürzung für Application Programming Interface. Es ist also eine Schnittstelle, die Definiert wie man eine bestimmte Software nutzt. Die Windows API ist eine Schnittstelle zum Windows Betriebssystem. Eine API besteht für den Anwender im wesentlichen aus einer Dokumentation, wie man die Schnittstelle nutzt. Du willst also eine Grafik, ein Icon in einer Dokumentation einbinden. Wie stellst du dir das vor?


Anmelden zum Antworten