地理資訊系統常需繪製鐵路(虛實相間矩形)、河流(曲線)、海岸線(不規則折線)等符號。CDC 僅提供 LineTo、SetPixel 等基礎函式,逐點繪製效率極低且程式碼複雜。
LineDDA (Digital Differential Analyzer) 以回呼機制逐點計算線段像素座標,支援自定義繪製邏輯。
BOOL LineDDA(
int nXStart, int nYStart, // 起點
int nXEnd, int nYEnd, // 終點
LINEDDAPROC lpLineFunc, // 回呼函式指標
LPARAM lpData // 使用者自訂資料 (通常傳 CDC*)
);
回呼原型:
VOID CALLBACK LineDDAProc(int X, int Y, LPARAM lpData);
每個像素點 (不含終點) 會呼叫一次回呼,lpData 傳入 CDC* 即可在回呼中直接繪圖。
COLORREF g_crValue; // 全域色彩暫存
void CLineDDAView::DrawWave(CPoint ptFrom, CPoint ptTo, COLORREF crValue)
{
g_crValue = crValue;
CDC* pDC = GetDC();
LineDDA(ptFrom.x, ptFrom.y, ptTo.x, ptTo.y, (LINEDDAPROC)Proc, (LPARAM)pDC);
ReleaseDC(pDC);
}
VOID CALLBACK Proc(int X, int Y, LPARAM lpData)
{
CDC* pDC = (CDC*)lpData;
// 正弦波偏移:Y + sin(X) 形成波浪線
pDC->SetPixel(X, Y + (int)(10 * sin(X * 0.1)), g_crValue);
}
| 符號類型 | 回呼邏輯概念 |
|---|---|
| 鐵路 | 每 N 像素切換顏色:if (X % 8 < 4) 黑 else 白 |
| 虛線/點畫線 | 模 運算控制像素輸出開關 |
| 文字沿曲線排列 | 回呼中計算切線角度,TextOut 旋轉輸出字元 |
| 雙線平行軌道 | 同時在 (X, Y±offset) 繪製兩點 |
PolyLine 慢、不支援寬度/線型/筆刷等 GDI 進階屬性、需手動處理裝置座標與邏輯座標映射。Vista 以降建議使用 GDI+ GraphicsPath + CustomLineCap 或 Direct2D ID2D1GeometrySink 實作複雜筆觸,效能與視覺品質更優。