Исчерпывающее руководство по написанию всплывающих подсказок | страница 27
> // Center icon in client rectangle
> int cxIcon = GetSystemMetrics(SM_CXICON);
> int cyIcon = GetSystemMetrics(SM_CYICON);
> CRect rect;
> GetClientRect(&rect);
> int x = (rect.Width() – cxIcon + 1) / 2;
> int y = (rect.Height() – cyIcon + 1) / 2;
> // Draw the icon
> dc.DrawIcon(x, y, m_hIcon);
> } else {
> CDialog::OnPaint();
> }
>}
>// The system calls this to obtain the cursor to display while the user drags
>// the minimized window.
>HCURSOR CTTDemoDlg::OnQueryDragIcon() {
> return (HCURSOR) m_hIcon;
>}
Заключение
Итак, я дал вам пять советов по использованию подсказок. Надеюсь, они вдохновят вас на более широкое применение подсказок ToolTips, TitleTips и DataTips в ваших программах и Web-страницах. А может быть, вы даже придумаете новый вид подсказок, которым поделитесь со всеми нами!
Автор выражает благодарность Биллу Кинсли и другим из компании AM Communications, Inc.
Добавление задержек к подсказкам
Элемент TitleTip, созданный мной, не реализует возможностей добавления задержки перед показом подсказки, предоставляемых стандартным элементом ToolTip с помощью сообщения TTM_SETDELAYTIME. Я не стал добавлять задержек по примеру Microsoft, которая также не реализовала задержки в своих TitleTip'ах. Однако, в большинстве других видов подсказок эта задержка присутствует, поэтому если вы желаете добавить задержку перед показом ваших самописных подсказок, я объясню, как это сделать.
В общем случае, задержки реализуются через Windows-таймеры. В классе CWnd реализованы две функции, которые относятся к таймерам: CWnd::SetTimer и CWnd::KillTimer. CWnd::SetTimer устанавливает таймер, и принимает в качестве параметров ID таймера, временной интервал в миллисекундах и указатель на функцию, вызываемую по истечению указанного интервала. Если указатель на функцию равен NULL, то таймер использует сообщение WM_TIMER для уведомления окна о наступившем событии. CWnd::KillTimer останавливает таймер, принимая в качестве параметра ID таймера.
Заручившись такой поддержкой, давайте посмотрим, как можно добавить задержки к написанным вами подсказкам. Я покажу, как реализовать эквивалент TTDT_AUTOPOP сообщения TTM_SETDELAYTIME. Сообщение с этим параметром устанавливает время задержки перед скрытием подсказки, если курсор мыши неподвижен.
Во-первых, добавим protected– или private-переменные в наш класс, чтобы хранить ID таймера и координаты курсора мыши, когда подсказка видна на экране. Также добавим константу, в которой будет находиться время задержки до автоматического скрытия подсказки. Код будет выглядеть следующим образом: