Чтение онлайн

на главную - закладки

Жанры

Исчерпывающее руководство по написанию всплывающих подсказок

Джек Роджер

Шрифт:

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

class CCustomTip: public CWnd {

 .

 .

 .

protected:

 const int m_nAutoPopDelay; // В миллисекундах.

 UINT m_nTimerId;

 CPoint m_LastMousePosition;

 .

 .

 .

};

В

конструкторе инициализируем константу m_nAutoPopDelay значением 10000 (десять секунд), а m_nTimerId установим в 0.

CCustomTip::CCustomTip : m_nAutoPopDelay(10000), m_LastMousePosition(0, 0) {

 .

 .

 .

 m_nTimerId = 0;

 .

 .

 .

}

Вы можете установить любой интервал – я задал 10 секунд только в целях демонстрации задержки.

Добавьте код, который запускает таймер, когда показывается подсказка. Например, если бы существовала функция CCustomTip::Show, вы бы добавили следующий код в метод, показывающий окно:

void CCustomTip::Show {

 .

 .

 .

 if (m_nTimerId > 0) {

VERIFY(KillTimer(m_nTimerId));

m_nTimerId = 0;

 }

 VERIFY(::GetCursorPos(&m_LastMousePosition));

 m_nTimerId = SetTimer(1, m_nAutoPopDelay, NULL);

 ASSERT(m_nTimerId != 0);

 .

 .

 .

}

Добавьте код для обработки сообщений таймера. Добавьте обработчик сообщения WM_TIMER с помощью ClassWizard. Код обработчика должен выглядеть следующим образом:

void CTitleTip::OnTimer(UINT nIDEvent) {

 CPoint CurrentMousePosition;

 VERIFY(::GetCursorPos(&CurrentMousePosition));

 if (CurrentMousePosition == m_LastMousePosition) {

Hide;

 } else {

m_LastMousePosition = CurrentMousePosition;

 }

}

Наконец, добавьте в CCustomTip::Hide код, останавливающий таймер:

void CCustomTip::Hide {

 if (m_nTimerId > 0) {

VERIFY(KillTimer(m_nTimerId));

m_nTimerId = 0;

 } ShowWindow(SW_HIDE);

}

Таким же образом можно реализовать другие типы задержек стандартных элементов ToolTip, но придется отслеживать больше изменений, чем координаты курсора мыши. Например, для реализации эквивалента TTDT_RESHOW (интервал времени перед показом следующей подсказки при перемещении курсора мыши на другую строку, или инструмент) нужно будет создать переменные для хранения времени скрытия последней подсказки и ее содержимого.

Поделиться:
Популярные книги

Мастер Разума IV

Кронос Александр
4. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума IV

Начальник милиции. Книга 3

Дамиров Рафаэль
3. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 3

Царь царей

Билик Дмитрий Александрович
9. Бедовый
Фантастика:
фэнтези
мистика
5.00
рейтинг книги
Царь царей

Страж Кодекса. Книга VII

Романов Илья Николаевич
7. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга VII

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Камень. Книга пятая

Минин Станислав
5. Камень
Фантастика:
боевая фантастика
6.43
рейтинг книги
Камень. Книга пятая

Вернуть Боярство 6

Мамаев Максим
6. Пепел
Фантастика:
фэнтези
попаданцы
аниме
5.75
рейтинг книги
Вернуть Боярство 6

Войны Наследников

Тарс Элиан
9. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Войны Наследников

Вперед в прошлое 2

Ратманов Денис
2. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 2

Держать удар

Иванов Дмитрий
11. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Держать удар

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи