Discussion:
ShieldIcon als Bitmap
(zu alt für eine Antwort)
Thomas Cebulla
2008-02-19 10:10:08 UTC
Permalink
Hallo

bekanntermaßen kann man ja unter Vista so einem Button(!) ein Shieldicon
verpassen:

const BCM_FIRST = $1600;
BCM_SETSHIELD = BCM_FIRST + $000c;

SendMessage(Button1.handle, BCM_SETSHIELD, 0, Integer(true));


Wie bekomme ich aber nun das Shieldicon elegant als Bitmap, um es zum
Beispiel einem Toolbutton zuzuwesen?

Unter .net2.0 gibt es etwas wie:
Image = Bitmap.FromHicon(SystemIcons.Shield.Handle);
//http://www.danielmoth.com/Blog/2007/12/systemiconsshield.html

Wie macht man das mit VCL32?

Thomas
Achim Kalwa
2008-02-19 13:11:39 UTC
Permalink
Hallo,
Post by Thomas Cebulla
Wie bekomme ich aber nun das Shieldicon elegant als Bitmap, um es zum
Beispiel einem Toolbutton zuzuwesen?
Image = Bitmap.FromHicon(SystemIcons.Shield.Handle);
//http://www.danielmoth.com/Blog/2007/12/systemiconsshield.html
Wie macht man das mit VCL32?
Es gibt eine Shell-API Funktion, mit dem man Shell Stock-Icons laden kann:

SHGetStockIconInfo()

Hilfe dazu gibt's in der von Borland/CodeGear mitgelieferten
Dokumentation nicht, aber Online:
http://msdn2.microsoft.com/en-us/library/bb762205(VS.85).aspx

Die entsprechenden Konstanten für SHGSI_xxx sind natürlich auch nicht in
der Delphi-Umsetzung enthalten; hier muss man selber nachhelfen. Zum
Glück gibts das Visual Studio 2008 Express incl. Platform SDK kostenlos
zum download; in den Include-Dateien erfährt man dann auch die Wert der
benötigten Konstanten und den Aufbau der Struktur TSHStockIconInfo.

Also:

const
IDI_APPLICATION = 32512;
IDI_HAND = 32513;
IDI_QUESTION = 32514;
IDI_EXCLAMATION = 32515;
IDI_ASTERISK = 32516;
IDI_WINLOGO = 32517;
IDI_SHIELD = 32518; // <- das Objekt der Begierde.

IDI_WARNING = IDI_EXCLAMATION;
IDI_ERROR = IDI_HAND;
IDI_INFORMATION = IDI_ASTERISK;

SIID_SHIELD = 77; // <- nochmal das Shield

SHGSI_ICON = $0100; // für SHGetStockIconInfo
SHGSI_LARGEICON = $0000;
SHGSI_SMALLICON = $0001;

type
TSHStockIconInfo = record
cbSize : DWORD;
hIcon : THandle;
iSysImageIndex: Integer;
iIcon : Integer;
szPath : Array[0..MAX_PATH-1] of WideChar;
end;

function SHGetStockIconInfo(
SIID : Integer; uFlags: UINT; var SSI: TSHStockIconInfo
): HResult; stdcall; external 'shell32.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
hIcon : THandle;
SSII : TSHStockIconInfo;
ResCode : HResult;
begin
//========================================
// Variante 1: via LoadIcon
// Stock Icon laden

hIcon := LoadIcon(0, PChar(IDI_SHIELD);
Image1.Picture.Icon.Handle := hIcon;

//========================================
// Variante 2a: kleines Icon

SSII.cbSize := SizeOf(SSII);
ResCode := SHGetStockIconInfo(SIID_SHIELD,
SHGSI_ICON or SHGSI_SMALLICON,
SSII);
if Succeeded(ResCode) then
Image1.Picture.Icon.Handle := SSII.hIcon;

//========================================
// Variante 2b: Großes Icon

SSII.cbSize := SizeOf(SSII);
ResCode := SHGetStockIconInfo(SIID_SHIELD,
SHGSI_ICON or SHGSI_LARGEICON,
SSII);
if Succeeded(ResCode) then
Image1.Picture.Icon.Handle := SSII.hIcon;
end;

So, jetzt hast Du das Shield in einem Icon. Wie man das zu einer
ImageList oder in einen ToolButton bekommt, überlasse ich Dir :-)


HTH
Achim
Thomas Cebulla
2008-02-19 14:05:25 UTC
Permalink
Hallo Achim,

wow, besser kann man die Frage nicht beantworten.
Vielen Dank und viele Grüße

Thomas
NineBerry Schwarz
2008-02-19 14:02:17 UTC
Permalink
Hallo
Post by Thomas Cebulla
Wie bekomme ich aber nun das Shieldicon elegant als Bitmap, um es zum
Beispiel einem Toolbutton zuzuwesen?
procedure TForm1.Button1Click(Sender: TObject);
var
IconHandle: THandle;
Image: TImage;
const
IDI_SHIELD = MakeIntResource(32518);
begin
Image:= Image1;

// Shield-Icon laden
IconHandle:= LoadIcon(0, IDI_SHIELD);

if IconHandle = 0 then
begin
// Vor Vista: Normales Warn-Icon verwenden
IconHandle:= LoadIcon(0, IDI_WARNING);
end;

// Icon in TImage anzeigen
Image.Picture.Icon.ReleaseHandle;
Image.Picture.Icon.Handle:= IconHandle;
end;

Neun
Thomas Cebulla
2008-02-19 14:10:16 UTC
Permalink
Hallo,
das ist dann wohl die Kurzform, zum Glück weiß ich jetzt schon von Achim,
woher die Magic Number 32518 ist

Auch Dir vielen Dank
Post by Achim Kalwa
Hallo
Post by Thomas Cebulla
Wie bekomme ich aber nun das Shieldicon elegant als Bitmap, um es zum
Beispiel einem Toolbutton zuzuwesen?
procedure TForm1.Button1Click(Sender: TObject);
var
IconHandle: THandle;
Image: TImage;
const
IDI_SHIELD = MakeIntResource(32518);
begin
Image:= Image1;
// Shield-Icon laden
IconHandle:= LoadIcon(0, IDI_SHIELD);
if IconHandle = 0 then
begin
// Vor Vista: Normales Warn-Icon verwenden
IconHandle:= LoadIcon(0, IDI_WARNING);
end;
// Icon in TImage anzeigen
Image.Picture.Icon.ReleaseHandle;
Image.Picture.Icon.Handle:= IconHandle;
end;
Neun
Markus Springweiler
2008-02-21 10:16:01 UTC
Permalink
NineBerry,
Post by NineBerry Schwarz
const
IDI_SHIELD = MakeIntResource(32518);
Boah: Ein Typ der einen Funktionsaufruf suggeriert (was für Drogen nehmen
die eigentlich bei Borland-Inprise-Borland-CodeGear-WhatNext?).
--
/\/\arkus.
Achim Kalwa
2008-02-21 14:12:07 UTC
Permalink
Post by Markus Springweiler
NineBerry,
Post by NineBerry Schwarz
const
IDI_SHIELD = MakeIntResource(32518);
Boah: Ein Typ der einen Funktionsaufruf suggeriert (was für Drogen nehmen
die eigentlich bei Borland-Inprise-Borland-CodeGear-WhatNext?).
Das liegt wohl eher an Microsoft. Dort gibt es das Makro MAKEINTRESOURCE
(WinUser.h). Es ist wie folgt deklariert:

#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))

Ein Integer wird also (über Umwege) in einen LPSTR gecastet. Nix anderes
macht der Typ "MakeIntResource" in Delphi auch. Das Makro durch eine
Funktion zu ersetzen, wäre Overkill.

HTH
Achim
Markus Springweiler
2008-02-21 15:50:50 UTC
Permalink
Achim,
Post by Achim Kalwa
Das liegt wohl eher an Microsoft. Dort gibt es das Makro MAKEINTRESOURCE
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
Ah ok -- wird bei C ein Makro zur Compile-Zeit ausgewertet? Oder noch vor
dem Kompilieren als eine Art Suchen&Ersetzen auf den Source angewendet?
--
/\/\arkus.
Achim Kalwa
2008-02-22 07:46:37 UTC
Permalink
Moin,
Post by Markus Springweiler
Post by Achim Kalwa
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
Ah ok -- wird bei C ein Makro zur Compile-Zeit ausgewertet? Oder noch vor
dem Kompilieren als eine Art Suchen&Ersetzen auf den Source angewendet?
Ja, vor dem compilieren macht sich der Präprozessor über den Source-Code
her und ersetzt die Makros durch den entsprechenden Code. Der
Präprozessor tilgt dabei auch alle Kommentare, wertet #ifdefs aus und
bindet die mit #include angegebenen Dateien ein.
Erst dann beginnt der eigentliche C-Compiler seine Arbeit.

Delphi kommt ohne Präprozessor aus.
Es gibt aber Ansätze, den Sprachumfang von Delphi mit Hilfe eines
Präprozessors zu erweitern. Als Beispiel sei hier mal das Projekt
"DLangExtensions" von Andreas Hausladen genannt:
http://andy.jgknet.de/dlang/

HTH
Achim

Loading...