1. 程式人生 > >VS2012下Win32簡單畫線功能實現

VS2012下Win32簡單畫線功能實現

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函式原型

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. 
函式含義是:從當前點用當前畫筆還直線到指定點(nXEnd/nYEnd)
三個引數的大概含義為:
 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;


 以上基本實現畫線功能,其中存在重繪的實現(視窗變化之前描繪的內容丟失),重繪功能在之後的文章中講解。

 再次感謝您的瀏覽,若您發現文中存在錯誤之處請及時之處,歡迎指教。