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
Для того чтобы разделить контрол на частички, нужно послать ему сообщение 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
И под конец сообщения, которые можно посылать контролу:
- 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 (многопанельный или однопанельный)
Более расширенную информацию по сообщениям можно получить ЗДЕСЬ
содержание | назад | вперед