Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [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!

Tutorial

Erste Schritte in der WinAPI mit Freebasic und FBEdit

von MitgliedstephanbrunkerSeite 5 von 13

Die Styles für unseren Dialog

WinTut16.jpg
Wir können eine ganze Reihe von Eigenschaften unserer Dialogbox direkt im Recourceneditor ändern. Neben den Identifiern wie Name , ID , Caption und Größe kann hier global die Schriftart geändert werden mit FONT. Die Buttons in der Titelzeile ändern sich mit MaxButton, MinButton und Popup oder insgesamt mit SYSMENU. Feste oder variable Größe geht mit SizeBorder, damit hängt auch der tatsächliche Rand zusammen, für Unterfenster geht es auch komplett ohne Buttons und ohne Rand. StartupPos bestimmt, wo das Fenster beim Programmstart erscheint und Child ist für unser Hauptfenster immer FALSE, während es für alle anderen Elemente auf diesem Fenster TRUE sein muss.

Das Element STATIC

Das einfachste Element ist der statische Text. Er hat nur eine caption. Na ja, außer man will eine andere Schriftart verwenden (was auch für die Editboxes gilt), dann wird es wieder interessant. Leider kann man bei einer Font keine absolute Höhe in Point oder Pixeln angeben, das wird von Windows relativ gehandhabt. Und man muss die gewünschte Schrift erst einmal erzeugen.

Dazu erzeugen wir eine shared - Variable in der Dialog.bi:

'Fonts
Dim Shared hLucida As HFONT         'Schrift Lucida

Dann rechnen wir die Point-Höhe in die relative Windows-Höhe um (man braucht dazu die GDI, aber das kann man auch abtippen ohne es zu verstehen) und erzeugen die gewünschte Schrift:

    Dim hdc1 As HDC = GetDC(NULL)
    Dim As Long lfheight = 10 * GetDeviceCaps(hdc1, LOGPIXELSY) \ 72
    releaseDC(NULL,hdc1)
    hLucida = CreateFont(lfHeight, 0, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, "Lucida Console")
    SendDlgItemMessage(hMain,IDC_EDT1,WM_SETFONT,Cast(wparam,hLucida),NULL)

In diesem Fall wollen wir Lucida Console in der Höhe 10 Pixel. Diesen Code Packen wir in das Ablaufprogramm hinter CreateDialogParam. In der DlgProc unter WM_INITDIALOG funktioniert hier nämlich nicht, da das Fenster zu diesem Zeitpunkt erst initialisiert wird und bestimmte Kommandos nicht annimmt. Ich mache deshalb einen guten Teil der Initialisierung an dieser Stelle vor der Messageloop. Keine Ahnung ob das guter Programmierstil ist, es funktioniert halt. CreateFont hat wie man sieht noch einen ganzen Haufen verschiedenster Parameter, auch hier hilft nur die MSDN. Am Programmende müssen wir die Schrift auch wieder freigeben, das geht entweder hinter der Messageloop oder in der WM_CLOSE oder WM_DESTROY Message mit

DeleteObject(hLucida)

Man sollte sich überhaupt darum bemühen, sauber zu programmieren und alles was man erzeugt bzw. Allocated hat auch wieder freigeben, das wird nachher noch ganz doll mit den Interfaces für Drag und Drop.

Bei einer Static können wir auch Vordergrund - und Hintergrundfarbe ändern. Das geht aber nicht einfach in den Voreinstellungen, und man muss schon etwas suchen und basteln um die Lösung zu finden. Da ich aber ein netter Tutor bin, des Rätsels Lösung hier, die WM_CTLCOLORSTATIC Message und lauffähiger Code:

        Case WM_CTLCOLORSTATIC
            Select Case lParam
                Case hSTC1
                    'Get the DC of the Static
                    Dim As HDC hdcStatic = Cast(HDC,wParam)
                    'Set Textcolor to our global Variable
                    SetTextColor(hdcStatic, &h000000FF)
                    'Set Background Color to Dialog Box Background Color:
                    SetBkColor(hdcStatic,GetSysColor(COLOR_3DFACE))
                    'return the brush for painting the rectangle
                    Return CInt(GetSysColorBrush(COLOR_3DFACE))
            End Select

Dazu auch noch ein paar Hinweise: Die TextColor ist klar, das ist die Textfarbe. BkColor ist die Farbe genau hinter den Buchstaben. Als dritten Wert gibt es nämlich noch die Farbe, die das Viereck unserer Static in der Resource einnimmt - und die wird durch den Return-Wert bestimmt. Alles ziemlich knifflig, wenn man es nicht weiß.

Das setzt natürlich voraus, dass wir wie vorher erwähnt eine shared-Variable in der Dialog.bi dimensioniert haben, auf die global innerhalb aller Funktionen zugegriffen werden kann, außerdem muss die ID definiert werden, die man sich sonst bei Statics sparen kann, wenn man nicht aktiv auf sie zugreifen muss:

#Define IDC_STC1 1004
Dim Shared As HWND hSTC1

und diese beim Programmstart abgefragen. Außerdem müssen wir noch sicherstellen, dass die Static auch neugezeichnet wird, denn nur dann wird die WM_CTLCOLORSTATIC Message verschickt. Dafür gibt es eine ganze Reihe von Möglichkeiten. Eine wäre, die Static beim Programmstart auf Visible = FALSE zu setzen und mit ShowWindow(hSTC1,SW_SHOW) zu zeigen. Die andere Möglichkeit ist, mit RedrawWindow ein Neuzeichnen zu erzwingen:

hSTC1 = GetDlgItem(hMain,IDC_STC1)
RedrawWindow(hSTC1,0,0,RDW_UPDATENOW Or RDW_INVALIDATE)

Dieser Code ist ein gutes Beispiel für Initialisierung, die im der WM_INITDIALOG nicht funktioniert. Wenn diese Message versendet wird, ist das Fenster nämlich noch nicht gezeichnet. Nimmt man aber die Message, die beim zeichnen des Fensters versendet wird, dann würde unser Code bei jedem Neuzeichnen ausgeführt und das ist auch nicht nötig. Meine Lösung baut diesen Code deshalb zwischen CreateDialogParam und der Messageloop ein.

Bei der Hintergrundfarbe in unserem Beispiel erfragen wir diese mit GetSysColor. Da wir einen Dialog ohne Fensterklasse haben (die kommt später), ist das nicht COLOR_BACKGROUND, sondern COLOR_3DFACE.

Eine weitere, ziemlich schräge Variante dieses Codes ist ein transparenter Hintergrund. Wenn man seinen Text auf ein Bild etc. zeichnen will, stellt man fest, das der Text wie gesagt immer eine Hintergrundfarbe hat:

WinTut8

Auch diesen Code musste ich erstmal in den Tiefen des Netzes aufspüren:

        Case WM_CTLCOLORSTATIC
            Select Case lParam
                Case hSTC1
                    Dim As HDC hdcStatic
                    'get the device Content for the Static
                    hdcStatic = Cast(HDC,wParam)
                    'set textcolor
                    SetTextColor(hdcStatic, &h0077FF77)
                    'set background mode
                    SetBkMode(hdcStatic,TRANSPARENT)
                    'return the brush for painting the static,
                    'StockObjectBrush need not to be freed
                    Return CInt(GetStockObject(HOLLOW_BRUSH))
            End Select

In der Rescource muss auch der ExStyle des Staticelementsauf WX_EX_TRANSPARARENT gesetzt sein, das geht mit einem Doppelklick auf den "xExStyle" - Eintrag.

Das Ergebnis sollte dann hoffentlich so aussehen:

WinTut10.jpg

Leider funktioniert die Transparenz nur ab Windows Vista mit den transparenten Designs. Das Rechteck ist übrigens ein SHAPE direkt aus der Werkzeugleiste.

Und wenn es nicht funktioniert, wie immer der Quellcode für den Schriftwechsel und die Static mit transparentem Hintergrund und geänderter Farbe: Externer Link!Tutorial4.zip

Nächste Seite: Messageboxes und Tooltips

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  6  7  8  9  10  11  12  13  
Zusätzliche Informationen und Funktionen
  Bearbeiten Bearbeiten  

  Versionen Versionen