ProgrammIcon mittels Funktion ändern

leon_20v

Erfahrenes Mitglied
Hallo Zusammen,

ich bin am verzweifeln.
Ich arbeite an einem etwas größerem Programm mti mehreren Sprachen die mit DLL´s geladen werden.

Ich würde jetzt gern einfach aus einer Datei das Icon laden, welches im Tray, im Programm oben und auch bei der Installationsexe angezeigt wird. Finde dazu leider nichts im Netz.

Wenn ich die xzy.icon im Projektordner/res ändere passiert leider nichts im Programm :(

Geht das überhaupt?

Hoffe Ihr könnt mir helfen.

Vielen Dank
 

leon_20v

Erfahrenes Mitglied
also ich hab jetzt noch ewig rumprobiert... es geht jetzt darum, dass ich die icons unabhängig von den dll setzen und laden kann. das geht irgendwie nicht richtig.

wenn ich das icon rauslösche und die dll neu erstelle, dann werden mir keine icons angezeigt.
wenn ich jetzt aber die icons wieder hinzufüge und die dll neu erstelle dann wird mir trotzdem nichts angezeigt. ich habe auch in der resource.h die id angepasst aber leider komplett ohne erfolg :(

ich weiß nicht mehr weiter :(
 

Endurion

Erfahrenes Mitglied
Zeig doch mal etwas Code. Das Icon in der Exe ist das Icon mit der niedrigsten resource ID in der .exe.

Die Icons auf dem Fenster bzw. im Tray mußt du selber setzen (WM_SETICON bzw. Shell_NotifyIcon)

Wenn du ein Icon aus der DLL laden willst, mußt du bei LoadIcon die passende HINSTANCE angeben (der DLL).
 

leon_20v

Erfahrenes Mitglied
Danke für deine Antwort..

Code:
BOOL ToolDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
               SetIcon(m_hIcon, TRUE);     // Set big icon
                 SetIcon(m_hIcon, FALSE);    // Set small icon



.......

}
Davor kommt kein Code mehr nur ein haufen danach :)

Wenn ich bei IDR_MAINFRAME die Deklaration suche, dann komme ich zur resource.h in einer meiner Projekte für die DLL erstellung.
Die DLL ist doch zu diesem Zeitpunkt noch garnicht gesetzt? Weil die Frage ich nämlich danach ab.

Im DLL Projekt "resource.h" hat ID_MAINFRAME die Nr. 128.
Im Hauptprojekt hat die ID_MAINFRAME die ID 133.

Wie kann ich jetzt machen, damit die Resource nicht von der DLL geladen wird?
In dem Hauptprojekt wird die "Resource.h" groß geschrieben, warum auch immer?
Und das Programm greift auf jeder stelle auf die ID in der DLL1 zu, Obwohl es noch 5 andere DLL gibt für jede Sprache. Es greift beim Icon immer nur auf die Erste zu. :(

DANKE

/edit
das hab ich auch noch gefunden, aber das macht einfach keinen unterschied wenn ich das raus mache oder rein mache.

Code:
int CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    __super::OnCreate(lpCreateStruct);

    SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE);
   SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), FALSE);

    return 0;
}

Was ich jetzt festgestellt habe ist folgendes, wenn ich ein im Hauptprojekt ein ICON hinzufüge und das hier mache
Code:
m_hIcon = AfxGetApp()->LoadIcon(IDR_ANDERES_ICON);
dann erkennt der Compiler das ander ICON nicht. Wenn ich es in der Resource.h der Hauptfunktion hinzufüge passiert auch nichts. // hat damit auch nix zu tun :(

wenn ich es in der resoruce.h der DLL1 hinzufüge und die DLL1 kompiliere wird das Icon erkannt aber nicht angezeigt.

erst wenn ich das icon im Resourcenfenster hinzufüge und die DLL1 kompiliere wird das Icon geändert.


Es liegt doch sicher irgendwie daran, das die DLL1 die hinstance irgendwo setzt oder? Oder Wie kann ich das umgehen?

Und es ist noch was ganz komisch, das Icon wird ja in der res gespeichert. Jetzt wollte ich die Datei austauschen und einfach mit den Namen ändern.

Doch sobald ich den Namen änder, wird das andere Icon angezeigt. Ich werde noch verrückt :(
 
Zuletzt bearbeitet:

Endurion

Erfahrenes Mitglied
Da gab es einen Trick, damit MFC in allen Dlls nachsieht, aber mir fällt ums Verrecken der Funktionsname nicht ein.

Du kannst aber ein ::LoadIcon( HINSTANCE, UINT ) benutzen, wo HINSTANCE das Handle der Dll ist. Wie gesagt, die .exe sowie reingeladene Dlls können alle je eigene Resourcen haben.
Du mußt schon angeben, aus welcher Resource du ein Resource-Item beziehen möchtest.
 

leon_20v

Erfahrenes Mitglied
Danke für deine Antwort.

Also das Progamm läuft so ab:
Zuerst geht es in die Projekt.cpp und erstellt hier eine Instanz von der ersten "Standart"(Englisch)-DLL. Erst später wird in der ProjektDLG.cpp ein Icon gesetzt.
Wahrscheinlich wird deswegen das Icon aus dieser Instanz geladen wenn ich ::LoadIcon(UINT) benutze.
Warum er aber das ICON im Tray nicht ändert obwohl ich die ID geändert habe verstehe ich nicht :(
Genauso wenn ich in der Taskleiste auf das Icon die rechte Maustaste mach gibts ja da ei ICON für Programm öffnen und da ist ein ganz altes ICON welches ich irgendwann mal zum testen rein habe. das existiert eigentlich garnicht mehr.

Damit die DLL das neue ICON übernimmt, muss ich zwingend das Projekt bereinigen und dann kompilieren.


Kann ich nicht irgendwie sagen, dass er nur das Icon aus dem Hauptrojekt nimmt, indem alle Funktionen gespeichert sind?
 

Neue Beiträge