API и FreeBasic. (дочерние окна-StatusBar)

Для вывода различной информации в окнах используют статусбар (или строка состояния). StatusBar может быть создан как простым, так и многопанельным (то есть разделенным на несколько частей).
Создается он так же как и любой другой простейший контрол с помощью CreateWindowEx и указанием класса "msctls_statusbar32"  . Для того чтобы установить подсказку для StatusBar можно указать стиль  SBT_TOOLTIPS и отослать контролу сообщение SB_SETTIPTEXT. При этом:

  • В параметре WPARAM нужно передать индекс частички StatusBar (для многопанельного) или 0 для простого контрола.
  • В параметр LPARAM  нужно передать адрес строки подсказки

Подсказка будет отображаться только в том случае, если текст StatusBar отображается не полностью (загорожен)

Для того, чтобы строка состояния автоматически изменяла свой размер в соответствии с размером окна, нужно в процедуре окна владельца , в событии WM_SIZE послать сообщение контролу WM_SIZE , при этом передать нули в WPARAM и LPARAM. Кстати при создании контрола , можно смело указывать нули для размеров контрола.

Пример простого контрола (я специально создал окно таких размеров, чтобы загородить надпись в StatusBar и тем самым активировать подсказку):

#INCLUDE "windows.bi"
#INCLUDE "win/commctrl.bi"
InitCommonControls()
Dim msg As MSG
Dim As WNDCLASSEX wc
Dim As String NameClass="MyClass"
Dim As HINSTANCE Hinst=GetModuleHandle(0)

Function wndproc(hwnd As HWND, msg As Uinteger,_
    wparam As WPARAM, lparam As LPARAM) As Integer
    Static statusbar As HWND
    Select Case msg
        Case WM_CREATE
            statusbar=CreateWindowEx(0,"msctls_statusbar32", _
            "Строка состояния или StatusBar",SBT_TOOLTIPS Or _
            WS_VISIBLE Or WS_CHILD,0,0,0,0,hwnd,Cast(HMENU,1),0,0)
            SendMessage(statusbar,SB_SETTIPTEXT, _
            0,@"Строка состояния или StatusBar")
        Case WM_DESTROY
            PostQuitMessage(0)
        Case WM_SIZE
            SendMessage(statusbar,WM_SIZE,0,0)
        Case Else
            Return DefWindowProc(hwnd,msg,wparam,lparam)
    End Select
End Function

With wc
    .cbSize=SizeOf(WNDCLASSEX)
    .style=CS_HREDRAW Or CS_VREDRAW
    .lpfnWndProc=@wndproc
    .hInstance=Hinst
    .hIcon=LoadIcon(0,IDI_QUESTION)
    .hCursor=LoadCursor(0,IDC_ARROW)
    .hbrBackground=Cast(HBRUSH,COLOR_WINDOW)
    .lpszClassName=StrPtr(NameClass)
    .hIconSm=.hIcon
End With

If RegisterClassEx(@wc)=0 Then
    Print "Register error, press any key"
    Sleep
    End
Endif

CreateWindowEx(0,NameClass,"Главное окно",_
WS_VISIBLE Or WS_OVERLAPPEDWINDOW, _
100,100,170,220,0,0,Hinst,0)

While GetMessage(@msg,0,0,0)
    TranslateMessage(@msg)
    DispatchMessage(@msg)
Wend

statusbar_api.png

Для того чтобы разделить контрол на частички, нужно послать ему сообщение SB_SETPARTS , при этом:

  • В параметре WPARAM нужно указать кол-во частей, а параметре LPARAM адрес массива, в котором располагаются размеры по ширине каждой частички. Если указать в массиве размер -1 , то до конца ширины контрола. 

Для того чтобы вывести текст в какую-нибудь часть , нужно послать сообщение SB_SETTEXT , при этом :

  • В параметре WPARAM нужно указать номер части, а параметре LPARAM адрес на строку.

Для того, чтобы установить иконку в StatusBar, нужно послать контролу сообщение SB_SETICON, при этом :

  • В параметре WPARAM нужно указать номер части, а параметре LPARAM хендл иконки.

Я не стал ничего выдумывать, а просто решил вытащить иконку из файла DLL , находящегося в системном каталоге с помощью функции ExtractIcon. У этой функции три параметра:

  • Экземляр приложения , вызывающий функцию .В нашем случае, мы вызываем из нашего EXE файла, поэтому этот параметр можно занулить
  • Указатель имени исполняемого файла или DLL
  • Индекс иконки , по которому она располагается в файле, из которого вытаскивается

Для того чтобы использовать функцию  ExtractIcon, нужно подключить файлик shellapi.bi

Вот пример (в сущности это первый пример, только чуть подправленный):

#INCLUDE "windows.bi"
#INCLUDE "win/shellapi.bi"
#INCLUDE "win/commctrl.bi"
InitCommonControls()
Dim msg As MSG
Dim As WNDCLASSEX wc
Dim As String NameClass="MyClass"
Dim As HINSTANCE Hinst=GetModuleHandle(0)
' функция класса
Function wndproc(hwnd As HWND, msg As Uinteger,_
    wparam As WPARAM, lparam As LPARAM) As Integer
    Static statusbar As HWND
    Select Case msg
        Case WM_CREATE
            Dim M(1) As Integer={30,-1}
            Static As String*20 s1 = "1 частичка",s2 = "2 частичка"
            statusbar=CreateWindowEx(0,"msctls_statusbar32", _
            "Строка состояния или StatusBar",SBT_TOOLTIPS Or _
            WS_VISIBLE Or WS_CHILD,0,0,0,0,hwnd,Cast(HMENU,1),0,0)
            SendMessage(statusbar,SB_SETTIPTEXT, _
            0,Cast(LPARAM,@"Строка состояния или StatusBar"))
            SendMessage(statusbar, SB_SETPARTS,2, Cast(LPARAM,@M(0)))
            SendMessage(statusbar, SB_SETTEXT ,0,Cast(LPARAM,@s1))
            SendMessage(statusbar, SB_SETTEXT ,1,Cast(LPARAM,@s2))
            SendMessage(statusbar, SB_SETICON ,1, _
            ExtractIcon(0,"Shell32.dll",26))
            SendMessage(statusbar,SB_SETTIPTEXT, _
            0,Cast(LPARAM,@s1))
        Case WM_DESTROY
            PostQuitMessage(0)
        Case WM_SIZE
            SendMessage(statusbar,WM_SIZE,0,0)
        Case Else
            Return DefWindowProc(hwnd,msg,wparam,lparam)
    End Select
End Function

With wc
    .cbSize=SizeOf(WNDCLASSEX)
    .style=CS_HREDRAW Or CS_VREDRAW
    .lpfnWndProc=@wndproc
    .hInstance=Hinst
    .hIcon=LoadIcon(0,IDI_QUESTION)
    .hCursor=LoadCursor(0,IDC_ARROW)
    .hbrBackground=Cast(HBRUSH,COLOR_WINDOW)
    .lpszClassName=StrPtr(NameClass)
    .hIconSm=.hIcon
End With

If RegisterClassEx(@wc)=0 Then
    Print "Register error, press any key"
    Sleep
    End
Endif

CreateWindowEx(0,NameClass,"Главное окно",_
WS_VISIBLE Or WS_OVERLAPPEDWINDOW, _
100,100,170,220,0,0,Hinst,0)

While GetMessage(@msg,0,0,0)
    TranslateMessage(@msg)
    DispatchMessage(@msg)
Wend

StatusBar_api1.png

И под конец сообщения, которые можно посылать контролу:

  • SB_GETBORDERS - получение ширины горизонтальной и вертикальной рамки окна Statusbar.
  • SB_GETICON - получение установленной иконки из контрола
  • SB_GETPARTS - получение количества частей в statusbar и координат правых границ этих областей.
  • SB_GETRECT - получение границ заданной части в окне Statusbar.
  • SB_GETTEXT - получение текста из указанной части окна статуса.
  • SB_GETTEXTLENGTH - получение длины в символах текста из указанной части окна статуса.
  • SB_GETTIPTEXT - получение текста подсказки
  • SB_GETUNICODEFORMAT - проверка установки флага Unicode
  • SB_ISSIMPLE - проверка режима контрола
  • SB_SETBKCOLOR - установка цвета фона контрола
  • SB_SETICON - установка иконки в контрол
  • SB_SETMINHEIGHT -
  • SB_SETPARTS - разделение панели на части
  • SB_SETTEXT - установка текста в контрол
  • SB_SETTIPTEXT - установка подсказок
  • SB_SETUNICODEFORMAT - Устанавливает флаг формата Unicode для символов контрола.
  • SB_SIMPLE - Переключение режимов контрола Statusbar (многопанельный или однопанельный)

Более расширенную информацию по сообщениям можно получить ЗДЕСЬ

содержание | назад | вперед