У меня тоже была эта проблема в прошлом. Я прибег к использованию LineDDA и обратному вызову.
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;
}
Возможно, это не самый эффективный алгоритм рисования, но теперь вы также полностью контролируете расстояние между точками. Я пошел с этим подходом, потому что были другие не родные стили пера, которые я использовал для рендеринга линий, которые использовали немного образца. Затем я прошелся по биту и использовал setpixel для включенных бит. Это работало хорошо и увеличило количество полезных стилей.