Tino
Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Fr 14.06.02 10:23
Einbinden von Icons / Cursor / Bitmaps
Autor: Benedikt Gollatz
E-Mail: d3g@delphi-ware.de
Quelle: www.delphi-ware.de/
Einbinden
- Bildeditor / Image Editor
Zu jedem Projekt gehört, wenn es abgespeichert wurde, eine *.res-Datei. Diese kann man mit dem mitgelieferten "Bildeditor" oder im englischen "Image Editor" bearbeiten, den man in der Tools-Leiste in der Delphi-IDE findet und auch im Startmenü im Delphi-Ordner finden kann. Der Bildeditor ist in jeder Delphi-Version ab Delphi 1 Standard vorhanden, also wenn er bei euch nicht zu finden ist, habt ihr ihn auf irgendeinem Wege entfernt, da er auch automatisch mitinstalliert wird. Ihr öffnet mit dem Bildeditor also die *.res-Datei mit dem Namen eures Projekts. Eine Liste öffnet sich mit dem obersten Eintrag "Inhalte bzw. "Contents".
- MAINICON
Darunter befindet sich ein Untereintag "Symbol"/"Icon", in welchem man ein Symbol findet, nämlich "MAINICON". Wenn ihr darauf doppelklickt, werdet ihr merken, dass das das Icon des Projekts ist, das in den Formular-Titelleisten angezeigt wird, sofern kein anderes Icon dem Formular zugewiesen wurde. Wenn ihr dieses Icon veröndert, ändert sich auch das Projekt-Icon.
- Neue Icons / Cursors / Bitmaps
Neue Objekte erstellt ihr, wenn ihr auf der Liste auf eine Stelle rechtsklickt, wo sich Eintrag befindet. Wählt "Neu" / "New" an und sucht euch den gewünschten Typ aus. Jeder Typ hat unter dem Haupteintrag seinen eigenen Untereintrag, damit es nicht Unübersichtlich wird. Die Einträge könnt ihr dann mit einem Rechtsklick Editieren, Umbenennen, und Löschen. Schneller kommt ihr zum Bearbeiten, wenn ihr auf den Eintrag doppelklickt.
Bei Cursorn ist es nach dem Erstellen besonders wichtig, dass ihr die sensitive Zone, also die "Spitze" des Cursors, festlegt. Das tut ihr, indem ihr "Cursor | Sensitive Zone festlegen..." / "Cursor | Set Hot Spot..." auswählt und dann die X- und Y-Koordinate der Spitze angebt.
- Eigene *.res-Dateien
Natürlich kann man auch eigene *.res-Dateien benutzen. Man erstellt ganz einfach eine mit "Datei | Neu | Resourcen-Datei (.res)" / "File | New | Recource File (.res)" eine neue Recourcendatei und geht dann so wie sonst auch vor.Ich bevorzuge diese Methode, weil es in Resourcen-Dateien durch einen Bug im Bildeditor zu Fehlern kommen kann, die die Dateien dann unbrauchbar machen.
- Compilerdirektive {$R}
Nun ist es noch wichtig, dem Compiler mitzuteilen, welche Resourcendateien er einbinden soll. Dies geschieht durch die Compilerdirektive {$R}. Wenn ihr einmal eure Units durchscrollt, werdet ihr festellen, dass jede Unit diese Direktive besitzt, sofern ein Formular zur Unit gehört. Diese Direktive sieht dann so aus: {$R *.DFM}. Das bedeutet, dass alle Dateien im Verzeichnis mit der Endung DFM eingebunden werden, also alle Formulare. Auch im Projektquelltext werdet ihr diese Direktive finden, hier mit der Endung RES. Das ist dazu nötig, weil beim Erstellen der Applikation das MAINICON ausgelesen wird. Ihr müsst nun in jeder Unit, in der ihr eure Resourcen braucht diese Compilerdirektive hinzufügen, die wohl so gut wie immer {$R *.RES} lauten wird, da es wohl selten vokommt, dass ihr eure Resourcendateien in einem anderen Verzeichnis als der Projektdatei speichert.
Abrufen
- Bitmaps
Für Bitmaps gibt es eine Methode, die das Abrufen zum Kinderspiel macht: LoadFromResourceName. Diese kann man dann für fast alle Komponenten, in die Icons oder Bitmaps geladen werden sollen, benutzen. Ein Beispiel ist etwa:
Delphi-Quelltext 1: 2: 3: 4: 5:
| var MyBMP: TBitmap;
MyBMP.LoadFromResourceName(HInstance, 'BITMAPNAME'); |
HInstance ist eine Variable, die das Handle der Applikation angibt, um die ihr euch nicht kümmern müsst, BITMAPNAME ist der Name des Bitmaps oder Icons. Dies funktioniert mit allen Objekten vom Typ TBitmap, also auch mit BitBtn.Glyph, Image.Picture.Bitmap, usw. Es gibt noch eine andere Methode zum Laden von Bitmaps: die API LoadBitmap. Diese funktioniert so ähnlich wie LoadFromResourceName, unterstützt aber keine 256-Farben-Bitmaps. Der Aufruf von LoadBitmap ist etwas anders:
SpeedButton.Glyph.Handle := LoadBitmap(HInstance, 'BITMAPNAME');Wie ihr seht wird hier das Handle an einen anderen Befehl übergeben.
Ihr müsst LoadBitmap benutzen, wenn ihr auf eine Komponente stoßt, die eine Zeichenfläche benutzt, die nicht TCanvas-ähnlich is und so die LoadFromResourceName-Prozedur nicht unterstützt und wenn ihr 16-Farben- Bitmaps habt und schreibfaul seid, wie alle Programmierer .
Bei LoadBitmap ist es auch möglich, bestimmte Windows-Standardicons auf eure Zeichenflächen zu laden. Dann müsst ihr für HInstance 0 (Null) eintragen und für das zweite Flag einen Wert aus der folgenden Tabelle als PChar eintragen: Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| OBM_BTNCORNERS OBM_OLD_RESTORE OBM_BTSIZE OBM_OLD_RGARROW OBM_CHECK OBM_OLD_UPARROW OBM_CHECKBOXES OBM_OLD_ZOOM OBM_CLOSE OBM_REDUCE OBM_COMBO OBM_REDUCED OBM_DNARROW OBM_RESTORE OBM_DNARROWD OBM_RESTORED OBM_DNARROWI OBM_RGARROW OBM_LFARROW OBM_RGARROWD OBM_LFARROWD OBM_RGARROWI OBM_LFARROWI OBM_SIZE OBM_MNARROW OBM_UPARROW OBM_OLD_CLOSE OBM_UPARROWD OBM_OLD_DNARROW OBM_UPARROWI OBM_OLD_LFARROW OBM_ZOOM OBM_OLD_REDUCE OBM_ZOOMD | So wäre ein Beispielaufruf:Image.Picture.Bitmap.Handle := LoadBitmap(0, PChar(OBM_CLOSE));
Achtung:LoadBitmaperzeugt bei Fehlern im Gegensatz zu LoadFromResourceName nicht eine Fehlermeldung, sondern gibt als Handle 0 zurück. Das bedeutet, dass wenn die Resource zum Beispiel nicht geladen werden konnte, weil die Resourcendatei nicht eingebunden wurde, keine Fehlermeldung kommt, sondern einfach nichts als Bild angezeigt wird.
- Icons
Das Laden von Icons ist auch sehr Eionfach, da es eine Methode gibt, die LoadBitmap eigentlich fast aufs Haar gleicht: LoadIcon. Die Fehlerbehandling gleicht LoadBitmap. Fast gleicht sie LoadBitmap nur, weil man zwar wieder mit der gleichen Methode Standardicons laden kann, aber diese anders sind: Quelltext 1: 2: 3: 4: 5: 6:
| IDI_APPLICATION IDI_ASTERISK IDI_EXCLAMATION IDI_HAND IDI_QUESTION IDI_WINLOGO |
- Cursor
Mit Cursors ist das ganze ein wenig komplizierter, da man diese noch sonderlich deklarieren und ihnen eine Bezeichnung geben muss. Aber auch dazu gibt es eine Methode, nämlich LoadCursor. Zu allererst muss man dem Cursor eine Bezeichnung und eine dazugehörige Nummer beschaffen. dies macht ihr, indem ihr eine Konstante definiert:const crDummyCursor = 8;crDummyCursor ist die Bezeichnung und 5 die Nummer. Hierbei muss man aufpassen, da die Nummern 0 bis - 22 vergeben sind und ihr durch eine gleiche Nummer den alten Cursor nicht überschreibt, sondern der alte Cursor angezeigt wird. Auf der sicheren Seite seid ihr, wenn ihr euch im positiven Bereich bewegt. Die Cursor und die dazugehörigen Nummern findet ihr in der Hilfe unter TCursor.
Nun kann man den Cursor einbinden und dann benutzen: Quelltext 1: 2:
| Screen.Cursors[crDummyCursor] := LoadCursor(HInstance, 'CUSORNAME'); MainForm.Cursor := crDummyCursor; | Die LoadCursor-Funktion ist eigentlich gleich wie LoadBitmap und LoadIcon. Das bedeutet auch, dass man wieder Windows-Standard-Cursor laden kann, wenn man für HInstance 0 einsetzt und folgenden Wert als PChar für das zweite Flag einsetzt: Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| IDC_APPSTARTING IDC_ARROW IDC_CROSS IDC_IBEAM IDC_ICON (Nur Windows NT) IDC_NO IDC_SIZE (Nur Windows NT) IDC_SIZEALL IDC_SIZENESW IDC_SIZENS IDC_SIZENWSE IDC_SIZEWE IDC_UPARROW IDC_WAIT |
|