Вы можете использовать функции линии, чтобы рисовать маркеры. Маркер - это символ, расположенный над точкой. Рисующие программы используют маркеры, чтобы определять начальные, конечные и контрольные точки. Приложения электронной таблицы используют маркеры, чтобы обозначить важные точки на диаграмме или графике.
В нижеследующем образце кода, определяемая приложением функция Marker создает маркер при помощи использования функции MoveToEx и LineTo. Эти функции рисуют две пересекающихся линии, 20 пикселей по длине, расположенных в центре по координатам курсора.
void Marker(LONG x, LONG y, HWND hwnd) { HDC hdc; hdc = GetDC(hwnd); MoveToEx(hdc, (int) x - 10, (int) y, (LPPOINT) NULL); LineTo(hdc, (int) x + 10, (int) y); MoveToEx(hdc, (int) x, (int) y - 10, (LPPOINT) NULL); LineTo(hdc, (int) x, (int) y + 10); ReleaseDC(hwnd, hdc); } |
Система хранит координаты курсора в параметре lParam сообщения WM_LBUTTONDOWN, когда пользователь нажимает левую кнопку мыши. Нижеследующий код демонстрирует, как приложение получает эти координаты, устанавливает, находятся ли они в пределах его рабочей области и пересылает их в функцию Marker, чтобы нарисовать маркер.
// Переменные рисующие линию и дугу static BOOL bCollectPoints; static POINT ptMouseDown[32]; static int index; POINTS ptTmp; RECT rc; case WM_LBUTTONDOWN: if (bCollectPoints && index < 32) { // Создаем регион из рабочей области. GetClientRect(hwnd, &rc); hrgn = CreateRectRgn(rc.left, rc.top, rc.right, rc.bottom); ptTmp = MAKEPOINTS((POINTS FAR *) lParam); ptMouseDown[index].x = (LONG) ptTmp.x; ptMouseDown[index].y = (LONG) ptTmp.y; // Проверка на совпадение в рабочем прямоугольнике. if (PtInRegion(hrgn, ptMouseDown[index].x, ptMouseDown[index].y)) { // Если совпадение происходит, запись координаты мыши. Marker(ptMouseDown[index].x, ptMouseDown[index].y, hwnd); index++; } } break; |