4 Stimmen

WinAPI - wie zeichnet man eine gepunktete Linie?

Ich erstelle HPEN mit der WinAPI-GDI-Methode:

HPEN hPen = CreatePen(PS_DOT, 1, color);

Zeichnen Sie dann eine Linie mit den Methoden MoveToEx y LineTo .

In der Tat ist die gezogene Linie gestrichelt . 3 Pixel leer, 3 Pixel mit Farbe - gestrichelte Linie.

Warum zeichnet der PS_DOT-Stil keine gepunktete Linie? Wie zeichnet man gepunktete Linien mit WinAPI?

5voto

user22814 Punkte 439

Hier ist eine wunderbare Lösung von MaxHacher, die ich auf CodeProject gefunden habe
( http://www.codeproject.com/KB/GDI/DOTTED_PEN.aspx )

LOGBRUSH LogBrush; LogBrush.lbColor = color; LogBrush.lbStyle = PS_SOLID; HPEN hPen = ExtCreatePen( PS_COSMETIC | PS_ALTERNATE, 1, &LogBrush, 0, NULL );

Es funktioniert gut!

1voto

SAMills Punkte 446

Auch ich hatte dieses Problem in der Vergangenheit. Ich habe LineDDA und ein Callback-Proc verwendet.

struct LineData{
    CDC* pDC;
    COLORREF crForegroundColor;
    COLORREF crBackgroundColor;
};
.
.
.
LineData* pData = new LineData;
pData->crForegroundColor = crForegroundColor;
pData->crBackgroundColor = crBackgroundColor;
pData->pDC = pdc;

LineDDA(nStartx, nStarty, nEndPointX, nEndPointY, LineDDAProc, (LPARAM) pData);
delete pData;
.
.
.

void 
LineDDAProc(int x, int y, LPARAM lpData)
{
   static short nTemp = 0;

   LineData* pData = (LineData*) lpData;

   if (nTemp == 1)
    pData->pDC->SetPixel(x, y, pData->crForegroundColor);
   else
    pData->pDC->SetPixel(x, y, pData->crBackgroundColor);
   nTemp = (nTemp + 1) % 2;
}

Es ist vielleicht nicht der effizienteste Zeichenalgorithmus, aber man hat jetzt auch die volle Kontrolle über die Punktabstände. Ich habe mich für diesen Ansatz entschieden, weil es andere nicht-native Stiftstile gab, die ich für das Rendering von Linien verwendet habe und die ein Bitmuster verwendeten. Ich habe dann das Bit durchlaufen lassen und setpixel für die 'on'-Bits verwendet. Das hat gut funktioniert und die Anzahl der nützlichen Linienstile erhöht.

0voto

DavidK Punkte 3834

Ich habe das nicht ausprobiert, aber es könnte sich lohnen, die Ergebnisse von

HPEN hPen = CreatePen(PS_DOT, 0, color);

Eine Stiftbreite von Null bewirkt, dass GDI den Stift immer ein Pixel breit macht, unabhängig von der mit dem Gerätekontext verbundenen Skalierung. Dies kann ausreichen, um die gewünschten Punkte zu erhalten.

0voto

Um zwei Pixel in einer Reihe zu vermeiden, habe ich dies anstelle des obigen Beispiels verwendet

void LineDDAProc(int x, int y, LPARAM lpData)
{
   LineData* pData = (LineData*) lpData;

   if (x%2!=y%2)
    pData->pDC->SetPixel(x, y, pData->crForegroundColor);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X