4

WinAPIGDIメソッドを使用してHPENを作成します。

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

MoveToEx次に、メソッドとを使用して線を描画しLineToます。

実際、描かれた線は破線です。空の3ピクセル、色付きの3ピクセル-破線。

PS_DOTスタイルが点線を描画しないのはなぜですか?WinAPIを使用して点線を描画する方法は?

4

4 に答える 4

5


これは、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 );

それはうまくいきます!

于 2009-02-12T14:00:10.723 に答える
1

私も過去にこの問題を抱えていました。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 を使用しました。それはうまく機能し、便利な線種を増やしました。

于 2009-02-12T13:27:43.640 に答える
0

私はこれを試していませんが、からの結果を確認する価値があるかもしれません

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

ペンの幅がゼロの場合、デバイスコンテキストに関連付けられているスケーリングに関係なく、GDIは常にペンを1ピクセル幅にします。これは、必要なドットを取得するのに十分な場合があります。

于 2009-02-12T13:22:19.020 に答える