Роджер Джек - Исчерпывающее руководство по написанию всплывающих подсказок
Здесь есть возможность читать онлайн «Роджер Джек - Исчерпывающее руководство по написанию всплывающих подсказок» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.
- Название:Исчерпывающее руководство по написанию всплывающих подсказок
- Автор:
- Жанр:
- Год:неизвестен
- ISBN:нет данных
- Рейтинг книги:5 / 5. Голосов: 1
-
Избранное:Добавить в избранное
- Отзывы:
-
Ваша оценка:
- 100
- 1
- 2
- 3
- 4
- 5
Исчерпывающее руководство по написанию всплывающих подсказок: краткое содержание, описание и аннотация
Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Исчерпывающее руководство по написанию всплывающих подсказок»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.
Исчерпывающее руководство по написанию всплывающих подсказок — читать онлайн бесплатно полную книгу (весь текст) целиком
Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Исчерпывающее руководство по написанию всплывающих подсказок», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.
Интервал:
Закладка:
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.
Интервал:
Закладка:
Похожие книги на «Исчерпывающее руководство по написанию всплывающих подсказок»
Представляем Вашему вниманию похожие книги на «Исчерпывающее руководство по написанию всплывающих подсказок» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.
Обсуждение, отзывы о книге «Исчерпывающее руководство по написанию всплывающих подсказок» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.