Исчерпывающее руководство по написанию всплывающих подсказок - [5]
>///////////////////////////////////////////////////////////////////////////// // CCircle hittesting
>inline double Square(int n) { return (double(n) * double(n)); }
>BOOL CCircle::HitTest(const CPoint& Point) const {
> CPoint Diff = m_CenterPoint – Point;
> return ((Square(Diff.x) + Square(Diff.y)) <= Square(m_nRadius));
>}
CCircle::Draw принимает указатель на контекст устройства, в котором круг должен себя нарисовать. Функция вычисляет координаты квадрата, в который будет вписан круг, создает кисть нужного цвета, после чего использует CDC::Ellipse, чтобы нарисовать круг в контексте устройства. CCircle::HitTest принимает координаты тестируемой точки и использует теорему Пифагора (a² + b² = c²) для определения принадлежности точки окну, сравнивая c2 с радиусом круга. Я определил встроенную функцию Square (возведение в квадрат), чтобы повысить читабельность кода. Встроенные методы CCircle::GetColor, CCircle::GetCenter, и CCircle::GetRadius возвращают, соответственно, переменные класса m_Color, m_CenterPoint, и m_nRadius. Я описал эти функции, а также функции CCircle::Draw и CCircle::HitTest как константные, поскольку они не изменяют внутреннее состояние класса. Другими словами, они сохраняют константность класса. Это хороший стиль программирования, потому что он позволяет вам использовать константные экземпляры CCircle.
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();
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.