VS2012下Win32簡單畫線功能實現
阿新 • • 發佈:2019-01-03
Vs2012下Win32簡單畫線功能實現
本文章為個人見解,存在錯誤或解釋不清之處還請大家批評、講解,謝謝!
環境:
vs2012下新建“win32專案”,建立過程預設即可,建立之後就是可執行的簡單視窗介面。
(建立初始介面)
畫線
MoveToEx()
LineTo()
1、MoveToe函式原型
四個引數的大概含義為:BOOL MoveToEx( HDC hdc, // handle to device context int X, // x-coordinate of new current position int Y, // y-coordinate of new current position LPPOINT lpPoint // pointer to old current position ); Parameters hdc Handle to a device context. X Specifies the x-coordinate of the new position, in logical units. Y Specifies the y-coordinate of the new position, in logical units. lpPoint Pointer to a POINT structure in which the previous current position is stored. If this parameter is a NULL pointer, the previous position is not returned.
hdc 裝置上下文控制代碼,即你要操作的介面
x 新的點的X座標
y 新的點的Y座標
lpPoint 一個指向POINT結構的指標,用來存放上一個點的位置,若此引數為NULL,則不儲存上一個點的位置 一般此值設為NULL。
2、LineTo函式原型
函式含義是:從當前點用當前畫筆還直線到指定點(nXEnd/nYEnd)BOOL LineTo( HDC hdc, // device context handle int nXEnd, // x-coordinate of line's ending point int nYEnd // y-coordinate of line's ending point ); Parameters hdc Handle to a device context. nXEnd Specifies the x-coordinate of the line's ending point. nYEnd Specifies the y-coordinate of the line's ending point.
三個引數的大概含義為:
hdc 裝置上下文控制代碼,即你要操作介面
x 結束點的X座標
y 結束點的Y座標
3、功能實現
實現一下功能:通過滑鼠左鍵按下(LMouseDown)來獲取線條的起始點,在移動之後,滑鼠左鍵彈上位置為線條結束點,且此時畫線。
case WM_LBUTTONDOWN:
/*ptEnd.x=LOWORD(lParam);
ptEnd.y=HIWORD(lParam);*/
ptStart.x= GET_X_LPARAM(lParam); /*此處使用該方法是避免滑鼠移除操作視窗,而使得獲取位置發生錯誤 可以上面兩行程式碼比較理解*/ptStart.y= GET_Y_LPARAM(lParam); /*使用該方法需要 包含標頭檔案<windowsx.h>*/
ptEnd=ptStart;
break;
case WM_LBUTTONUP:
ptEnd.x= GET_X_LPARAM(lParam);
ptEnd.y= GET_Y_LPARAM(lParam);
MoveToEx(hdc,ptStart.x,ptStart.y,NULL);
LineTo(hdc,ptEnd.x,ptEnd.y);
break;
4、實現的基本效果
5、存在問題
你在執行是可以發現,在畫線的過程中會存在中間過程看不見的問題,一下我們解決這個問題。
首先移動過程是發生在按下之後,因此需要記錄按下狀態
case WM_MOUSEMOVE:
if(bMouseDown) //bMouseDown記錄操作過程中是否按下滑鼠
{
hdc=GetDC(hWnd);
SetROP2(hdc,R2_NOT);
MoveToEx(hdc,ptStart.x,ptStart.y,NULL);
LineTo(hdc,ptEnd.x,ptEnd.y);
ptEnd.x=GET_X_LPARAM(lParam);
ptEnd.y=GET_Y_LPARAM(lParam);
MoveToEx(hdc,ptStart.x,ptStart.y,NULL);
LineTo(hdc,ptEnd.x,ptEnd.y);
ReleaseDC(hWnd,hdc);
}
break;
以上基本實現畫線功能,其中存在重繪的實現(視窗變化之前描繪的內容丟失),重繪功能在之後的文章中講解。
再次感謝您的瀏覽,若您發現文中存在錯誤之處請及時之處,歡迎指教。