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

Наверное ни один качественный на сегодня текстовый редактор не обходится без такого важного компонента интерфейса как тулбар (ToolBar). Еще с древних Windows удобным интерфейсом считался набор из меню + тулбар. Пример части интерфейса редактора FbEdit:

toolbar.png

На тулбар обычно размещают часто используемые кнопки, а все вскопе можно найти в меню. И конечно очень приветствуется пользователем, когда панель тулбара настраивается.

Сам по себе тулбар - это набор кнопок. Для каждой кнопки есть возможность по желанию установить текст и битовый образ. И для лучшей адаптации пользователя к программе , для каждой кнопки обычно устанавливается подсказка.

Способ создания тулбара делится как минимум на две составных части:

  1. Создание и заполнение массива кнопок с типом структуры TBBUTTON
  2. Создание окна тулбара с помощью специализированной функции CreateToolbarEx

Кроме CreateToolbarEx можно использовать привычную функцию для создания окон CreateWindowEx с последующей отправкой сообщений для инициализации различных аспектов панели инструментов.

Параметры функции CreateToolbarEx таковы:

CreateToolbarEx( _
    hwnd As HWND,_ 'хендл окна родителя 
    ws As DWORD,_ 'стиль окна   
    wID As UINT,_ ' идентификатор тулбара   
    nBitmaps As Integer,_ 'кол-во пиктограмм    
    hBMInst As HINSTANCE,_ 'идентификатор приложения    
    wBMID As UINT,_ 'дескриптор экземпляра модуля исполняемого файла, который содержит растровые ресурсы. 
    lpButtons As LPCTBBUTTON,_  'адрес массива кнопок с типом TBBUTTON
    iNumButtons As Int,_ 'количество кнопок 
    dxButton As Integer,_ 'ширина кнопок    
    dyButton As Integer,_ 'высота кнопок    
    dxBitmap As Integer,_ 'ширина пиктограмм    
    dyBitmap As Integer,_ 'высота пиктограмм    
    uStructSize As UINT _ 'размер структуры в байтах    
    )

Структура TBBUTTON выглядит так:

Type TBBUTTON 
  iBitmap As Integer ' индекс изображения
  idCommand As Integer ' идентификатор кнопки 
  fsState As Byte ' состояние кнопки
  fsStyle As Byte ' стиль кнопки
  dwData As Integer ' дополнительные данные о кнопке
  iString As Integer ' номер текстовой строки   
End Type

  1. iBitmap - индекс образа битмапа может быть как стандартным, так и получаемым из списка изображений, который перед этим необходимо создать с помощью ImageList_Create ( создание списка изображений расматривалось в статье про ComboBox). Стандартные битовые образы зависят от 6 параметра функции CreateToolbarEx:

    IDB_HIST_SMALL_COLOR или IDB_HIST_LARGE_COLOR
    (0) HIST_BACK (назад)
    (1) HIST_FORWARD (вперед)
    (2) HIST_FAVORITES (Открыть папку "Избранное")
    (3) HIST_ADDTOFAVORITES (Добавить в избранное)
    (4) HIST_VIEWTREE (Просмотр каталога(дерева))

    IDB_STD_SMALL_COLOR или IDB_STD_LARGE_COLOR
    (0)STD_CUT ; Cut operation. (вырезать)
    (1)STD_COPY Copy operation (копировать)
    (2)STD_PASTE Paste operation.(Вставить)
    (3)STD_UNDO Undo operation. (Отменить)
    (4)STD_REDOW Redo operation. (Вернуть)
    (5)STD_DELETE Delete operation. (Удалить)
    (6)STD_FILENEW New file operation. (Новый файл)
    (7)STD_FILEOPEN Open file operation. (Открыть файл)
    (8)STD_FILESAVE Save file operation. (Сохранить файл)
    (9)STD_PRINTPRE Print preview operation. (Версия для печати)
    (10)STD_PROPERTIES Properties operation. (Свойства)
    (11)STD_HELP Help operation. (Помощь)
    (12)STD_FIND Find operation. (Поиск)
    (13)STD_REPLACE Replace operation. (Замена)
    (14)STD_PRINT Print operation. (Печать)

    IDB_VIEW_LARGE_COLOR или IDB_VIEW_SMALL_COLOR
    (0) VIEW_LARGEICONS Просмотр больших иконок
    (1) VIEW_SMALLICONS Просмотр маленьких иконок
    (2) VIEW_LIST Просмотр списка
    (3) VIEW_DETAILS Информация о просмотре
    (4) VIEW_SORTNAME Сортировка по имени
    (5) VIEW_SORTSIZE Сортировка по размеру
    (6) VIEW_SORTDATE Сортировка по дате
    (7) VIEW_SORTTYPE Сортировка по типу
    (8) VIEW_PARENTFOLDER Перейти в родительскую папку
    (9) VIEW_NETCONNECT Подключение к сетевому диску
    (10) VIEW_NETDISCONNECT Отключение от сетевого диска
    (11) VIEW_NEWFOLDER Перейти в новую папку

    В скобках вначале строки указывается реальное значение констант

  2. idCommand - ID кнопки. Именно по этому присвоенному значению можно будет определять клики по какой-либо кнопке тулбара в сообщении WM_COMMAND
  3. fsState - Видимое состояние кнопки
    TBSTATE_CHECKED - Кнопка стиля флажок находится в нажатом состоянии
    TBSTATE_PRESSED - Кнопка любого стиля находится в нажатом состоянии
    TBSTATE_ENABLED - Кнопка доступна
    TBSTATE_HIDDEN - Скрытая кнопка
    TBSTATE_INDETERMINATE - Кнопка отображается серым цветом
    TBSTATE_WRAP - Если тулбар имеет стиль TBSTYLE_WRAPABLE , то кнопки , находящиеся после кнопки , имеющей это состояние, отображаются в новой строке.
  4. fsStyle - стиль кнопок тулбара
    TBSTYLE_BUTTON - стандартная кнопка
    TBSTYLE_SEP - разделитель для создания пространства между кнопками или для сохранения места под дочерние элементы (combobox например).
    TBSTYLE_CHECK - кнопка двух состояний (может находится в нажатом или отжатом состоянии)
    TBSTYLE_GROUP - кнопки с этими стилями способны переключаться подобно триггеру. В один момент будет нажата только одна из группы кнопок с этим стилем
    TBSTYLE_CHECKGROUP - объединяет свойства стилей TBSTYLE_CHECK и TBSTYLE_GROUP
  5. dwData - дополнительные данные (свойства), которые при желании может добавить программист для каждой кнопки
  6. iString - номер строки в буфере, строки при этом должны быть разделены нулевым символом, а после последней строки два нулевых символа, как знак окончания буфера. При использовании буфера строк, контролу должно быть отправлено сообщение TB_ADDSTRING , при этом в параметре LPARAM должен быть указатель на буфер.

А теперь пример:

#INCLUDE "windows.bi"
#INCLUDE "win/commctrl.bi"
Dim msg As MSG
Dim As WNDCLASSEX wc
Dim As String NameClass="MyClass"
Dim As HINSTANCE Hinst=GetModuleHandle(0)
Dim Shared As String sButtons
sButtons =  "CUT" & Chr(0) & _
"COPY" & Chr(0) & _
"PASTE" & Chr(0) & _
"UNDO" & Chr(0) & _
"REDO" & Chr(0) & _
"DELETE" & Chr(0) & _
"NEW" & Chr(0) & Chr(0)

Function wndproc(hwnd As HWND, msg As Uinteger,_
    wparam As WPARAM, lparam As LPARAM) As Integer
    Static As HWND hwndToolbar
    Select Case msg
        Case WM_CREATE
            Dim ttb(6) As TBBUTTON
            For i As Integer = 0 To 6
                If i = 3 Then
                    ttb(i).iBitmap = 0
                    ttb(i).idCommand = i
                    ttb(i).fsState = TBSTATE_ENABLED
                    ttb(i).fsStyle = TBSTYLE_SEP 
                    ttb(i).iString = 0
                Else
                    ttb(i).iBitmap = i
                    ttb(i).idCommand = i+1
                    ttb(i).fsState = TBSTATE_ENABLED
                    ttb(i).fsStyle = TBSTYLE_BUTTON
                    ttb(i).iString = i
                Endif

            Next
            hwndToolbar = CreateToolbarEx(hwnd,_
            WS_CHILD+WS_VISIBLE+TBSTYLE_LIST+_
            WS_CLIPSIBLINGS+CCS_TOP+TBSTYLE_TOOLTIPS,_
            0,0,HINST_COMMCTRL,_
            IDB_STD_SMALL_COLOR,_
            @ttb(0),7,0,0,0,0,Sizeof(TBBUTTON))
            SendMessage(hwndToolbar,TB_ADDSTRING,0,Cast(Lparam,Sadd(sButtons)))
        Case WM_NOTIFY
            Dim As LPNMHDR pnm = Cast( LPNMHDR,lParam)
            If pnm->code = TTN_GETDISPINFO Then
                Dim As LPNMTTDISPINFO pdi = Cast(LPNMTTDISPINFO,pnm)
                Dim As ZString*16 szText
                SendMessage(hwndToolbar,TB_GETBUTTONTEXT,pdi->hdr.idFrom,Cast(Lparam,@szText))
                pdi->szText = szText
            Endif
        Case WM_COMMAND
            Select Case Loword(WPARAM)
                Case 1 To 7
                    MessageBox(0,"Button " & Loword(WPARAM),"",0)
            End Select
        Case WM_DESTROY
            PostQuitMessage(0)
    End Select
    Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function

With wc
    .cbSize=SizeOf(WNDCLASSEX)
    .style=CS_HREDRAW Or CS_VREDRAW
    .lpfnWndProc=@wndproc
    .hInstance=Hinst
    .hIcon=LoadIcon(0,IDI_WINLOGO)
    .hCursor=LoadCursor(0,IDC_ARROW)
    .hbrBackground=Cast(HBRUSH,COLOR_WINDOWFRAME)
    .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,420,100,0,0,Hinst,0)

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

toolbar2.png

В этом примере создается тулбар с кнопками , строками и подсказками. Для буфера строк выбрана переменная sButtons, которую после создания контрола мы прикрепляем к нему с помощью сообщения TB_ADDSTRING. Перед вызовом создания контрола, заполняется массив ttb в цикле. Что касается стилей кнопок тулбара, то все кнопки у нас стандартные, видимые, малого размера. Четвертой кнопкой (3 индекс в массиве) определен сепаратор(разделитель). Подсказка (tooltip) для кнопок определена в сообщении WM_NOTIFY. Как только мышь задерживается над кнопкой, имеющей подсказку в течении 1 секунды, поступает сообщение WM_NOTIFY в процедуру окна владельца тулбара с кодом уведомления TTN_GETDISPINFO. При этом в параметре LPARAM оказывается указатель на структуру NMTTDISPINFO. Для того чтобы подсказка отображалась, надо в одно из полей структуры (szText) записать нужную строку. У нас это текстовая строка , которую мы получаем из кнопки тулбара с помощью сообщения TB_GETBUTTONTEXT. При использовании этого сообщения надо в параметр WPARAM передать идентификатор кнопки, а в параметр LPARAM передать выделенный строковой буфер. Получение событий (кликов) от кнопок тулбара ничем не отличается от обычных кнопок. То есть ловим событие WM_COMMAND и в младшем слове проверяем идентификатор кнопки...

Как я и говорил, для пользователя будет удобно , если ему будет предоставлена свобода выбора нужных кнопок на тулбаре. Конечно право программиста делать или нет такую возможность. В некоторых случаях такая возможность может быть совсем не к месту, но в любом случае знать как это можно сделать не помешает.

И так для того чтобы была возможность переносить\удалять\добавлять кнопки тулбара по его поверхности необходимы следующие условия:

  • При создании тулбара указать стиль CCS_ADJUSTABLE
  • В сообщении WM_NOTIFY обрабатывать коды извещения TBN_GETBUTTONINFO , TBN_QUERYINSERT , TBN_TOOLBARCHANGE , TBN_QUERYDELETE

В событиях TBN_QUERYINSERT и TBN_QUERYDELETE можно устанавливать обработку только нужных кнопок , во всех остальных случаях возвращать FALSE

В событии TBN_TOOLBARCHANGE необходимо обновить (перерисовать тулбар). Сделать это можно , послав сообщение TB_AUTOSIZE контролу.

В событии TBN_GETBUTTONINFO нужно заполнять присланную структуру TBNOTIFY данными из нашего массива с типом TBBUTTON

И конечно пример:

#INCLUDE "windows.bi"
#INCLUDE "win/commctrl.bi"

#DEFINE TBN_TOOLBARCHANGE TBN_FIRST-8
#DEFINE TBN_QUERYINSERT TBN_FIRST-6
#DEFINE TBN_QUERYDELETE TBN_FIRST-7
' в заголовке ошибка объявления TBN_GETBUTTONINFO
'поэтому объявим сами
#Undef TBN_GETBUTTONINFO 
#DEFINE TBN_GETBUTTONINFO TBN_FIRST

Dim msg As MSG
Dim As WNDCLASSEX wc
Dim As String NameClass="MyClass"
Dim As HINSTANCE Hinst=GetModuleHandle(0)
Dim Shared ttb(5) As TBBUTTON
Dim Shared As String sButtons
sButtons =  "CUT" & Chr(0) & _
"COPY" & Chr(0) & _
"PASTE" & Chr(0) & _
"UNDO" & Chr(0) & _
"REDO" & Chr(0) & _
"DELETE" & Chr(0) & Chr(0)

Function wndproc(hwnd As HWND, msg As Uinteger,_
    wparam As WPARAM, lparam As LPARAM) As Integer
    Static As HWND hwndToolbar
    Select Case msg
        Case WM_CREATE
            For i As Integer = 0 To 5
                    ttb(i).iBitmap = i
                    ttb(i).idCommand = i+1
                    ttb(i).fsState = TBSTATE_ENABLED
                    ttb(i).fsStyle = TBSTYLE_BUTTON
                    ttb(i).iString = i
            Next
            hwndToolbar = CreateToolbarEx(hwnd,_
            WS_CHILD+WS_VISIBLE+TBSTYLE_LIST+_
            WS_CLIPSIBLINGS+CCS_TOP+TBSTYLE_TOOLTIPS+CCS_ADJUSTABLE,_
            0,0,HINST_COMMCTRL,_
            IDB_STD_SMALL_COLOR,_
            @ttb(0),6,0,0,0,0,Sizeof(TBBUTTON))
            SendMessage(hwndToolbar,TB_ADDSTRING,0,Cast(Lparam,Sadd(sButtons)))
        Case WM_NOTIFY
            Dim As LPNMHDR pnm = Cast( LPNMHDR,lParam)
            If pnm->code = TTN_GETDISPINFO Then
                Dim As LPNMTTDISPINFO pdi = Cast(LPNMTTDISPINFO,pnm)
                Dim As ZString*16 szText
                SendMessage(hwndToolbar,TB_GETBUTTONTEXT,pdi->hdr.idFrom,Cast(Lparam,@szText))
                pdi->szText = szText
                Return TRUE
            Elseif pnm->code = TBN_GETBUTTONINFO Then
                Dim As TBNOTIFY Ptr tbn = Cast(TBNOTIFY Ptr,pnm)
                Dim As Integer nItem = tbn->iItem
                If nItem<=5 Then
                    tbn->tbButton.iBitmap   = ttb(nItem).iBitmap
                    tbn->tbButton.idCommand = ttb(nItem).idCommand
                    tbn->tbButton.fsState   = ttb(nItem).fsState
                    tbn->tbButton.fsStyle   = ttb(nItem).fsStyle
                    tbn->tbButton.dwData    = ttb(nItem).dwData
                    tbn->tbButton.iString   = ttb(nItem).iString
                    Return TRUE
                Endif
                Return FALSE
            Elseif pnm->code = TBN_QUERYINSERT Then
                Return true
            Elseif pnm->code = TBN_TOOLBARCHANGE Then
                SendMessage(hwndToolbar, TB_AUTOSIZE, 0, 0)
                Return TRUE
            Elseif pnm->code = TBN_QUERYDELETE Then
                Return true
            Endif
        Case WM_COMMAND
            Select Case Loword(WPARAM)
                Case 1 To 6
                    MessageBox(0,"Button " & Loword(WPARAM),"",0)
            End Select
        Case WM_DESTROY
            PostQuitMessage(0)
    End Select
    Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function

With wc
    .cbSize=SizeOf(WNDCLASSEX)
    .style=CS_HREDRAW Or CS_VREDRAW
    .lpfnWndProc=@wndproc
    .hInstance=Hinst
    .hIcon=LoadIcon(0,IDI_WINLOGO)
    .hCursor=LoadCursor(0,IDC_ARROW)
    .hbrBackground=Cast(HBRUSH,COLOR_WINDOWFRAME)
    .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,430,100,0,0,Hinst,0)

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

toolbar3.png

Для того чтобы вызвать такую диалоговую панель, нужно сделать двойной щелчок по свободному месту в панели тулбара. Для того, чтобы не вызывая подобную панель, перемещать кнопки по панели тулбара, достаточно зажать SHIFT и мышью переносить кнопки в любое место панели. Так же можно легко удалить кнопку, достаточно перенести ее за пределы окна.

В этом примере, в начале сделано несколько объявлений констант, которых нет в заголовках. Далее при заполнении массива я исключил разделитель, чтобы не заморачиваться с лишними проверками в событии WM_NOTIFY

При поступлении сообщения WM_NOTIFY , система присылает нам указатель на структуру TBNOTIFY. Ее нам нужно заполнить при поступлении извещения TBN_GETBUTTONINFO, если мы хотим добавлять кнопки. У нас в примере разрешены изменения всех кнопок , то есть в кодах извещения TBN_QUERYINSERT и TBN_QUERYDELETE возвращается TRUE. Если какие-то кнопки надо защитить от изменений, достаточно так же, как и в коде извещения TBN_GETBUTTONINFO (см. пример) создать переменную-указатель на структуру TBNOTIFY , выудить оттуда номер изменяемой ячейки. И если кнопка с этим номером должна быть защищена от изменений, возвратить FALSE

Дополнительно:

Стили, которые можно устанавливать для ToolBar:

  1. TBSTYLE_TOOLTIP - Возможность установки подсказки Tool Tip
  2. TBSTYLE_ALTDRAG - Возможность передвигать кнопки тулбара по его поверхности с помощью клавиши Alt и кнопки мыши. Если этот стиль не установлен, то по умолчанию перетаскивается с помощью клавиши SHIFT и кнопки мыши. В обязательном порядке должен быть установлен стиль CCS_ADJUSTABLE
  3. TBSTYLE_WRAPABLE - При установке этого стиля Toolbar может состоять из нескольких строк при условии, что кнопки не помещаются на одной строчке.
  4. TBSTYLE_LIST - При установке этого стиля строки располагаются сбоку от изображения
  5. TBSTYLE_FLAT - При установке этого стиля создается плоская панель инструментов.
  6. CCS_ADJUSTABLE - При установке этого стиля появляется возможность изменять конфигурацию органа управления
  7. CCS_BOTTOM - При установке этого стиля тулбар помещается в нижней части окна.
  8. CCS_TOP - При установке этого стиля тулбар помещается в верхней части окна.
  9. CCS_NODIVIDER - При установке этого стиля запрещается рисовать двухпиксельную разделительную линию в верхней части тулбара
  10. CCS_NOHILITE - При установке этого стиля запрещается рисовать однопиксельную выделяющую линию в верхней части тулбара
  11. CCS_NOMOVEY - В сообщении WM_SIZE у тулбара будут горизонтальные размеры с возможностью передвижения по горизонтали, с сохранением вертикальных размеров
  12. CCS_NOPARENTALIGN - При установке этого стиля запрещается автоматически перемещаться в верхнюю или нижнюю часть родительского окна
  13. CCS_NORESIZE - При установке начальных размеров не будут использоваться размеры, заданные по умолчанию. Приложение должно задать размеры органа управления явным образом
  14. CCS_RIGHT - При установке этого стиля тулбар помещается в правой части окна.
  15. CCS_LEFT - При установке этого стиля тулбар помещается в левой части окна.

Тулбар посылает родительскому окну сообщения WM_COMMAND и WM_NOTIFY. Что касается WM_COMMAND , то обработка его ничем не отличается от обработки других контролов, например простых кнопок. Но сообщение WM_NOTIFY используется для многих контролов (TreeView, ListView, Tooltip, ToolBar...) , хотя обработка обнообразна (что хорошо само по себе). Принцип прост: Как только родительское окно получает это сообщение, в его параметре WPARAM будет идентификатор контрола, отправившего это сообщение. Однако Микрософт сама тут же оговаривается: данный параметр не может служить 100% гарантией определения идентификатора. Так что мы забудем про параметр WPARAM и приступим к рассмотрению параметра LPARAM. В параметре LPARAM окажется структура NMHDR или другая большего размера, но имеющая в своем начале поля структуры NMHDR (для тулбара мы применяли TBNOTIFY и NMTTDISPINFO). Как раз структура NMHDR может рассказать нам и о хендле и о идентификаторе контрола, пославшего сообщение:

Type NMHDR
    hwndFrom As HWND ' хендл конрола
    idFrom As UINT ' ID конрола
    code As UINT ' код извещения
End Type


Код извещения, переданный в третьем параметре NMHDR может быть одним из:

  1. NM_CLICK - Пользователь нажал левую кнопку мыши в элементе управления.
  2. NM_DBLCLK - Пользователь дважды щелкнул левой кнопкой мыши в элементе управления.
  3. NM_KILLFOCUS - Контрол потерял фокус ввода.
  4. NM_OUTOFMEMORY - Управление не может завершить операцию, так как не было достаточного объема свободной памяти.
  5. NM_RCLICK - Пользователь щелкнул правой кнопкой мыши в элементе управления.
  6. NM_RDBLCLK - Пользователь щелкнул двойным щелчком правой кнопкой мыши в элементе управления.
  7. NM_RETURN - Контрол имеет фокус ввода и пользователь нажал клавишу ENTER.
  8. NM_SETFOCUS - Контрол получил фокус ввода.

Так же для разных контролов предусмотрены дополнительные коды извещения. Некоторые коды для тулбара:

  1. TBN_BEGINADJUST - Пользователь приступил к настройке Toolbar
  2. TBN_BEGINDRAG - Пользователь начал передвигать кнопку по поверхности Toolbar
  3. TBN_ENDADJUST - Пользователь закончил настройку Toolbar
  4. TBN_ENDDRAG - Пользователь закончил передвижение кнопки по поверхности Toolbar
  5. TBN_CUSTHELP - Пользователь нажал кнопку "Help" в диалоговой панели, которая была вызвана для настройки Toolbar
  6. TBN_GETBUTTONINFO - Это извещение окно Toolbar посылает в том случае, если ему нужна информация об одной из кнопок
  7. TBN_QUERYDELETE - С помощью этого извещения окно Toolbar запрашивает возможность удаления кнопки в процессе настройки
  8. TBN_QUERYINSERT - С помощью этого извещения окно Toolbar запрашивает возможность вставки новой кнопки слева от указанной в процессе настройки
  9. TBN_RESET - Пользователь нажал кнопку "Reset" в диалоговой панели, которая была вызвана для настройки Toolbar
  10. TBN_TOOLBARCHANGE - Пользователь изменил внешний вид Toolbar в результате выполнения настройки

Все извещения, а так же их обработку можно посмотреть ЗДЕСЬ

Некоторые сообщения для ToolBar:

  1. TB_ADDBITMAP - Добавление одного или нескольких изображений к списку изображений органа управления Toolbar
  2. TB_ADDBUTTONS - Добавление кнопок к органу управления Toolbar
  3. TB_ADDSTRING - Добавление новых текстовых строк в список органа управления Toolbar
  4. TB_AUTOSIZE - Посылается для автообновления тулбара после изменения
  5. TB_BUTTONCOUNT - Возвращает количество кнопок, добавленных в него с момента создания
  6. TB_BUTTONSTRUCTSIZE - Возвращает размер структуры TBBUTTON
  7. TB_CHANGEBITMAP - Замена изображения на поверхности кнопки.
  8. TB_CHECKBUTTON - Для переключения кнопки из отжатого состояния в нажатое и обратно.
  9. TB_COMMANDTOINDEX - Определение номера кнопки по ее идентификатору(нумерация кнопок начинается с нуля)
  10. TB_CUSTOMIZE - Для вывода диалоговой панели настройки тулбара(для тулбара должен быть установлен стиль CCS_ADJUSTABLE)
  11. TB_DELETEBUTTON - Удаление кнопки из окна Toolbar
  12. TB_ENABLEBUTTON - Блокирование\Разблокирование кнопки
  13. TB_GETBITMAP - Определение номера изображения по идентификатору кнопки
  14. TB_GETBITMAPFLAGS - Определение способности монитора отображать картинки большого размера
  15. TB_GETBUTTON - Получение информации о кнопке
  16. TB_GETBUTTONTEXT - Получение текстовой строки, связанной с кнопкой
  17. TB_GETITEMRECT - Определение координат области, занимаемой кнопкой
  18. TB_GETROWS - Определение количества строк в органе управления Toolbar , имеющим стиль TBSTYLE_WRAPABLE
  19. TB_GETSTATE - Определение состояния кнопки (нажата ли, отжата ли, спрятана ли и пр.)
  20. TB_GETTOOLTIPS - Определение идентификатора органа управления ToolTip, связанного с данным органом управления Toolbar
  21. TB_HIDEBUTTON - Скрытие\Отображение кнопки
  22. TB_INDETERMINATE - Установка кнопки серым цветом и наоборот
  23. TB_INSERTBUTTON - вставка кнопки в тулбар
  24. TB_ISBUTTONCHECKED - Определение нажата кнопка или нет.
  25. TB_ISBUTTONENABLED - Определение заблокирована кнопка или нет.
  26. TB_ISBUTTONHIDDEN - Определение скрыта кнопка или нет
  27. TB_ISBUTTONINDETERMINATE - Определение установлена кнопка серым цветом или нет
  28. TB_ISBUTTONPRESSED - Определение находится ли кнопка в нажатом состоянии
  29. TB_PRESSBUTTON - Установка кнопки в нажатое или отжатое состояние.
  30. TB_SAVERESTORE - Сохранение или восстановление состояния Toolbar
  31. TB_SETBITMAPSIZE - Установка размера картинки кнопки
  32. TB_SETBUTTONSIZE - Установка размера кнопки
  33. TB_SETCMDID - Присвоение кнопке с заданным номером командный идентификатор
  34. TB_SETPARENT - Назначение для органа управления Toolbar родительского окна
  35. TB_SETROWS - Установка количества строк кнопок в органе управления Toolbar
  36. TB_SETSTATE - Установка кнопки в новое состояние
  37. TB_SETTOOLTIPS - Назначение для тулбара органа управления ToolTip

Все сообщения, а так же их обработку можно посмотреть ЗДЕСЬ

Заключение:

В зависимости от стилей можно создать тулбар под разные задачи и с разным визуальным отображением. Например чтобы создать такую же панель тулбара , как отображена на самом верхнем рисунке в этой статье, нужно использовать стиль TBSTYLE_FLAT и создать файл ресурсов с manifest.xml. Я обязательно расскажу в одной из статей как активировать визуальные стили , которые работают начиная с Windows XP. До тех пор, вы можете спросить на форуме или прочитать об этом на сайте Microsoft

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