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

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

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

Студворк — интернет-сервис помощи студентам
Пытаюсь разобраться как прикручиваются хинты к элементам интерфейса под 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, пишу MessageBoxA(0,&quot;123&quot;,&quot;123&quot;, MB_YESNO,...

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

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

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}
 Аватар для Markus_13
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
23.04.2012, 16:45  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
как ты в этом бардаке разбираешься?
для меня твой код - бардак =) т.ч. кому как удобней...

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

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru