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

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

Тут можно читать онлайн Роджер Джек - Исчерпывающее руководство по написанию всплывающих подсказок - бесплатно полную версию книги (целиком). Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте LibKing.Ru (ЛибКинг) или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
libking
  • Название:
    Исчерпывающее руководство по написанию всплывающих подсказок
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Ваша оценка:

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

Исчерпывающее руководство по написанию всплывающих подсказок - описание и краткое содержание, автор Роджер Джек, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

Исчерпывающее руководство по написанию всплывающих подсказок - читать книгу онлайн бесплатно, автор Роджер Джек
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать

CDTDemoDoc унаследован от CDocument. В этом классе хранится массив объектов CCircle, а также определены функции CDTDemoDoc::GetCircleCount и CDTDemoDoc::GetCircle для доступа к информации об этом массиве. CDTDemoDoc::GetCircle принимает целочисленный индекс, указывающий на смещение в массиве. Объекты CCircle хранятся в переменной CDTDemoDoc::m_CircleArray размером CIRCLECOUNT. Я мог бы объявить этот массив как открытый (public), но не сделал этого по двум причинам. Во-первых, реализацию легче менять, если ее детали скрыты от внешнего мира. Допустим, я захочу в будущем использовать для реализации массива переменного размера шаблон CArray. Во-вторых, я хочу возвращать константные ссылки пользователям CDTDemoDoc::GetCircle, чтобы они не смогли случайно изменить объекты кругов в массиве. CDTDemoDoc::CDTDemoDoc вызывает CCircle::Initialize для каждого круга в массиве. CCircle::Initialize облегчает создание массивов фиксированного размера, потому что мне не нужно передавать параметры конструктору CCircle. В противном случае мне пришлось бы создавать массив динамически. Я использовал функцию rand для установки координат кругов. Генератор случайных чисел инициализируется текущим значением времени, поэтому довольно высока вероятность того, что позиция каждого круга будет разной каждый раз, когда вы запускаете приложение.

Класс CDTDemoView ответственен за отображение кругов и реализацию элементов DataTip (см. рис.8). В переменной CDTDemoView::m_ToolTip хранится элемент ToolTip, который выступает в качестве DataTip. Я хотел, чтобы этот пример показал вам, как использовать класс CToolTipCtrl напрямую, вместо использования функций класса CWnd. Однако, в данном случае, даже если я захотел использовать CWnd, я бы не смог, потому что мне нужен прямой доступ к элементу ToolTip, чтобы посылать ему сообщения. CWnd не предоставляет документированных способов доступа к создаваемому им элементу ToolTip, а я не хотел бы полагаться на детали конкретной реализации. CDTDemoView::m_pCircleHit хранит круг под курсором мыши. Если ни один из кругов не попадает под курсор мыши, CDTDemoView::m_pCircleHit может быть NULL.

Рис.8. DTDemoView

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

// DTDemoView.cpp : implementation of the CDTDemoView class

.

.

.

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

// CDTDemoView HitTest

const CCircle* CDTDemoView::HitTest(const CPoint& Point) {

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.

Читать дальше
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать


Роджер Джек читать все книги автора по порядку

Роджер Джек - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Исчерпывающее руководство по написанию всплывающих подсказок, автор: Роджер Джек. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
Большинство книг на сайте опубликовано легально на правах партнёрской программы ЛитРес. Если Ваша книга была опубликована с нарушениями авторских прав, пожалуйста, направьте Вашу жалобу на PGEgaHJlZj0ibWFpbHRvOmFidXNlQGxpYmtpbmcucnUiIHJlbD0ibm9mb2xsb3ciPmFidXNlQGxpYmtpbmcucnU8L2E+ или заполните форму обратной связи.
img img img img img