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

Одним из самых популярных классов дочерних окон является класс Button. Этот класс еще наверное самый трансформируемый. Ниже на рисунке показаны формы , которые можно создать с помощью этого класса:

buttonclass.jpg

Различие форм определяется с помощью стилей функции CreateWindowEx(или CreateWindow). Ниже в таблице указаны стили для реализации этих форм:

 

Желаемый вид Стиль
Простая кнопка с надписью WS_VISIBLE Or WS_CHILD
Кнопка с изображением WS_VISIBLE Or WS_CHILD Or BS_BITMAP
Кнопка(квадратная) с флажком (CheckBox) WS_VISIBLE Or WS_CHILD Or BS_AUTOCHECKBOX
Кнопка переключатель(круглая) WS_VISIBLE Or WS_CHILD Or BS_AUTORADIOBUTTON
Кнопка-рамка WS_VISIBLE Or WS_CHILD Or BS_GROUPBOX

Все стили связанные с классом Button:

  • BS_3STATE - Создает кнопку, которая является такой же, как окошко для флажка, за исключением того, что поле окна может стать недоступным так же, как это делается при установке флажка ("галочки") проверки (checked) или при отмене его. Используйте недоступное состояние, чтобы показать, что состояние окошка для флажка не определено.
  • BS_AUTO3STATE - Создает кнопку, которая является таким же переключателем с тремя состояниями, за исключением того, что поле окна изменяет свое состояние, когда пользователь выбирает его. Состояние циклически проходит фазы установки флажка проверки, недоступности и отмены установки.
  • BS_AUTOCHECKBOX - Создает кнопку, которая также является окошком для флажка, за исключением того, что состояние установки флажка проверки автоматически переключается между установленным и не установленным параметром, каждый раз, когда пользователь выбирает эту кнопку.
  • BS_AUTORADIOBUTTON - Создает кнопку, которая то же, что и "радио" кнопка, за исключением того, что, когда пользователь выбирает её, Windows автоматически устанавливает состояние кнопки в режим контроля флажка, отметив ее "галочкой" и автоматически устанавливает проверку состояния для всех других кнопок в той же самой группе без проверки флажка.
  • BS_CHECKBOX - Создает маленькое, пустое окошко для флажка с текстом. По умолчанию, текст отображается справа от окошка. Чтобы отображать текст слева от окошка, объедините этот флажок со стилем BS_LEFTTEXT (или с эквивалентным стилем BS_RIGHTBUTTON).
  • BS_DEFPUSHBUTTON - Создает командную кнопку, которая ведет себя подобно кнопке стиля BS_PUSHBUTTON и к тому же имеет жирную черную рамку. Если кнопка находится в диалоговом окне, пользователь может выбрать кнопку, нажав клавишу ENTER, даже тогда, когда кнопка не имеет фокуса ввода. Этот стиль полезен для предоставления пользователю возможности быстро выбрать наиболее подходящую (заданную по умолчанию) опцию.
  • BS_GROUPBOX - Создает прямоугольник, в котором могут быть сгруппированы другие элементы управления. Любой текст, связанный с этим стилем отображается в верхнем левом угле прямоугольника.
  • BS_LEFTTEXT - Помещает текст слева от "радио" кнопки или окошечка-переключателя, когда объединен со стилем переключателя или "радио" кнопкой. Тот же самое, что и стиль BS_RIGHTBUTTON.
  • BS_OWNERDRAW - Создает кнопку представляемую владельцем. Окно владельца принимает сообщение WM_MEASUREITEM, когда кнопка создана и сообщение WM_DRAWITEM, когда внешний вид кнопки изменился. Не объединяйте стиль BS_OWNERDRAW с любыми другими стилями кнопки.
  • BS_PUSHBUTTON - Создает командную кнопку, которая отправляет сообщение WM_COMMAND окну владельца, когда пользователь выбирает эту кнопку.
  • BS_RADIOBUTTON - Создает маленький кружок с текстом. По умолчанию, текст отображается справа от кружка. Чтобы отображать текст слева от кружка, объедините этот флажок со стилем BS_LEFTTEXT (или его эквивалентом - стилем BS_RIGHTBUTTON). Используйте "радио" кнопки для групп связанного, но взаимоисключающего выбора.
  • BS_USERBUTTON - Устаревшая, но предусматривающая совместимость с 16-разрядными версиями Windows. Базирующиеся на Win32 прикладные программы должны использовать BS_OWNERDRAW взамен этого параметра.
  • BS_BITMAP - Определяет, что кнопка отображает точечный рисунок.
  • BS_BOTTOM - Помещает текст внизу прямоугольника кнопки.
  • BS_CENTER - Выравнивает текст горизонтально по центру в прямоугольнике кнопки.
  • BS_ICON - Определяет, что кнопка отображается как значок.
  • BS_LEFT - Выравнивает слева текст в прямоугольнике кнопки. Однако, если кнопка - окошечко-переключатель или "радио" кнопка, которые не имеет стиля BS_RIGHTBUTTON, текст остается выровненным справа от переключателя или "радио" кнопки.
  • BS_MULTILINE - Переносит по словам текст кнопки в дополнительные строки, если текстовая строка слишком длинна, чтобы поместиться в одной строке в прямоугольнике кнопки.
  • BS_NOTIFY - Дает возможность кнопке послать уведомительные сообщения BN_DBLCLK, BN_KILLFOCUS и BN_SETFOCUS в её родительское окно. Обратите внимание, что кнопки посылают уведомительное сообщение BN_CLICKED независимо от того, имеет ли она этот стиль.
  • BS_PUSHLIKE - Создает кнопку (типа переключателя, переключателя с тремя состояниями или "радио" кнопки) имеющую вид и действующую подобно командной кнопке. Выпуклый вид кнопки, когда она не нажата или не выбрана и притопленый, когда она нажата или выбрана.
  • BS_RIGHT - Выровненный справа текст в прямоугольнике кнопки. Однако, если кнопка - окошко для флажка или "радио" кнопка, которая не имеет стиля BS_RIGHTBUTTON, текст выровнен по правому краю справа от окошка для флажка или "радио" кнопки.
  • BS_RIGHTBUTTON - Устанавливает кружок "радио" кнопки или квадрат окошка для флажка справа от прямоугольника кнопки. Тот же самый стиль, что и BS_LEFTTEXT.
  • BS_TEXT - Определяет, что кнопка отображает текст.
  • BS_TOP - Размешает текст вверху прямоугольника кнопки.
  • BS_VCENTER - Размещает текст в середине (вертикально) прямоугольника кнопки.

И конечно пример(в папке с исходным текстом программы должен быть рисунок с именем 1.bmp):

#INCLUDE "windows.bi"
Dim msg As MSG 'структурированная переменная MSG
Dim As WNDCLASSEX wc 'структурированная переменная WNDCLASSEX
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
    Dim As HBITMAP bmp
    Dim Bimage As HWND
    Select Case msg
        Case WM_CREATE
            CreateWindowEx(0,"button","Простая кнопка",WS_VISIBLE Or WS_CHILD,40,40,130,20,hwnd,Cast(HMENU,1),0,0)
            Bimage=CreateWindowEx(0,"button","",WS_VISIBLE Or BS_BITMAP Or WS_CHILD,40,70,40,40,hwnd,Cast(HMENU,2),0,0)
            bmp=LoadImage(0,"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE)
            SendMessage(Bimage,BM_SETIMAGE,IMAGE_BITMAP,Cast(LPARAM,bmp))
            CreateWindowEx(0,"button","выбор1",WS_VISIBLE Or BS_AUTORADIOBUTTON Or WS_CHILD,180,40,100,20,hwnd,Cast(HMENU,3),0,0)
            CreateWindowEx(0,"button","выбор2",WS_VISIBLE Or BS_AUTORADIOBUTTON Or WS_CHILD,180,70,100,20,hwnd,Cast(HMENU,4),0,0)
            CreateWindowEx(0,"button","выбор3",WS_VISIBLE Or BS_AUTORADIOBUTTON Or WS_CHILD,180,100,100,20,hwnd,Cast(HMENU,5),0,0)
            CreateWindowEx(0,"button","",WS_VISIBLE Or BS_AUTOCHECKBOX Or WS_CHILD,120,80,20,20,hwnd,Cast(HMENU,6),0,0)
            CreateWindowEx(0,"button","",WS_VISIBLE Or BS_AUTOCHECKBOX Or WS_CHILD,120,100,20,20,hwnd,Cast(HMENU,7),0,0)
            CreateWindowEx(0,"button","Тоже кнопка",WS_VISIBLE Or BS_GROUPBOX Or WS_CHILD,20,10,250,140,hwnd,Cast(HMENU,8),0,0)
        Case WM_DESTROY
            DeleteObject(bmp)
            PostQuitMessage(0)
    End Select
    Return DefWindowProc(hwnd,msg,wparam,lparam)
End Function
' Заполнение структуры WNDCLASSEX
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,10,10,300,200,0,0,Hinst,0)
' Цикл сообщений
While GetMessage(@msg,0,0,0)
    TranslateMessage(@msg)
    DispatchMessage(@msg)
Wend

В примере выше, основанном на примере из прошлой статьи следует обратить внимание на второй параметр функции SendMessage. Для кнопки, на которой размещается изображение, используется константа - сообщение BM_SETIMAGE в отличие от Static использующий STM_SETIMAGE.

Установка и получение текста из кнопок ничем не отличается от класса Static. Если пропустили, читайте прошлую статью. Всего доброго.

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