WinAPIGDIメソッドを使用してHPENを作成します。
HPEN hPen = CreatePen(PS_DOT, 1, color);
MoveToEx
次に、メソッドとを使用して線を描画しLineTo
ます。
実際、描かれた線は破線です。空の3ピクセル、色付きの3ピクセル-破線。
PS_DOTスタイルが点線を描画しないのはなぜですか?WinAPIを使用して点線を描画する方法は?
これは、CodeProject ( http://www.codeproject.com/KB/GDI/DOTTED_PEN.aspx )で見つけた MaxHacher による素晴らしいソリューションです。
LOGBRUSH LogBrush;
LogBrush.lbColor = color;
LogBrush.lbStyle = PS_SOLID;
HPEN hPen = ExtCreatePen( PS_COSMETIC | PS_ALTERNATE, 1, &LogBrush, 0, NULL );
それはうまくいきます!
私も過去にこの問題を抱えていました。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 を使用しました。それはうまく機能し、便利な線種を増やしました。
私はこれを試していませんが、からの結果を確認する価値があるかもしれません
HPEN hPen = CreatePen(PS_DOT, 0, color);
ペンの幅がゼロの場合、デバイスコンテキストに関連付けられているスケーリングに関係なく、GDIは常にペンを1ピクセル幅にします。これは、必要なドットを取得するのに十分な場合があります。