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

Шрифт
Интервал

стр.

> HWND hwndRegListBox = ::GetDlgItem(GetSafeHwnd(), IDC_REGLISTBOX);

> ASSERT(hwndRegListBox);

> VERIFY(m_RegListBox.SubclassWindow(hwndRegListBox));

> // Сабклассинг списка с пользовательской отрисовкой

> HWND hwndODListBox = ::GetDlgItem(GetSafeHwnd(), IDC_ODLISTBOX);

> ASSERT(hwndODListBox);

> VERIFY(m_ODListBox.SubclassWindow(hwndODListBox));

> // Заполнение обоих списков строками

> static char* pszItemArray[] = {

>  "The C++ Programming Language",

>  "C++ Primer",

>  "OLE Controls Inside Out",

>  "Inside OLE 2nd Edition",

>  "Inside ODBC",

>  "Code Complete",

>  "Rapid Software Development",

>  "The Design Of Everyday Things",

>  "Object-Oriented Analysis And Design",

>  "MFC Internals",

>  "Animation Techniques In Win32",

>  "Inside Visual C++",

>  "Writing Solid Code",

>  "Learn Java Now"

> };

> static int nItemArrayCount = sizeof(pszItemArray) / sizeof(pszItemArray[0]);

> for (int n = 0; n < nItemArrayCount; n++) {

>  VERIFY(m_RegListBox.AddString(pszItemArray[n]) != LB_ERR);

>  VERIFY(m_ODListBox.AddString(pszItemArray[n]) != LB_ERR);

> }

> return TRUE; // return TRUE unless you set the focus to a control

>}


>// If you add a minimize button to your dialog, you will need the code below

>// to draw the icon. For MFC applications using the document/view model,

>// this is automatically done for you by the framework.

>void CTTDemoDlg::OnPaint() {

> if (IsIconic()) {

>  CPaintDC dc(this); // device context for painting

>  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

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

>class CCustomTip: public CWnd {

> .

> .

> .


стр.

Похожие книги