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) и создавая подсказки для других контролов, просто при добавлении (сообщение TTM_ADDTOOL) указывать один и тот же хендл единственного контрола. В этом случае подсказки будут иметь одинаковый внешний вид.
Всего доброго!
содержание | назад | вперед