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!

Tutorial

Erste Schritte in der WinAPI mit Freebasic und FBEdit

von MitgliedstephanbrunkerSeite 6 von 13

Messageboxes

Messageboxes lassen sich ganz einfach aufrufen:

MessageBox(hWin,"Nachricht im Fenster","Titel",MB_OK + MB_ICONERROR)

Externer Link!MessageBox in der MSDN
Man übergibt der Funktion den Handle zum MainWindow, den gewünschten Text und Titel und die Optionen, mit denen man das Layout steuern kann. Das Programm wartet dann auf die Usereingabe und gibt einen entsprechenden Returnwert als Integer zurück, wie und was genau muss man in der MSDN nachlesen ... falls ich es nicht schon erwähnt habe. Man kann die Funktion natürlich auch in einer IF- oder Select Case Abfrage ausführen:

If FileExists(dateipfad) Then
    Select Case MessageBox(hWin,_
            filetitle & ".ass ist bereits vorhanden" & Chr(13,10) & "Möchten Sie sie ersetzen?",_
            "Speichern unter bestätigen",_
            MB_YESNO + MB_DEFBUTTON2 + MB_ICONWARNING)
        Case IDYES                     'oder 6
            Kill dateipfad
        Case IDNO                      'oder 7
            dateipfad = ""
    End Select
EndIf

Das wäre so die klassische Datei-überschreiben-Messagebox, die der Explorer auch verwendet:

WinTut11.jpg

Tooltips

Das nächste Thema ist dann schon etwas komplexer: Die hilfreichen Tooltips, die dem User eine Direkthilfe geben wenn er über einem Schaltelement mit der Maus verweilt.

In dem Fall brauchen wir auch unsere erste Helperfunction, die wir entweder deklarieren müssen oder einfacherweise vor die DlgProc ins Programm schreiben:

Function CreateToolTip(hDlg As HWND, toolID As Integer, pszText As PTSTR) As HWND
    Dim As HWND hwndTool, hwndTip

    hwndTool = GetDlgItem(hDlg, toolID)
    hwndTip = CreateWindowEx(NULL, _
                                    TOOLTIPS_CLASS, _
                                    NULL, _
                                    WS_POPUP Or TTS_ALWAYSTIP,_ 'OR TTS_BALLOON für Sprechblase über Control
                                    CW_USEDEFAULT,_
                                    CW_USEDEFAULT,_
                                    CW_USEDEFAULT,_
                                    CW_USEDEFAULT,_
                                    hDlg,_
                                    NULL,_
                                    hInstance,_
                                    NULL)

    SendMessage(hWndTip,TTM_SETMAXTIPWIDTH,NULL,150)         'Enables Multi-Line Tooltips, last Argument is width

    Dim toolInfo As TOOLINFO
    With toolInfo
        .cbsize = SizeOf(toolInfo)
        .hwnd   = hDlg
        .uFlags = TTF_IDISHWND Or TTF_SUBCLASS
        .uId    = Cast(UINT_PTR,hwndTool)
        .lpszText = pszText
    End With

    SendMessage(hwndTip,TTM_ADDTOOL,0,Cast(Lparam,@toolInfo))

    Return hwndTip

End Function

Die Funktion erstellt zu einem bestimmten Schaltelement (die wir ja in der Dialog.bi definiert haben) einen Tooltip. Weil dieser im Prinzip ja auch nur ein Window ist, die CreateWindowEx - Funktion. Es gibt zwei Sorten der Tooltips: die quadratischen unter der Maus, und die Sprechblasen über dem Cursor, die mit einem zusätzlichen OR TTS_BALLOON gesteuert werden. Zu den Styles noch eine Anmerkung: Windows speichert hier jede Menge Varianten in einer INTEGER-Variable, und zwar abhängig davon, welches Bit gesetzt ist. Wenn wir also mehrere Varianten haben möchten, dann können wir die einzelnen Werte einfach mit OR kombinieren. Hier begegnet uns auch die erste Struktur, in dem Fall TOOLINFO, wie unschwer zu erkennen ist ein UDT, in dem die notwendigen Informationen für die TTM_ADDTOOL Message gespeichert werden. Die Werte gibt man am elegantesten und im Code übersichtlichsten mit WITH ein. Manche Strukturen verlangen auch nach ihrer Größe, die man mit SizeOf() erfragen kann.

Dann müssen wir die Tooltips natürlich noch erzeugen, das geht am besten im WM_INITDIALOG - Abschnitt der DlgProc. Für jedes Element müssen wir die CreateToolTip - Funktion dann aufrufen und den gewünschten Text eingeben:

            CreateToolTip(hWin, IDC_BTN1, @"Das ist ein Button")
            CreateToolTip(hWin,IDC_EDT1, @("Editbox" & Chr(13,10) & "Text hier eingeben") )
'same Result:   CreateToolTip(hWin,IDC_EDT1, @(!"Editbox \r\n Text hier eingeben") )

                        ...

Ich habe den Code direkt mal um die Möglichkeit mehrzeiliger Tooltips ergänzt, das ist die TTM_SETMAXTIPWIDTH Message, deren LPARAM die Breite des Tooltips vorgibt. Den Umbruch erzeugt man dann mit Chr(13,10) oder man aktiviert die Escapezeichen mit dem !- Operator und \r\n .

So sollte es dann aussehen:

WinTut12.jpg

Der lauffähige Code in der gleichen Datei wie vorher: Externer Link!Tutorial4.zip

Weiter geht es mit den Aufklappfeldern, den Comboboxen ...

 

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