С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
{c0Der}
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
1

WinApi и подсказки (ToolTips)

23.04.2012, 07:45. Показов 3182. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь разобраться как прикручиваются хинты к элементам интерфейса под WinApi...
Чистые приложения на WinApi пишу давно (но не часто =), вроде бы все сделал правильно, но подсказки не появляються, ни с TTF_SUBCLASS ни без него (отсылая сообщения вручную через TTM_RELAYEVENT), вот код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
program WinApiStub;
uses windows,messages,commctrl;
 
var
 tips,hInst,h,d,c:cardinal;
 x,y:integer;
 cl:tWndClass;
 ms:tMsg;
 
const
 _s='   ';
 tit='WinApi Stub Exe';
 cap=_s+tit;
 cln='M13Class';
 bt='Button';
 ww=320;
 wh=240;
 v=8;
 tx1='Text Text Text';
 tx2='Markus_13';
 
function mesaga(s:string;f:cardinal=0):integer;//выдача сообщения
begin
 result:=MessageBox(0,pchar(s+_s),cap,f+$1000);
end;
 
procedure quit;//процедура завершения проги
begin
 UnRegisterClass(cln,hInst);
 ExitProcess(hInst);
 halt;
end;
 
function WindowProc(hwnd,msg,wparam,lparam:integer):integer;stdcall;//обработчик сообщений
begin
 result:=DefWindowProc(hwnd,msg,wparam,lparam);
 if msg=WM_COMMAND then begin
  if HiWord(wParam)=BN_CLICKED then begin
   if LoWord(wParam)=1 then mesaga('Button1');
   if LoWord(wParam)=2 then mesaga('Button2');
  end;
 end;
 if msg=WM_DESTROY then quit;
end;
 
procedure InitTips;//инициализация подсказки
var ICC:TInitCommonControlsEx;
begin
 ICC.dwICC:=ICC_WIN95_CLASSES;
 ICC.dwSize:=SizeOf(TInitCommonControlsEx);
 InitCommonControlsEx(ICC);
 tips:=CreateWindow(TOOLTIPS_CLASS,'',TTS_ALWAYSTIP,
  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,hInstance,nil);
 SendMessage(tips,TTM_SETDELAYTIME,TTDT_AUTOPOP,5000);
 SendMessage(tips,TTM_SETDELAYTIME,TTDT_INITIAL,500);
 SendMessage(tips,TTM_SETDELAYTIME,TTDT_RESHOW,150);
 //SendMessage(tip,TTM_SETMAXTIPWIDTH,0,220);
 SetWindowPos(tips,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
end;
 
procedure AddTip(d:hwnd;t:string);//добавление хинта к контролу
var TI:TToolInfo;
begin
 TI.cbSize:=SizeOf(TToolInfo);
 TI.uFlags:=TTF_SUBCLASS or TTF_IDISHWND;
 TI.hwnd:=h;
 TI.uId:=d;
 TI.hInst:=hInstance;
 TI.lpszText:=pchar(t);
 SendMessage(tips,TTM_ADDTOOL,0,Lparam(@TI));
end;
 
procedure EnableTips(e:boolean);//включение/выключение хинтов
begin
 SendMessage(tips,TTM_ACTIVATE,ord(e),0);
end;
 
begin
 if FindWindow(cln,cap)>0 then halt;
 hInst:=GetModuleHandle(nil);
 cl.Style:=CS_PARENTDC;
 cl.hIcon:=LoadIcon(hInstance,IDI_APPLICATION);
 cl.lpfnWndProc:=@WindowProc;
 cl.hInstance:=hInst;
 cl.hbrBackground:=16;
 cl.lpszClassName:=cln;
 cl.hCursor:=LoadCursor(0,IDC_ARROW);
 InitCommonControls;
 RegisterClass(cl);
 x:=(GetDeviceCaps(getDC(0),HORZRES)-ww)div 2;
 y:=(GetDeviceCaps(getDC(0),VERTRES)-wh)div 2;
 c:=WS_OVERLAPPED or WS_SYSMENU or WS_VISIBLE;
 h:=CreateWindowEx(0,cln,cap,c,x,y,ww,wh,0,0,hInst,nil);
 InitTips;
 AddTip(h,'Example ToolTip');
 c:=WS_CHILD or WS_VISIBLE or BS_PUSHLIKE;
 d:=CreateWindow(bt,tx1,c,22,32,270,80,h,1,0,nil);
 AddTip(d,'Example ToolTip 1');
 d:=CreateWindow(bt,tx2,c,64,142,220,36,h,2,0,nil);
 AddTip(d,'Example ToolTip 2');
 EnableTips(true);
 while(GetMessage(ms,h,0,0))do begin
  TranslateMessage(ms);
  //SendMessage(tips,TTM_RELAYEVENT,0,integer(@ms));
  if(GetAsyncKeyState(vk_escape)<>0)then quit;
  DispatchMessage(ms);
 end;
 quit;
end.
Вопрос тривиален, но что я делаю не так?)))
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2012, 07:45
Ответы с готовыми решениями:

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

Подсказки констант WinApi при Ctrl+Space
Здравствуйте, столкнулся с проблемой. Хочу я, например вывести MessageBox, пишу...

Tooltips с дополнениями
Приветствую Всех. Необходимо создать tooltips, с возможность. загонять в него таблицы и...

tooltips for TextBox
Здраствуйте! Начал изучать c# и тут возник вопрос. Допустим у нас есть кокой нибудь элемент...

2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
33017 / 21319 / 8184
Регистрация: 22.10.2011
Сообщений: 36,620
Записей в блоге: 9
23.04.2012, 15:24 2
как ты в этом бардаке разбираешься? Переписал - вот что получилось:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
program WinApiStub;
uses Windows, Messages, CommCtrl;
 
const
   IDbtn1 = 100;
   IDbtn2 = 101;
   btnClass = 'BUTTON';
   szClassName = 'M13Class';
 
   tx_1 = 'Text Text Text';
   tx_2 = 'Markus_13';
 
   Wid = 320;
   Hei = 240;
   Title = 'WinApi Stub Exe';
var
   hInst : THandle;
   hMainWnd, tips : HWND;
   hBtn1, hBtn2 : HWND;
 
 
procedure AddTip(Control : HWND; Tip : string);
var TI : TToolInfo;
begin
   TI.cbSize := SizeOf(TToolInfo);
   TI.uFlags := TTF_SUBCLASS or TTF_IDISHWND;
   TI.hwnd := hMainWnd;
   TI.uId := Control;
   TI.hInst := hInst;
   TI.lpszText := PChar(Tip);
   SendMessage(tips, TTM_ADDTOOL, 0, Lparam(@TI));
end;
 
procedure InitTips (parent : HWND);
begin
   tips := CreateWindowEx(0, TOOLTIPS_CLASS, nil, TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT,
                         CW_USEDEFAULT, CW_USEDEFAULT, parent, 0, hInst, nil);
 
   AddTip(parent, 'Example ToolTip');
 
   AddTip(hBtn1, 'Example ToolTip 1');
   AddTip(hBtn2, 'Example ToolTip 2');
end;
 
 
function WindowProc (hWnd : HWND; msg : UINT;
                     wParam : WPARAM; lParam : LPARAM) : LRESULT; stdcall;
begin
   result := 0;
   case msg of
      WM_SHOWWINDOW:
      begin
            InitTips(hWnd);
            result := 1;
      end;
      WM_CREATE:
      begin
            hBtn1 := CreateWindowEx(0, btnClass, tx_1, WS_CHILD or WS_VISIBLE or BS_PUSHLIKE,
                                 22, 32, 270, 80, hWnd, IDbtn1, hInst, nil);
 
            hBtn2 := CreateWindowEx(0, btnClass, tx_2, WS_CHILD or WS_VISIBLE or BS_PUSHLIKE,
                                 64, 142, 220, 36, hWnd, IDbtn2, hInst, nil);
      end;
      WM_COMMAND:
      begin
         if HiWord(wParam) = BN_CLICKED then
         case LOWORD(wParam) of
            IDbtn1 : MessageBox(0, PChar('Button1'), Title, MB_OK);
            IDbtn2 : MessageBox(0, PChar('Button2'), Title, MB_OK);
         end;
      end;
      WM_DESTROY:
         PostQuitMessage (0);
      else
         result := DefWindowProc (hWnd, msg, wParam, lParam);
   end;
end;
 
var
   ms : TMsg;
   wincl : TWndClassEx;
begin
   hInst := hInstance;
   InitCommonControls;
 
   wincl.hInstance := hInstance;
   wincl.lpszClassName := szClassName;
   wincl.lpfnWndProc := @WindowProc;
   wincl.style := CS_DBLCLKS;
   wincl.cbSize := sizeof(WNDCLASSEX);
   wincl.hIcon := LoadIcon(0, IDI_APPLICATION);
   wincl.hIconSm := LoadIcon(0, IDI_APPLICATION);
   wincl.hCursor := LoadCursor(0, IDC_ARROW);
   wincl.lpszMenuName := nil;
   wincl.cbClsExtra := 0;
   wincl.cbWndExtra := 0;
   wincl.hbrBackground := COLOR_BACKGROUND;
 
   if RegisterClassEx(wincl) = 0 then exit;
 
    hMainWnd := CreateWindowEx (0, szClassName, Title, WS_OVERLAPPED or WS_SYSMENU or WS_VISIBLE,
      (GetDeviceCaps(getDC(0), HORZRES) - Wid) div 2,
      (GetDeviceCaps(getDC(0), VERTRES) - Hei) div 2, Wid, Hei,
      0, 0, hInst, nil);
   ShowWindow(hMainWnd, CmdShow);
 
   while (GetMessage (ms, 0, 0, 0)) do
   begin
      TranslateMessage(ms);
      DispatchMessage(ms);
   end;
   Halt(ms.wParam);
end.
Однако, работает...
2
{c0Der}
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
23.04.2012, 16:45  [ТС] 3
Цитата Сообщение от UI Посмотреть сообщение
как ты в этом бардаке разбираешься?
для меня твой код - бардак =) т.ч. кому как удобней...

Цитата Сообщение от UI Посмотреть сообщение
Однако, работает...
Да, я нашел ошибку: "while(GetMessage(ms,h,0,0))do begin"
Я протупил, не подумал что ToolTipCtrl должен сообщения перехватывать, там нужно нуль ставить вместо моего окна в качестве параметра адресата...
Всего лишь один символ надо было заменить =)))

И да, спасибо конечно за рабочий код, но т.к. он сильно отличается от моего, я бы долго побайтно сравнивал его со своим, чтобы понять почему он работает, а мой нет =)
0
23.04.2012, 16:45
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.04.2012, 16:45
Помогаю со студенческими работами здесь

WTL: TabView + ListView + ToolTips
На форме есть TabView для дин. создания вкладок. Вкладка основана на диалоге, где расположен...

Bootstrap tooltips расположение data-placement
Добрый день ув. пользователи! Подскажите пожалуйста, можно как-то менять tooltips расположение...

При добавлении WM_PAINT перестаёт отрабатывать ToolTips
Друзья, не могу понять :-( Вот пишу для примера так void CreateHint(HWND hwnd, char* strTT) {...

Подсказки
необходимо сделать всплывающее окно с подсказкой при наведении мышкой на текст в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на Go/Golang
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C#
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru