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

Здесь есть возможность читать онлайн «Роджер Джек - Исчерпывающее руководство по написанию всплывающих подсказок» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

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

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Исчерпывающее руководство по написанию всплывающих подсказок»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Исчерпывающее руководство по написанию всплывающих подсказок — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Исчерпывающее руководство по написанию всплывающих подсказок», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

CDTDemoDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// Проверяем в обратном порядке, чтобы корректно обработать

// перекрывающиеся круги

const CCircle *pCircleHit = NULL;

for (int n = pDoc->GetCircleCount() – 1; n >= 0 && pCircleHit == NULL; n--) {

if (pDoc->GetCircle(n).HitTest(Point)) {

pCircleHit = &(pDoc->GetCircle(n));

}

}

return pCircleHit;

}

/////////////////////////////////////////////////////////////////////////////

// CDTDemoView drawing

void CDTDemoView::OnDraw(CDC* pDC) {

CDTDemoDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

for (int n = 0; n < pDoc->GetCircleCount(); n++) {

pDoc->GetCircle(n).Draw(pDC);

}

}

/////////////////////////////////////////////////////////////////////////////

// CDTDemoView diagnostics

#ifdef _DEBUG

void CDTDemoView::AssertValid() const {

CView::AssertValid(); } void CDTDemoView::Dump(CDumpContext& dc) const {

CView::Dump(dc);

}

CDTDemoDoc* CDTDemoView::GetDocument() // non-debug version is inline

{

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDTDemoDoc)));

return (CDTDemoDoc*)m_pDocument;

}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////

// CDTDemoView message handlers

void CDTDemoView::OnInitialUpdate() {

CView::OnInitialUpdate();

CRect ClientRect(0, 0, 1000, 1000);

if (m_ToolTip.Create(this, TTS_ALWAYSTIP) && m_ToolTip.AddTool(this)) {

m_ToolTip.SendMessage(TTM_SETMAXTIPWIDTH, 0, SHRT_MAX);

m_ToolTip.SendMessage(TTM_SETDELAYTIME, TTDT_AUTOPOP, SHRT_MAX);

m_ToolTip.SendMessage(TTM_SETDELAYTIME, TTDT_INITIAL, 200);

m_ToolTip.SendMessage(TTM_SETDELAYTIME, TTDT_RESHOW, 200);

} else {

TRACE("Error in creating ToolTip");

}

}

BOOL CDTDemoView::OnToolTipNeedText(UINT id, NMHDR * pNMHDR, LRESULT * pResult) {

BOOL bHandledNotify = FALSE;

CPoint CursorPos;

VERIFY(::GetCursorPos(&CursorPos));

ScreenToClient(&CursorPos);

CRect ClientRect;

GetClientRect(ClientRect);

// Удостовериться, что курсор попадает в клиентскую область окна,

// потому что библиотека тоже хочет получать эти сообщения для

// показа подсказок на панели инструментов.

if (ClientRect.PtInRect(CursorPos)) {

TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;

m_pCircleHit = HitTest(CursorPos);

if (m_pCircleHit) {

// Adjust the text by filling in TOOLTIPTEXT

CString strTip;

const CPoint& Center = m_pCircleHit->GetCenter();

COLORREF Color = m_pCircleHit->GetColor();

strTip.Format("Center: (%d, %d)\nRadius: %d\nColor: (%d, %d, %d)", Center.x, Center.y, m_pCircleHit->GetRadius(), (int)GetRValue(Color), (int)GetGValue(Color), (int)GetBValue(Color));

ASSERT(strTip.GetLength() < sizeof(pTTT->szText));

::strcpy(pTTT->szText, strTip);

// Set the text color to same color as circle

m_ToolTip.SendMessage(TTM_SETTIPTEXTCOLOR, Color, L);

} else {

pTTT->szText[0] = 0;

}

bHandledNotify = TRUE;

}

return bHandledNotify;

}

BOOL CDTDemoView::PreTranslateMessage(MSG* pMsg) {

if (::IsWindow(m_ToolTip.m_hWnd) && pMsg->hwnd == m_hWnd) {

switch(pMsg->message) {

case WM_LBUTTONDOWN:

case WM_MOUSEMOVE:

case WM_LBUTTONUP:

case WM_RBUTTONDOWN:

case WM_MBUTTONDOWN:

case WM_RBUTTONUP:

case WM_MBUTTONUP:

m_ToolTip.RelayEvent(pMsg);

break;

}

}

return CView::PreTranslateMessage(pMsg);

}

void CDTDemoView::OnMouseMove(UINT nFlags, CPoint point) {

if (::IsWindow(m_ToolTip.m_hWnd)) {

const CCircle* pCircleHit = HitTest(point);

if (!pCircleHit || pCircleHit != m_pCircleHit) {

// Activate() скрывает подсказку.

m_ToolTip.Activate(FALSE);

}

if (pCircleHit) {

m_ToolTip.Activate(TRUE);

m_pCircleHit = pCircleHit;

}

}

CView::OnMouseMove(nFlags, point);

}

CDTDemoView::OnInitialUpdate создает DataTip и подготавливает его к использованию. Я вызываю m_ToolTip.Create и передаю ей TTS_ALWAYSTIP, чтобы DataTip показывался независимо от того, активно приложение или нет. Затем я вызываю m_ToolTip.AddTool и передаю ей CDTDemoView, как окно, содержащее инструмент. Из-за того, что последние параметры в CToolTipCtrl::AddTool имеют значения по умолчанию (LPSTR_TEXTCALLBACK как текст подсказки, NULL для параметра lpRectTool и 0 для nIDTool), все окно будет считаться инструментом и нотификационное сообщение TTN_NEEDTEXT будет послано CDTDemoView. Эта сообщение позволяет мне установить текст подсказки в функции CDTDemoView::OnToolTipNeedText.

Я посылаю несколько сообщений элементу DataTip, чтобы подготовить его к использованию. TTM_SETMAXTIPWIDTH посылается с заведомо большим значением (SHRT_MAX) в параметре lParam для установки максимальной ширины подсказки. [2] для этой цели можно также использовать CToolTipCtrl::SetMaxTipWidth – прим.пер. Это заставляет элемент ToolTip распознавать символы новой строки в строке подсказки (новая возможность IE 4.0 Common Controls DLL). Затем я три раза посылаю сообщение TTM_SETDELAYTIME. [3] что эквивалентно CToolTipCtrl::SetDelayTime – прим.пер. В первый раз параметр wParam имеет значение TTDT_AUTOPOP, для установки времени, которое должно пройти до того, как ToolTip исчезнет. Время инициализируется в параметре lParam заведомо большим значением (SHRT_MAX), чтобы отключить автоисчезание подсказок. [4] справедливости ради нужно сказать, что значение SHRT_MAX дает задержку порядка 30 секунд, а не отключает автоисчезание полностью – прим.пер. Теперь я могу контролировать их время жизни. Во второй раз в wParam передается TTDT_INITIAL, что задает интервал между моментом остановки курсора мыши и первым появлением подсказки. Этот интервал устанавливается в 200 миллисекунд, поэтому подсказка появляется довольно быстро. И, наконец, TTDT_RESHOW устанавливает временной интервал между появлением следующей подсказки при перемещении курсора в другой круг. Этот интервал также установлен в 200 миллисекунд. Почему я не использовал CToolTipCtrl::SetDelayTime для установки интервалов? К сожалению, CToolTipCtrl::SetDelayTime позволяет задать только интервал для TTDT_AUTOMATIC.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

Представляем Вашему вниманию похожие книги на «Исчерпывающее руководство по написанию всплывающих подсказок» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


libcat.ru: книга без обложки
Роджер Желязны
Отзывы о книге «Исчерпывающее руководство по написанию всплывающих подсказок»

Обсуждение, отзывы о книге «Исчерпывающее руководство по написанию всплывающих подсказок» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x