程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 如何在VB中實現繪圖區的大十字光標

如何在VB中實現繪圖區的大十字光標

編輯:VB綜合教程
有時,我們需要用VB快速開發一個試驗數據繪圖處理程序,將繪圖控件內的鼠標光標改變成與AutoCAD軟件中使用的大十字光標的形式,將可以比普通的箭頭光標達到更好的效果。那麼我們如何實現這樣的大十字光標呢?

----首先,我們明確一下要達到的效果,假若我們在一個Picture控件中繪圖,那麼,鼠標移動到這個控件上時,鼠標光標立即改變為大十字形狀,光標中的橫線從控件的左邊界到右邊界,豎線從控件的上邊界到下邊界,即大十字光標將繪圖控件分割為四個象限。當鼠標移動到控件外時,光標則又恢復成原來的形式。

----要實現這樣的光標,得我們自己通過畫線的方式實現。如鼠標在繪圖控件內,先在鼠標的當前位置畫上光標的橫線和豎線;當鼠標位置移動,先擦除原先的光標橫線和豎線,然後再在新的位置畫光標的橫線和豎線,那麼我們就要響應繪圖控件的MouseMove事件。當然,繪圖控件內無論有什麼內容,我們擦除光標線和重畫光標線時都不能破壞原先的內容,因此我們要將繪圖控件的DrawMode設置為vbXorPen(異或方式),繪制光標的橫線和豎線時,用異或的方式將橫線和豎線的象素點顏色設為光標的顏色和原先的象素點色彩的異或值,再用異或的方式在同樣的位置繪制一遍豎線和橫線,橫線和豎線上的象素點再一次和光標顏色進行異或操作,就擦除了光標的橫線和豎線,且又恢復了繪圖控件內原先的內容。

----我們還得保證鼠標移動到繪圖控件內時,普通的鼠標光標消失,只有繪制的大十字光標出現,因此還應該設置繪圖控件的MousePointer屬性為vbCuntom,即用戶自定義。繪圖控件的MousePointer屬性設置為vbCustom後,其MouseIcon屬性中應裝入相應的用戶自定義圖形,因為我們希望繪圖控件內只有我們繪制的光標,而沒有其它的光標,故應該裝入一個空的(透明的)光標圖形。可以任找一個光標文件,通過任意一個資源編輯器對其進行編輯,用透明的方式填充整個光標圖形,保存成我們所需的NoIcon.cur即可。

----通過以上的關鍵設置和操作,我們就可以實現大十字光標了。利用異或方式進行繪圖,我們還可以實現一般繪圖軟件中常有的“橡皮筋”效果,即用鼠標定義一個點後,動態拖動鼠標來定義另外一個點,動態拖動鼠標過程中,所要繪的圖形也動態相應變化。

----以下我們通過一個示例來完整實現繪圖控件中的大十字光標,還演示如何實現用“橡皮筋”效果來畫矩形:

----在VB中新建一個標准EXE工程,在Form1中加入一個Picture控件,其Name設為PicDraw,可以裝入一個圖象文件,PicDraw的大小和其中的圖象大小基本上覆蓋大部分的Form1即可。實現代碼如下所示。此程序在VB5.0中運行通過。

OptionExplicit
  PrivateOld_XAsSingle
  PrivateOld_YAsSingle
  PrivateisMouseDownAsBoolean
  PrivateBox_X0AsSingle
  PrivateBox_Y0AsSingle
  PrivateBox_X1AsSingle
  PrivateBox_Y1AsSingle
  PrivatePenColorAsLong
  PrivateCrossColorAsLong
  
  PrivateSubForm_Load()
  CrossColor=QBColor(8)
  PenColor=QBColor(15)
  picDraw.DrawMode=vbXorPen
  picDraw.MouseIcon=LoadPicture
  (App.Path&" o.cur")
  picDraw.MousePointer=vbCustom
  isMouseDown=False
  Box_X0=Box_X1=Box_Y0=Box_Y1=0
  EndSub
  
  PrivateSubpicDraw_MouseDown
  (ButtonAsInteger,
  ShiftAsInteger,XAsSingle,YAsSingle)
  IfisMouseDown=TrueThen
  '先前已經用鼠標定義了一個點
  Box_X1=X
  Box_Y1=Y
  isMouseDown=False
  picDraw.DrawMode=vbCopyPen
  picDraw.Line(Box_X0,Box_Y0)-
  (Box_X1,Box_Y1),
  PenColor,B
  picDraw.DrawMode=vbXorPen
  '畫一個光標
  picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y),
  CrossColor
  picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
  CrossColor
  Old_X=X
  Old_Y=Y
  Else
  '定義了一個矩形的第一個頂點,則擦除光標
  picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y),
  CrossColor
  picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
  CrossColor
  Box_X0=X
  Box_Y0=Y
  isMouseDown=True
  EndIf
  EndSub
  
  PrivateSubpicDraw_MouseMove(ButtonAsInteger,
  ShiftAsInteger,XAsSingle,YAsSingle)
  IfisMouseDown=TrueThen
  '拖動鼠標來定義矩形的另外一個頂點,
  此時擦除前一個矩形,繪制新的矩形
  picDraw.Line(Box_X0,Box_Y0)-(Old_X,Old_Y),
  PenColor,B
  picDraw.Line(Box_X0,Box_Y0)-(X,Y),PenColor,B
  Else
  '消除舊光標線
  picDraw.Line(0,Old_Y)-(picDraw.ScaleWidth,Old_Y),
  CrossColor
  picDraw.Line(Old_X,0)-(Old_X,picDraw.ScaleHeight),
  CrossColor
  '畫新的光標線
  picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y),
  CrossColor
  picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
  CrossColor
  EndIf
  Old_X=X
  Old_Y=Y
  EndSub->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved