Diverse Windowsfeatures

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Ich arbeite momentan an einem kleinen Handler für Windowsfenster ähnlich der MFC um wieder die ganzen Windowsfunktionen zu repetieren und aufzufrischen. Dabei habe ich jetzt auch ein paar neue Sachen gefunden die ich gerne umsetzen würde. Dazu gehört zum Beispiel auch das Laden von Icons aus den Resourcen.

Mit Hilfe der MSDN bin ich auf folgende Zwischenlösung gekommen:
Code:
#pragma pack(push)
#pragma pack(2)

typedef struct
{
   BYTE   bWidth;
   BYTE   bHeight;
   BYTE   bColorCount;
   BYTE   bReserved;
   WORD   wPlanes;
   WORD   wBitCount;
   DWORD   dwBytesInRes;
   WORD   nID;
} GRPICONDIRENTRY, *LPGRPICONDIRENTRY;

typedef struct 
{
   WORD            idReserved;
   WORD            idType;
   WORD            idCount;
   GRPICONDIRENTRY   idEntries[1];
} GRPICONDIR, *LPGRPICONDIR;

#pragma pack(pop)


void CWindow::SetIcon(LPSTR szIcon, bool _small)
{
	HRSRC rsc = FindResource(GetModuleHandle(0), szIcon, RT_GROUP_ICON);
	HGLOBAL hRes = LoadResource(GetModuleHandle(0), rsc);
	GRPICONDIR* grpdir = (GRPICONDIR*)LockResource(hRes);
	rsc = FindResource(GetModuleHandle(0), MAKEINTRESOURCE(grpdir->idEntries[0].nID), RT_ICON);
	hRes = LoadResource(GetModuleHandle(0), rsc);
	if(!_small)
	{
		m_hIcon = CopyIcon((HICON)hRes);
	}
	else
		m_hSIcon = CopyIcon((HICON)hRes);
	FreeResource(hRes);
}

Das funktioniert leider so nicht wirklich, CopyIcon liefert einen 0-Zeiger zurück mit dem Errorcode INVALID_CURSOR_HANDLE.

Ausserdem versuche ich diese Buttons aus dem Windowsframework gerne in meine Applikation einbinden, also nicht diese "veralteten" Buttons sondern die bekannten (Screenshot folgt morgen :P). Hat jemand von euch eine Ahnung, wie man das vollbringen kann?

Gruss
Cromon
 
Hallo Endurion,

Im Wesentlichen dass ich mir der Funktion nicht bewusst war :).

Hier der angesprochene Screenshot was für Buttons ich meine:
http://imagr.eu/upload/button.JPG

Sind solche schon fix im System erreichbar oder müsste ich diese mit eigenen Bildern machen?

Gruss
Cromon
 
Ach der XP-Style. Dafür musst du ein Manifest einbinden. Das klingt kompliziert, ist aber übersimpel. Neuere Visual Studios erstellen das auf Wunsch automatisch. Sonst musst du nur manuell eine XML-Datei als Resource einbinden.

Hier ist ein Link mit netter Erklärung und einem Beispiel-Manifest, das man direkt einsetzen kann:

http://www.codeproject.com/KB/cpp/xpstylemfc.aspx
 
Zuletzt bearbeitet:
Hallo Endurion!

Danke für den Hinweis, ich hatte mich schon immer gefragt wofür diese Manifestdateien gebraucht werden, war jedoch irgendwie immer zu beschäftigt dem nachzugehen da sie bisher für mich relativ unbrauchbar schienen, ein grober Fehler wie ich sehe!

Ich habe mir die Sache mal angesehen und auch das Beispielmanifest als Resource hinzugefügt, allerdings erhalte jedoch nun beim Starten der Applikation den Fehler, dass die MSCVP90.dll nicht gefunden wurde. Google hat mir gesagt ich solle bei den Linkeroptionen einstellen, dass ein Manifest generiert wird, jedoch hat dies nichts zur Lösung beigetragen.

Ich habe mal bisschen an den Dingen im Beispielmanifest rumprobiert (Versionen, ...) jedoch bis jetzt nicht zu einer Lösung gekommen.

Gruss
Cromon
 
Oh, du hast VS 2008. Da müsste das alles eigentlich mit dem Generieren des Manifests erledigt sein (in den Projektoptionen). Das sollte dann auch ohne manuelles Einbinden des Control-Manifestes funktionieren.

Evtl. musst du dir das von VS erzeugte Manifest ansehen und den Common-Controls-Anteil aus dem manuellen Manifest per Hand zusammensetzen.
 
Hallo! Ja, mein Fehler, vergessen die VS-Version zu schreiben! Geht jetzt einwandfrei und endlich nicht mehr mit nostalgischem Look :D
 
Zurück