圖XX-01XX-02-02 OnMouseMove事件的處理 在加上了OnMouseDown及OnMouseUp處理函式之後,我們只能畫出一條條直線,若是我們想要以滑鼠畫出不規則線段時,就必須再處理OnMouseMove事件,利用OnMouseMove事件,我們可以追縱到滑鼠移動的位置,簡單的OnMouseMove事件處理函式如下: void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X,int Y){Canvas->LineTo(X,Y);} 此程式的意義即在於將滑鼠所經過的每個點,以線條連接起來,在加上OnMouseMove 事件處理函式之後,它的執行結果會變成圖XX-02:
圖XX-02XX-02-03 滑鼠的處理的加強 前面的程式對於滑鼠的移動處理有部份考慮的不夠周詳,因為它在滑鼠移動時不分青紅皂白就將線畫在螢慕上,造成螢幕上的線條混亂,這并不是正規的處理方法,正確的處理方法應該如下: (1) 滑鼠鍵按下時,將記錄滑鼠按下的旗標設為True.同時將該點記錄下來,謂之原點。
XX-03 繪圖物件的定義 至目前為止,我們已經完成了一個簡單的涂鴉程式,接下來,我希望將程式擴充為一個一般的繪圖程式,它必須具備基本的畫線、畫圓、畫方等功能。為了要實作出這些功能,我們必須先定義我們的繪圖物件。 XX-03-01 繪圖物件之始CShape class CShape
圖XX-04 CLine繪圖物件范例。
圖XX-05 CPolyline繪圖物件范例(將程式改成new CPolyline) XX-04 工具列(ToolBar)的使用 到目前為止我們已經將所有繪圖物件定義完成,因此理論上你的程式應該可以畫出各種不同的繪圖物件了。但是前面我提到,目前我們尚未將繪圖物件的選擇功能實作出來,因此我們是以直接修改程式的方式來繪制不同的圖形。這是為了說明方便的權宜之計。 在一般的繪圖程式中都是以工具列的方式來實作出繪圖功能的切換功能,如Windows 95內的小畫家即是一典型例子。因此接下來我就為你說明在C++ Builder中實作出工具列的方法。
圖XX-06小畫家使用的工具列 在C++ Builder中實作工具列的方式和其他的程式如Visual C++,Borland C++ 不同。後兩者都是直接使用Windows 95內建的工具列型別來達到此功能。然而在C++ Builder中因為有一種更為簡單且直接的方式來做到,因此就不采用上述作法 (當然C++ Builder也可以用Windows 95內建的ToolBar型別,只是用法較為復雜。)。 那麼在C++ Builder中是如何來實作出工具列呢?說穿了其實很簡單:那就是利用TPanel和TSpeedButton。 CPanel是一個多功能的容器元件,因此我們可以用它來做為工具列的平臺,使用CPanel是因為它是少數幾個可做為容器元件的元件,所以它會自動調整置於其上的軟體元件的位置,因此很適合做為放置工具列的平臺。 注:在C++ Builder的程式模式中大量使用TPanel來做為容器元件。它除了可以做為ToolBar的平臺外,另外如狀態列 (StatusBar)也可以用它來完成,而且它也可以用來做為畫面分割的工具,來達成在MFC中類似分割視窗(Splitter Window)效果。 TSpeedButton快速按鈕元件在功能上本來就和工具列有幾分類似,現在我們可以將相同屬性的快速按鈕元件整合在一個TPanel中即可完成我們所要的工具列了。 最後我再將工具列的作法按部就班詳述之: (1) 在表格上加入TPanel元件。
圖XX-08 Glyph圖形之選取。 設定狀態初值:由於我們希望本程式執行的初始值是使用CLine元件,因此我將LineButton的Down屬性為True,其馀則為 False。
圖XX-10具備繪圖工具列的繪圖程式范例。新聞熱點
疑難解答