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

ToolTip или всплывающая подсказка - часто встречающийся контрол, используемый для вывода краткой справочной информации для других контролов при наведении на них курсора мыши.
Первое что нам понадобится, это создать контрол или контролы для того, чтобы было к чему прикручивать подсказки ( в нашем примере это будут две кнопки: простая и CheckBox).

but=CreateWindowEx(0,"button","Simple",WS_VISIBLE Or WS_CHILD,10,10,70,20,hwnd,Cast(HMENU,1),0,0)
check=CreateWindowEx(0,"button","",WS_VISIBLE Or BS_AUTOCHECKBOX Or WS_CHILD,100,10,20,20,hwnd,Cast(HMENU,2),0,0)
Вторым делом нужно создать окно с классом Tooltips_Class32. Поскольку в нашем примере я решил создать две разновидности tooltip (с иконкой и без) , то будут два окна с этим классом.
tooltip= CreateWindowEx(WS_EX_TOPMOST,"Tooltips_Class32",0,TTS_ALWAYSTIP Or WS_POPUP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hwnd,0,0,0)
tooltipicon= CreateWindowEx(WS_EX_TOPMOST,"Tooltips_Class32",0,TTS_ALWAYSTIP Or TTS_BALLOON Or WS_POPUP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hwnd,0,0,0)

Они имеют два разных стиля, но в остальном одинаковы. В первом tooltip стиле определен стиль, включающий  TTS_ALWAYSTIP , который позволяет показывать подсказку даже когда родительское окно неактивно. Во втором контроле добавлен стиль TTS_BALLOON, который позволяет создать подсказку круглой формы. Все стили можно посмотреть здесь

Далее конечно НЕОБЯЗАТЕЛЬНО делать три вызова функции SendMessage с сообщением TTM_SETDELAYTIME. Однако это покажет как можно оперировать временем вызова и задержки подсказки.

SendMessage(tooltip,TTM_SETDELAYTIME,TTDT_INITIAL,100) ' пауза перед появлением подсказки 0.1 секунды
SendMessage(tooltipicon,TTM_SETDELAYTIME,TTDT_INITIAL,200) ' пауза перед появлением подсказки 0.2 секунды
SendMessage(tooltipicon,TTM_SETDELAYTIME,TTDT_AUTOPOP,10000) ' пауза удержания видимости подсказки 10 секунд

Следующим шагом станет заполнение структуры TOOLINFO:

Dim Tool As TOOLINFO ' структура для создания нового ToolTip
Tool.cbSize=SizeOf(TOOLINFO)'размер структуры
Tool.uFlags=TTF_IDISHWND Or TTF_SUBCLASS    'флаги
Tool.hInst=Hinst ' дескриптор модуля
Tool.hwnd=hwnd ' хендл родителя ToolTip
Tool.uID=Cast(UINT,but) ' хендл контрола, которому прикрепляется подсказка
Tool.lpszText=Cast(LPTSTR,Strptr("Простая кнопка"))' текст подсказки

И конечно послать сообщение нашему созданному контролу (ToolTip) с информацией, которую мы поместили в структуру  TOOLINFO:

SendMessage(tooltip,TTM_ADDTOOL,0,Cast(LPARAM,@Tool)) 'сообщение с адресом заполненной струтуры

Для установки иконки для второго ToolTip, нужно отправить сообщение TTM_SETTITLE и в параметре wparam указать тип иконки а в параметре lparam послать указатель на строку, размещающуюся рядом с иконкой. 

Весь пример:

#INCLUDE "windows.bi"
#INCLUDE "win/commctrl.bi"
InitCommonControls()
#IFNDEF TTM_SETTITLE
#DEFINE TTM_SETTITLE &h420
#ENDIF
#IFNDEF TTI_INFO
#DEFINE TTI_INFO 1
#ENDIF
Dim msg As MSG 'структурированная переменная MSG
Dim As WNDCLASSEX wc 'структурированная переменная WNDCLASSEX
Dim As String NameClass="MyClass" ' переменная имени класса
Dim Shared As HINSTANCE Hinst:Hinst=GetModuleHandle(0) ' хендл модуля
' функция класса
Function wndproc(hwnd As HWND, msg As Uinteger,_
    wparam As WPARAM, lparam As LPARAM) As Integer
    Static As HWND tooltip,tooltipicon,but,check
    Select Case msg
        Case WM_CREATE
            but=CreateWindowEx(0,"button","Simple",WS_VISIBLE Or WS_CHILD,10,10,70,20,hwnd,Cast(HMENU,1),0,0)
            check=CreateWindowEx(0,"button","",WS_VISIBLE Or BS_AUTOCHECKBOX Or WS_CHILD,100,10,20,20,hwnd,Cast(HMENU,2),0,0)
            tooltip= CreateWindowEx(WS_EX_TOPMOST,"Tooltips_Class32",0,TTS_ALWAYSTIP  Or WS_POPUP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hwnd,0,0,0)
            tooltipicon= CreateWindowEx(WS_EX_TOPMOST,"Tooltips_Class32",0,TTS_ALWAYSTIP Or TTS_BALLOON Or WS_POPUP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hwnd,0,0,0)
            SendMessage(tooltip,TTM_SETDELAYTIME,TTDT_INITIAL,100) ' пауза перед появлением подсказки 0.1 секунды
            SendMessage(tooltipicon,TTM_SETDELAYTIME,TTDT_INITIAL,200) ' пауза перед появлением подсказки 0.2 секунды
            SendMessage(tooltipicon,TTM_SETDELAYTIME,TTDT_AUTOPOP,10000) ' пауза удержания видимости подсказки 10 секунд
            Dim Tool As TOOLINFO ' структура для создания нового ToolTip
            Tool.cbSize=SizeOf(TOOLINFO)'размер структуры
            Tool.uFlags=TTF_IDISHWND Or TTF_SUBCLASS    'флаги
            Tool.hInst=Hinst ' дескриптор модуля
            Tool.hwnd=hwnd ' хендл родителя ToolTip
            Tool.uID=Cast(UINT,but) ' хендл контрола, которому прикрепляется подсказка
            Tool.lpszText=Cast(LPTSTR,Strptr("Простая кнопка"))' текст подсказки
            SendMessage(tooltip,TTM_ADDTOOL,0,Cast(LPARAM,@Tool)) 'сообщение с адресом заполненной струтуры
            Tool.uID=Cast(UINT,check)   ' хендл контрола, которому прикрепляется подсказка
            Tool.lpszText=Cast(LPTSTR,Strptr("Это CheckBox кнопка"))' текст подсказки
            SendMessage(tooltipicon,TTM_ADDTOOL,0,Cast(LPARAM,@Tool))   'сообщение с адресом заполненной струтуры
            SendMessage(tooltipicon,TTM_SETTITLE,TTI_INFO,Cast(LPARAM,@"Информация")) 'ставим иконку и заглавие для tooltipicon
        Case WM_DESTROY
            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,150,80,0,0,Hinst,0)
' Цикл сообщений
While GetMessage(@msg,0,0,0)
    TranslateMessage(@msg)
    DispatchMessage(@msg)
Wend


Вот что примерно должно получиться:

tooltip_1.png          tooltip_2.png

По сути можно было создать только один контрол (ToolTip) и создавая подсказки для других контролов, просто при добавлении (сообщение TTM_ADDTOOL) указывать один и тот же хендл единственного контрола. В этом случае подсказки будут иметь одинаковый внешний вид.

Всего доброго!

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