Zeichenmarkierungen
Sie können die Linienfunktionen verwenden, um Marker zu zeichnen. Ein Marker ist ein Symbol, das über einem Punkt zentriert ist. Zeichnungsanwendungen verwenden Marker, um Startpunkte, Endpunkte und Kontrollpunkte festzulegen. Tabellenkalkulationsanwendungen verwenden Marker, um Sehenswürdigkeiten in einem Diagramm oder Diagramm festzulegen.
Im folgenden Codebeispiel erstellt die anwendungsdefinierte Marker-Funktion mithilfe der Funktionen MoveToEx und LineTo einen Marker. Diese Funktionen zeichnen zwei sich überschneidende Linien mit einer Länge von 20 Pixeln, die über den Cursorkoordinaten zentriert sind.
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);
}
Das System speichert die Koordinaten des Cursors im lParam-Parameter der WM_LBUTTONDOWN Nachricht, wenn der Benutzer die linke Maustaste drückt. Der folgende Code veranschaulicht, wie eine Anwendung diese Koordinaten abruft, bestimmt, ob sie in ihrem Clientbereich liegen, und übergibt sie an die Marker-Funktion, um den Marker zu zeichnen.
// Line- and arc-drawing variables
static BOOL bCollectPoints;
static POINT ptMouseDown[32];
static int index;
POINTS ptTmp;
RECT rc;
case WM_LBUTTONDOWN:
if (bCollectPoints && index < 32)
{
// Create the region from the client area.
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;
// Test for a hit in the client rectangle.
if (PtInRegion(hrgn, ptMouseDown[index].x,
ptMouseDown[index].y))
{
// If a hit occurs, record the mouse coords.
Marker(ptMouseDown[index].x, ptMouseDown[index].y,
hwnd);
index++;
}
}
break;