На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Using a Tooltip Control with a Dialog Box



The following example includes a set of application-defined functions that implement a tooltip control for a dialog box. The DoCreateDialogTooltip function creates a tooltip control and uses the EnumChildWindows function to enumerate the controls in the dialog box. The enumeration procedure, EnumChildProc, registers each control with the tooltip control. The procedure specifies the dialog box as the parent window of each tooltip control and includes the LPSTR_TEXTCALLBACK value for each tooltip control. As a result, the dialog box receives a WM_NOTIFY message that contains the TTN_NEEDTEXT notification message whenever the tooltip control needs the text for a control. The dialog box procedure calls the OnWMNotify function to process the TTN_NEEDTEXT notifications. OnWMNotify provides the appropriate string based on the identifier of the tooltip control.

The tooltip control needs to receive mouse messages that the system sends to the control windows. To access the messages, the DoCreateDialogTooltip function installs a hook procedure of the WH_GETMESSAGE type. The hook procedure, GetMsgProc, monitors the message stream for mouse messages intended for one of the control windows and relays the messages to the tooltip control.

// DoCreateDialogTooltip - creates a tooltip control for a dialog box,
// enumerates the child control windows, and installs a hook
// procedure to monitor the message stream for mouse messages posted
// to the control windows.
// Returns TRUE if successful or FALSE otherwise.
//
// Global variables
// g_hinst ѕ handle of the application instance
// g_hwndTT ѕ handle of the tooltip control
// g_hwndDlg ѕ handle of the dialog box

// g_hhk ѕ handle of the hook procedure

BOOL DoCreateDialogTooltip(void)
{

// Ensure that the common control DLL is loaded, and create
// a tooltip control.
InitCommonControls();
g_hwndTT = CreateWindowEx(0, TOOLTIPS_CLASS, (LPSTR) NULL,
TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, g_hwndDlg, (HMENU) NULL, g_hinst, NULL);

if (g_hwndTT == NULL)
return FALSE;

// Enumerate the child windows to register them with the tooltip
// control.

if (!EnumChildWindows(g_hwndDlg, (WNDENUMPROC) EnumChildProc, 0))
return FALSE;

// Install a hook procedure to monitor the message stream for mouse
// messages intended for the controls in the dialog box.
g_hhk = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc,
(HINSTANCE) NULL, GetCurrentThreadId());

if (g_hhk == (HHOOK) NULL)
return FALSE;

return TRUE;
}

// EmumChildProc - registers control windows with a tooltip control by
// using the TTM_ADDTOOL message to pass the address of a

// TOOLINFO structure.
// Returns TRUE if successful or FALSE otherwise.
// hwndCtrl - handle of a control window
// lParam - application-defined value (not used)
BOOL EnumChildProc(HWND hwndCtrl, LPARAM lParam)
{
TOOLINFO ti;
char szClass[64];

// Skip static controls.
GetClassName(hwndCtrl, szClass, sizeof(szClass));
if (lstrcmp(szClass, "STATIC") {
ti.cbSize = sizeof(TOOLINFO);
ti.uFlags = TTF_IDISHWND;

ti.hwnd = g_hwndDlg;
ti.uId = (UINT) hwndCtrl;
ti.hinst = 0;
ti.lpszText = LPSTR_TEXTCALLBACK;
SendMessage(g_hwndTT, TTM_ADDTOOL, 0,
(LPARAM) (LPTOOLINFO) &ti);
}
return TRUE;
}

// GetMsgProc - monitors the message stream for mouse messages intended
// for a control window in the dialog box.
// Returns a message-dependent value.
// nCode - hook code
// wParam - message flag (not used)

// lParam - address of an MSG structure
LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MSG *lpmsg;

lpmsg = (MSG *) lParam;
if (nCode < 0 || !(IsChild(g_hwndDlg, lpmsg->hwnd)))
return (CallNextHookEx(g_hhk, nCode, wParam, lParam));

switch (lpmsg->message) {
case WM_MOUSEMOVE:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
if (g_hwndTT != NULL) {

MSG msg;

msg.lParam = lpmsg->lParam;
msg.wParam = lpmsg->wParam;
msg.message = lpmsg->message;
msg.hwnd = hwnd;
SendMessage(g_hwndTT, TTM_RELAYEVENT, 0,
(LPARAM) (LPMSG) &msg);
}
break;
default:
break;
}
return (CallNextHookEx(g_hhk, nCode, wParam, lParam));
}

// OnWMNotify - provides the tooltip control with the appropriate text

// to display for a control window. This function is called by
// the dialog box procedure in response to a WM_NOTIFY message.
// lParam - second message parameter of the WM_NOTIFY message
VOID OnWMNotify(LPARAM lParam)
{
LPTOOLTIPTEXT lpttt;
int idCtrl;

if ((((LPNMHDR) lParam)->code) == TTN_NEEDTEXT) {
idCtrl = GetDlgCtrlID((HWND) ((LPNMHDR) lParam)->idFrom);
lpttt = (LPTOOLTIPTEXT) lParam;

switch (idCtrl) {

case ID_HORZSCROLL:
lpttt->lpszText = "A horizontal scroll bar.";
return;

case ID_CHECK:
lpttt->lpszText = "A check box.";
return;

case ID_EDIT:
lpttt->lpszText = "An edit control.";
return;
}
}
return;
}



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Использование Управления Tooltip с Диалоговым Ящиком



Следующий пример включает набор определенных прикладных функций, которые осуществляют управление tooltip для диалогового ящика. Функция DoCreateDialogTooltip создает управление tooltip и использует функцию EnumChildWindows, чтобы перечислять элементы управления в диалоговом ящике. Процедура перечисления, EnumChildProc, регистрирует каждое управление с управлением tooltip. Процедура определяет диалоговый ящик как родительское окно каждого tooltip управлять и включает величину LPSTR_TEXTCALLBACK для каждому tooltip управления. В результате, диалоговый ящик получает сообщение WM_NOTIFY, которое содержит сообщение уведомления TTN_NEEDTEXT всякий раз, когда управлению tooltip нужно текст для управления. Диалоговая процедура ящика вызывает функцию OnWMNotify, чтобы обрабатывать уведомления TTN_NEEDTEXT. OnWMNotify ОБЕСПЕЧИВАЕТ подходящую строку основанную в идентификаторе управления tooltip.

Управлению tooltip нужно получать сообщения мыши, которые система посылает в управляющее окно. Для того, чтобы иметь доступ к сообщениям, функция DoCreateDialogTooltip устанавливает рычажную процедуру типа WH_GETMESSAGE. Рычажная процедура, GetMsgProc, проверяет поток сообщения для сообщений мыши предназначенных для одного из управляющего окна и передает сообщения на управление tooltip.

// DoCreateDialogTooltip - СОЗДАЕТ управление tooltip для диалогового ящика, // перечисляет управляющее окно ребенка и устанавливает захват // процедура, чтобы проверять поток сообщения для сообщений мыши объявленных // в управляющее окно.
// ИСТИНА Возврата если успешный или ЛОЖНЫЙ в противном случае.
//
// Глобальные переменные
// g_hinst U ручка прикладного примера // g_hwndTT U ручка управления / tooltip/ g_hwndDlg U ручка диалогового ящика

// g_hhk U ручка рычажной процедуры

BOOL DoCreateDialogTooltip(ПУСТОТА)
{

// Проверьте, что общее управление DLL загружено, и создавайте // a tooltip управление.
InitCommonControls();
g_hwndTT = CreateWindowEx(0, TOOLTIPS_CLASS, (LPSTR) НЕДЕЙСТВИТЕЛЬНЫЙ, TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, g_hwndDlg, (HMENU) НЕДЕЙСТВИТЕЛЬНЫЙ, g_hinst, НЕДЕЙСТВИТЕЛЬНЫЙ);

если (g_hwndTT == НЕДЕЙСТВИТЕЛЬНЫЙ) обратная ЛОЖЬ;

// Перечислите окно ребенка, чтобы регистрировать их с tooltip // управление.

если (!EnumChildWindows(g_hwndDlg, (WNDENUMPROC) EnumChildProc, 0)) ОБРАТНАЯ ЛОЖЬ;

// Установите рычажную процедуру, чтобы проверять поток сообщения для мыши // сообщения предназначенной для элементов управления в диалоговом ящике.
g_hhk = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, (HINSTANCE) НЕДЕЙСТВИТЕЛЬНЫЙ, GetCurrentThreadId());

если (g_hhk == (HHOOK) НЕДЕЙСТВИТЕЛЬНЫЙ) обратная ЛОЖЬ;

возвращайтесь ВЕРНО;
}

// EmumChildProc - УПРАВЛЯЮЩЕЕ окно регистров с управлением tooltip // использованием сообщения TTM_ADDTOOL, чтобы передавать адрес a

// СТРУКТУРА TOOLINFO.
// ИСТИНА Возврата если успешный или ЛОЖНЫЙ в противном случае.
// hwndCtrl - Ручка управляющего окна // lParam - определившее прикладную величину (не использованное) BOOL EnumChildProc(HWND hwndCtrl, LPARAM lParam)
{
ti TOOLINFO;
символ szClass[64];

// Статические элементы управления Пропуска.
GetClassName(hwndCtrl, szClass, sizeof(szClass));
если (lstrcmp(szClass, "СТАТИЧЕСКИЙ") { ti.cbSize = sizeof(TOOLINFO);
ti.uFlags = TTF_IDISHWND;

ti.hwnd = g_hwndDlg;
ti.uId = (UINT) hwndCtrl;
ti.hinst = 0;
ti.lpszText = LPSTR_TEXTCALLBACK;
SendMessage(g_hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
}
возвращайтесь ВЕРНО;
}

// GetMsgProc - ПРОВЕРЯЕТ поток сообщения для сообщений мыши предположенных // для управляющего окна в диалоговом ящике.
// Возврат сообщеняя-зависимая величина.
// nCode - Рычажный код // wParam - флаг сообщения (не использованное)

// lParam - Адрес MSG структурного ВОЗВРАТА LRESULT GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MSG *lpmsg;

lpmsg = (MSG *) lParam;
если возврат (nCode < 0 || !(IsChild(g_hwndDlg, lpmsg->hwnd))) (CallNextHookEx(g_hhk, nCode, wParam, lParam));

ключ (lpmsg->message) { случай WM_MOUSEMOVE: случай WM_LBUTTONDOWN: случай WM_LBUTTONUP: случай WM_RBUTTONDOWN: случай WM_RBUTTONUP: если (g_hwndTT != НЕДЕЙСТВИТЕЛЬНЫЙ) {

msg MSG;

msg.lParam = lpmsg->lParam;
msg.wParam = lpmsg->wParam;
lpmsg->message msg.message =;
msg.hwnd = hwnd;
SendMessage(g_hwndTT, TTM_RELAYEVENT, 0, (LPARAM) (LPMSG) &msg);
}
прерывание;
невыполнение: прерывание;
}
возврат (CallNextHookEx(g_hhk, nCode, wParam, lParam));
}

// OnWMNotify - ОБЕСПЕЧИВАЕТ управление tooltip подходящим текстом

//, чтобы отображаться для управляющего окна. Эта функция вызвана // диалоговая процедура ящика в ответ на сообщение WM_NOTIFY.
// lParam - Параметр сообщения секунды ПУСТОТЫ сообщения WM_NOTIFY OnWMNotify(LPARAM lParam)
{
LPTOOLTIPTEXT lpttt;
int idCtrl;

если ((((LPNMHDR) lParam)->code) == TTN_NEEDTEXT) { idCtrl = GetDlgCtrlID((HWND) ((LPNMHDR) lParam)->idFrom);
lpttt = (LPTOOLTIPTEXT) lParam;

ключ (idCtrl) {

случай ID_HORZSCROLL: lpttt->lpszText = " горизонтальный перемещать бар.";
возврат;

случай ID_CHECK: lpttt->lpszText = " контрольный ящик.";
возврат;

случай ID_EDIT: lpttt->lpszText = " управление редактирования.";
возврат;
}
}
возврат;
}



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz