Исчерпывающее руководство по написанию всплывающих подсказок - [6]
> 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] Это заставляет элемент ToolTip распознавать символы новой строки в строке подсказки (новая возможность IE 4.0 Common Controls DLL). Затем я три раза посылаю сообщение TTM_SETDELAYTIME.[3] В первый раз параметр wParam имеет значение TTDT_AUTOPOP, для установки времени, которое должно пройти до того, как ToolTip исчезнет. Время инициализируется в параметре lParam заведомо большим значением (SHRT_MAX), чтобы отключить автоисчезание подсказок.[4] Теперь я могу контролировать их время жизни. Во второй раз в wParam передается TTDT_INITIAL, что задает интервал между моментом остановки курсора мыши и первым появлением подсказки. Этот интервал устанавливается в 200 миллисекунд, поэтому подсказка появляется довольно быстро. И, наконец, TTDT_RESHOW устанавливает временной интервал между появлением следующей подсказки при перемещении курсора в другой круг. Этот интервал также установлен в 200 миллисекунд. Почему я не использовал CToolTipCtrl::SetDelayTime для установки интервалов? К сожалению, CToolTipCtrl::SetDelayTime позволяет задать только интервал для TTDT_AUTOMATIC.
Реализации CDTDemoView::OnDraw и CDTDemoView::HitTest довольно прозрачны. CDTDemoView::OnDraw проходит по массиву кругов, вызывая для каждого круга CCircle::Draw. Функция CDTDemoView::HitTest проверяет, находится ли переданная ему точка над каким-нибудь кругом, вызывая для каждого круга в массиве CCircle::HitTest. Обратите внимание, что эта проверка выполняется в порядке, обратном используемому в CDTDemoView::OnDraw. Это делается для учитывания z-сортировки (z-order) кругов. Например, если круг Б нарисован поверх круга A, тогда сначала должна вызваться функция проверки круга Б.
Функция CDTDemoView::OnToolTipNeedText перехватывает нотификационные сообщения TTN_NEEDTEXT от элемента, на который указывает переменная m_ToolTip. Главное предназначение этой функции – определить, над каким кругом находится курсор и определить текст подсказки. Сначала она получает координаты курсора мыши и конвертирует их в клиентскую систему координат. Затем идет проверка на принадлежность координат клиентской части представления. Если этого не сделать, пропадут подсказки на панели инструментов, так как нотификационное сообщение TTN_NEEDTEXT используется также панелью инструментов. CDTDemoView::OnToolTipNeedText автоматически будет получать все сообщения TTN_NEEDTEXT при активном окне представления. Переменная bHandledNotify показывает, должно ли сообщение передаваться дальше главному окну. Если курсор находится в клиентской части окна, я проверяю его координаты на принадлежность какому-нибудь кругу и сохраняю результаты проверки в переменной m_pCircleHit. Эта переменная также используется в функции CDTDemoView::OnMouseMove. Если курсор попадает в один из кругов, я создаю строку подсказки, в которую заношу координаты центра, радиус и цвет круга. Эта строка копируется в поле szText переданной структуры TOOLTIPTEXT. И, наконец, я устанавливаю цвет текста подсказки с помощью сообщения TTM_SETTIPTEXTCOLOR.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.