在《深入淺出MFC》中看到了LineDDA這個函數,例子是一個字符串從上之下的一個移動,這次稍微改動了一點,講圖像進行移動。
首先我們來看這個函數的解釋:
BOOL LineDDA( int nXStart, // x-coordinate of starting point int nYStart, // y-coordinate of starting point int nXEnd, // x-coordinate of ending point int nYEnd, // y-coordinate of ending point LINEDDAPROC lpLineFunc, // callback function LPARAM lpData // application-defined data );
其中:
nXStart是運動的起始點的x座標值;
nYStart是運動起點的y座標值;
nXEnd是運動終點的x座標值;
nYEnd是運動終點的y座標值;
lpLineFunc指向回調函數的函數指針;
lpData可以是用戶自定義的數據,例如:CDC或CPaintDC.
作用:該函數先計算出從起點到終點上的每個點的座標,對於每個點都調用一次lpLineFunc對應的回調函數。
下面我們再介紹下對應回調函數的解釋:
VOID CALLBACK LineDDAProc( int X, // x-coordinate of point int Y, // y-coordinate of point LPARAM lpData // application-defined data );
其中:
x:點的x座標
y:點的y座標
lpData:就是LineDDA函數的lpData
講了這麼多,我想是時候給出實現的代碼了。
第一步:在我們的CXView頭文件中聲明LineDDAProc這個回調函數:
注意:最好是將這個函數定義爲static,這樣可以消除系統對該函數添加的this指針。
第二步:定義LineDDAProc這個回調函數:
第三步:在OnDraw中調用函數LineDDA
說明一下,LineDDA函數的第三個參數也可以是(LPARAM)(LPVOID)pDC。
好,這樣就實現了我們圖片移動的功能了!寫得很粗糙,有時間再來改一下,這裏仍然有兩個問題存在:
1.在圖片移動的時候,會留下陰影,怎樣去除?
2.CClientDC和CPaintDC到底有什麼區別,在OnDraw()函數中,好像只有使用到CClientDC纔有效的樣子。