Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Windows GUI

Icon in der Titelleiste

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.RedakteurVolta 02.02.2016

Die folgenden Codes demonstrieren, wie ein Windows-Fenster (im Beispiel ein BefehlsreferenzeintragFBGFX-Fenster) mit einem Icon in der Titelleiste versehen werden kann:

Icon in der Titelleiste

Variante 1 - Mit externer ICO-Datei

Dieser Code lädt das Icon für die Titelleiste aus einer ICO-Datei, die im Programmverzeichnis liegen muss. Diese ICO-Datei muss später ebenfalls weitergegeben werden, wenn das Programm verteilt wird.

#Include Once "windows.bi"

Screen 13
WindowTitle " <- standard.ico"
Print "push button ... "
Sleep
Cls

'------ Icon in der Titelleiste ------
Dim whandle As Integer
ScreenControl 2, whandle '2 = fb.GET_WINDOW_HANDLE
SendMessage (Cast (HWND, whandle), WM_SETICON, ICON_SMALL, _
Cast( Integer, LoadImage( GetModuleHandle (Null), "fblogo.ico", _
IMAGE_ICON, 0, 0, LR_LOADFROMFILE or LR_DEFAULTSIZE  ) ) )

WindowTitle " <- fblogo.ico"
Sleep

Variante 2 - ICO in EXE-Datei einbetten

Die erste Variante hat den Nachteil, dass das Icon als zusätzliche Datei weitergegeben werden muss, damit das Programm das Symbol laden kann. Um dies zu vermeiden, kann das Symbol auch in die Programmdatei (EXE) eingebettet werden. Dies geschieht über Ressourcendateien (Endung *.RC).
Legen Sie für dieses Code-Beispiel eine Datei namens demo2.rc in dem Verzeichnis an, in dem auch der Quelltext (*.BAS) gespeichert ist. Schreiben Sie folgenden Inhalt in die RC-Datei:

FB_PROGRAM_ICON ICON fblogo.ico

fblogo.ico ist der Dateiname des Icons, das nachher in der Titelleiste erscheinen soll. Bitte beachten Sie, dass auch diese ICO-Datei in dem Verzeichnis liegen muss, in dem sich auch BAS- und RC-Datei befinden!
Kompilieren Sie anschließend Ihr Programm über folgende Kommandozeile:

fbc -s gui demo2.rc meinProgramm.bas

Sollten Sie das Icon zur Programmlaufzeit wechseln wollen, können Sie stattdessen in die Ressourcendatei die Zeile

MY_ICON ICON fblogo.ico

einfügen und dieses Icon über folgenden Code "aktivieren":

#Include Once "windows.bi"

Screen 13
WindowTitle " <- standard.ico"
Print "push button ... "
Sleep
Cls

'------ Icon in der Titelleiste ------
Dim whandle As Integer
ScreenControl 2, whandle '2 = fb.GET_WINDOW_HANDLE
SendMessage (Cast (HWND, whandle), WM_SETICON, ICON_SMALL, _
Cast( Integer, LoadImage ( GetModuleHandle (Null), _
"MY_ICON", IMAGE_ICON, 0, 0, LR_COPYFROMRESOURCE  ) ) )

WindowTitle " <- fblogo.ico"
Sleep

Das Programm muss wieder mit Angabe der Ressourendatei compiliert werden:

fbc -s gui demo2.rc demo2.bas

demo2.bas wäre im Beispiel der Dateiname des obigen Quelltexts. Beim Kompilieren wird dann das Icon in die EXE-Datei "eingepackt". Es muss daher nicht mitgegeben werden, wenn Sie das Programm weiterverteilen.
Testweise können Sie nach dem Kompilieren Ihre ICO-Datei umbenennen (z. B. in fblogo123.ico). Wenn Sie anschließend die EXE-Datei ausführen, wird das Symbol (nach einem Tastendruck -> wegen BefehlsreferenzeintragSLEEP) dennoch in der Titelleiste erscheinen.
Wichtig:
Wenn es sich bei der ICOn-Datei um ein hochauflösendes Icon (32 x 32 und größer) handelt sollte statt ICON_SMALL die Konstante ICON_BIG verwendet werden.

(Dank an Sebastian für die Aufarbeitung meines wortkargen Beitrags :))

Variante 3 - Icon aus einem Programm 'ausleihen'

Hier habe ich als Beispiel das Icon von Paintbrush 'entliehen'.

#Include Once "windows.bi"
#Include Once "win/shellapi.bi"

Screen 13

'------ Icon in der Titelleiste ------
Dim As String Titel = " <- Neues Logo"
WindowTitle Titel

SendMessage (FindWindow (0, Titel), WM_SETICON, ICON_SMALL, _
Cast( LPARAM, ExtractIcon(0,"PBRUSH.EXE", 0)))

Sleep

Nachtrag 1: Icon in der Titelleiste der Console

Auch in der Titelzeile der Console kann das Icon ausgetauscht werden.
Man kann wieder beides, mit ICO-Datei oder Ressource-Datei arbeiten.

#Include Once "windows.bi"

'------ Icon in der Titelleiste ------
Dim As String ConsolenTitel = " <- fblogo.ico"
SetConsoleTitle ConsolenTitel

'mit ICOn-Datei
SendMessage (FindWindow (0, ConsolenTitel), WM_SETICON, ICON_SMALL, _
Cast( Integer, LoadImage( GetModuleHandle (0), "fblogo.ico", _
IMAGE_ICON, 0, 0, LR_LOADFROMFILE ) ) )

'mit Ressource-Datei
'SendMessage (FindWindow (0, ConsolenTitel), WM_SETICON, ICON_SMALL, _
'Cast( Integer, LoadImage( GetModuleHandle (0), "MY_ICON", _
'IMAGE_ICON, 0, 0, LR_COPYFROMRESOURCE ) ) )
Sleep

Für die Windowsversionen ab XP habe ich noch eine andere Möglichkeit gefunden:

#Include Once "windows.bi"
Extern "Windows"
Declare Function SetConsoleIcon(ByVal hicon As HICON ) As Integer
End Extern

'------ Icon in der Titelleiste ------
'mit ICOn-Datei
SetConsoleIcon (Cast( HICON, LoadImage ( GetModuleHandle (0), _
"fblogo.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE Or LR_DEFAULTSIZE) ) )
'mit Ressource-Datei
'SetConsoleIcon (Cast( HICON, LoadImage ( GetModuleHandle (0), _
'"MY_ICON", IMAGE_ICON, 0, 0, LR_COPYFROMRESOURCE  ) ) )
SetConsoleTitle " <- fblogo.ico"

Sleep

SetConsoleIcon ist eine undokumentierte Funktion und steckt erst ab WinXP in der Kernel32.dll.

Nachtrag 2: Icon in der Titelleiste des (echten) Windows

In einer Windowsaplikation gibt es immer eine Callback-Procedur in der die auftretenden Ereignisse für das Fenster abgearbeitet werden. Häufig wird diese Procedur "DialogProg" benannt. Dort kann unter dem Bereich WM_INITDIALOG ein Icon in der Titelleiste eingerichtet werden.

...
Function DialogProc( Byval hDlg As  HWND, _
  Byval uMsg As UINT, _
  Byval wParam As WPARAM, _
  Byval lParam As LPARAM ) As Integer

  Select Case uMsg
    Case WM_INITDIALOG
      ...
      '------ Icon in der Titelleiste
      'mit ICOn-Datei
      SendMessage (hDlg, WM_SETICON, ICON_SMALL, Cast( Dword, _
      LoadImage (GetModuleHandle (0), "fblogo.ico", _
      IMAGE_ICON, 0, 0, LR_LOADFROMFILE ) ) )
'--- oder ---
      'mit Ressource-Datei
      'SendMessage (hDlg, WM_SETICON, ICON_SMALL, Cast( Dword, _
      'LoadImage (GetModuleHandle (0), "MY_ICON", _
      'IMAGE_ICON, 0, 0, LR_COPYFROMRESOURCE) ) )
      ...

    Case WM_COMMAND
...


Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 03.12.2010 von RedakteurVolta angelegt.
  • Die aktuellste Version wurde am 02.02.2016 von Redakteurnemored gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen