GIS 軟體常需繪製鐵路、河流、海岸線等固定風格但幾何形狀多變的符號。MFC CDC 僅提供基礎繪圖函式,直接組合效率低。Win32 API LineDDA 透過回呼機制,提供高效繪製複雜線條的解決方案。
BOOL LineDDA(
int nXStart, int nYStart, // 起點座標
int nXEnd, int nYEnd, // 終點座標
LINEDDAPROC lpLineFunc, // 回呼函式指標
LPARAM lpData // 應用程式自訂資料指標
);
回呼函式簽章:
VOID CALLBACK LineDDAProc(int X, int Y, LPARAM lpData);
回呼函式會在線段上每個像素點(除終點外)被呼叫,lpData 通常傳遞 CDC* 以便在回呼中繪圖。
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)sin(X), g_crValue);
}
TextOut| 優點 | 缺點 |
|---|---|
| 系統級實作,效能優於手工像素運算 | 僅支援直線段,曲線需自行切分 |
| 回呼機制靈活,可實作任意像素級邏輯 | MFC 無直接封裝,需自行包裝 |
| 解決 CDC 基礎函式無法表達的複雜線型 | 繪圖座標受限於裝置解析度與映射模式 |
LineDDA 為複雜線條繪製提供系統級解決方案。透過回呼函式封裝領域邏輯,可建構可復用的繪圖基元庫,顯著提升 GIS 類應用繪圖效能與程式碼維護性。測試環境:Windows 98 + VC++ 6.0 編譯通過。