VB滑鼠繪圖基礎資料總結

來源:互聯網
上載者:User
VB滑鼠繪圖基礎資料總結

鑒於上半年編寫過滑鼠繪圖的程式,在此將以前搜集的資料總結一下,給那些以前和我一樣到處搜尋的VB愛好者們一點方便,同時歡迎交流和指正。
這裡我盡量寫的羅嗦又羅嗦一些,希望大家不要怪我。因為我們很多的資料都是理論性太強了,實用性或者說教人怎麼用,太弱了。我希望能夠羅嗦明白一點。
我也是一個VB剛剛入門的人,把有限的經驗寫出來和大家分享。

前言
滑鼠繪圖可以說是每一個VB編程者都想必定要嘗試和鍛煉的一個項目。學會了滑鼠繪圖,你就學會了Windows的滑鼠操作,螢幕模映射模式,繪圖模式,Windows的GDI(圖形裝置介面)。
你會知道,電腦的裝置都是有限的,也就是說資源是有限的,這裡的資源,就是說的記憶體,電腦螢幕,滑鼠還有鍵盤,還有一些GDI對象,比如說畫筆,畫刷,調色盤。
有些資源,你用了別人(這裡說的是別的應用程式)就不能夠用,比如說你的應用程式捕捉了滑鼠(至於為什麼要捕捉滑鼠,後面再說),卻不釋放滑鼠,這樣別人的應用程式就得不到滑鼠訊息(不懂Windows訊息機制的人應該稍微學習一下Windows的訊息,和訊息響應機制。滑鼠繪圖不就是Windows把訊息傳給我們的程式,然後有我們的程式處理麼。。。)了,別人的應用程式就沒有辦法用滑鼠操作了。所以獨佔系統資源的應用程式,應該是一個程式員竭力避免的。也是作業系統不允許的。作業系統就是一個調劑應用程式的大程式,也是一個管理硬體,分配資源的底層程式,它的層級比你的程式的層級高,所以它能夠管你的應用程式。你要使用系統資源,就必須向作業系統請求,得到分配之後,你才可以使用。
滑鼠繪圖,就是在一個畫布(你的應用程式的客戶區),上使用滑鼠畫畫。畫出來的是向量模式的圖形,你也可以轉換為柵格模式的映像。這裡,你要理解的是:什麼是客戶區,相信很多人編程式很久了,都不知道什麼是客戶區。什麼是向量模式的圖形,什麼又是柵格模式的映像,等等相關問題。
VB編程有一個好處,就是起點高,不像VC那樣什麼都要你自己弄,一點東西不會,你就會卡得死死的。控制項拖放是多麼的愜意啊,每一個程式員都應該站在別人的肩膀上,寫自己的程式。
我在寫程式的過程中,就是在別人的程式基礎上,通過改進或者修改,運用綜合和分析的基本思想,編自己的程式。這就叫做“拿來主義”。當然,同樣作為一個程式員,在使用了別人的東西之後,要對別人保有基本的尊重,比如保留別人的著作權聲明(如果有的話,或者你知道的話);發郵件給他本人,告訴他你用了他的東西,向他請教問題;在程式的關於對話方塊中,對無償或者有償提供了各種協助的人,表示感謝;同時也聲明自己的著作權,保留權利,提出警告等等。

下面,我就把自己以前收集的關於滑鼠繪圖的資料進行一個匯總,並把自己在編程式的過程中得到的經驗總結一下。

首先,給大家一個目錄索引。
1、介面製作
2、滑鼠功能和操作
3、客戶區,視窗,螢幕
4、滾動繪圖區
5、螢幕映射模式,繪圖模式
、橡皮筋框的原理
、GDI和繪圖函數
、畫筆,畫刷,填充模式
、繪圖步驟
、繪圖結果的儲存
、結語

介面製作
介面的製作永遠令人心煩,你有可能用一天就寫完了你的代碼,但是你的介面你可能會消耗你一個星期的時間。所以這裡我提了一下介面製作的問題。同樣,製作好的介面,可以在別人的基礎上做,也可以自己做(如果你有時間和耐性的話)。由於製作介面不是一篇文字能夠說明的,所以這裡我提供自己的介面給大家。很簡單,不要見笑。同時也提供原始碼,不要給我發郵件,因為我可能沒有時間回複你要原始碼的要求。請登陸我的郵箱:@.com,密碼是:。登陸之後進入送件箱,在郵件地址中寫下你自己的郵箱,轉寄到你自己的郵箱即可。不過拜託你不要修改密碼,畢竟不是你一個人要用的。
我的介面如下圖:

滑鼠功能和操作
滑鼠一般有兩個鍵,中鍵滾輪可以不考慮,因為在滑鼠繪圖過程中幾乎不用。
正是由於有兩個鍵,所以就要動動腦子,想想怎樣把它們全部派上用場。在程式裡,我們使用取色工具的時候,就用左鍵點擊取得前景色彩,右鍵點擊取得背景色,很好的利用了這兩個鍵。
它的功能就是點擊,拖拉,移動。
你點擊,可能是要畫點,點多大,就看你的畫筆,畫刷的大小了。拖拉,一般用於畫直線,矩形,和橢圓之類。你移動它,是要改變你繪圖的位置,繪製圖形的大小或者使用滑鼠隨意繪圖。
滑鼠的的操作當然是看使用者的意圖了,點擊可能是要選擇,要繪圖,拖拉可能就是要選擇範圍,繪製圖形;移動就是你要幹點別的。所以你在使用的過程中,當然不希望你的滑鼠不聽你的話,你要點的時候,就是什麼也點不出來,你鬆開了滑鼠,但是程式卻還在繪圖(只要你移動滑鼠的話)。所以我們要在應用程式中完全控制自己的滑鼠,按自己的意願工作,就得判斷滑鼠的狀態,是按下了,哪個鍵按下了,有沒有移動,鬆開了沒有,等等,對這些情況,然後正確響應滑鼠訊息。不過由於繪圖有很多工具,所以我們要設定一些變數來標誌我們正在使用的工具,從而在響應滑鼠的各種訊息時,根據工具的不同,繪出不同的效果來。比如畫點,噴槍效果,取色工具,填充工具,選擇工具等等。

之所以談談滑鼠操作,是因為每一次繪圖都是按照一定的步驟進行的,每個步驟響應的訊息也不一樣。在我的程式中,我覺得應該是在滑鼠按下的狀態下進行繪圖操作。對於畫直線,就有三個步驟。第一步,先單擊(響應滑鼠按下,鬆開的訊息)確定一個起點,第二步移動到目的位置(響應滑鼠移動的訊息),第三步單擊確定終點(響應滑鼠按下,鬆開的訊息)。可見,單單這樣一個簡單的繪直線操作中,就對滑鼠的幾種訊息都有響應。所以我們在選中了每一個繪圖工具之後,都應該詳細考慮在每一個步驟中如何響應滑鼠的三個基本訊息(按下,移動,鬆開),這可是個比較重要的問題。

滑鼠游標的問題:相信有些人還是有疑惑的,所以這裡羅嗦一下。如果你想在你的視窗的某個控制項上使用不同於Windows的預設游標,請這樣做:把這個控制項的MousePointer=vbCustom(它的值為99,表示是使用者自訂的,所以你也可以在程式中使用MousePointer=99),然後再把MouseIcon的Icon改為你自訂的游標檔案(點旁邊的"Icon..."按鈕,然後選擇一個游標檔案)。當然你也可以響應此控制項的MouseMove訊息來改變:
MousePointer=vbCustom
MouseIcon=LoadPicture("cursor.cur")
同時不要忘記在Form的MouseMove訊息中改回來,只要這一句就夠了:MousePointer=vbDefault,不然的話,你的Form上面就老是只有你自己定義的游標了。


題外話:如果你有四個滑鼠的話,你怎麼響應你的滑鼠訊息,Windows需要你自己響應嗎?(個人認為不會,不過可能需要互斥的處理每個滑鼠的訊息)說不定有一天,你可能會和別人(或許是你的Lover)一起畫畫呢,那樣就不用搶滑鼠了。。。


客戶區,視窗,螢幕
在VB程式中,一般使用PictureBox控制項來做繪圖區。由於有工具條,狀態列等控制項還有繪圖工具箱,顏料盒的存在,PictureBox一般不會佔滿所有的客戶區。
就我個人的理解,客戶區就是使用者可以自由使用的視窗部分。也就是除了標題列,菜單,捲軸,邊框,工具條,狀態列之外的地區。之所以除了這些地區,是因為你在繪圖程式中怎麼繪圖,Windows也不會讓你把圖形畫到這些視窗部分的上面的。文文書處理程式也是這樣的。因為這些範圍不屬於使用者可以自由操作的地區,所以除了這些地區之外的視窗部分,就叫做客戶區。有時候,客戶區還可能包括工具條,和狀態列佔用的那部分地區,這是因為一般的程式中工具條和狀態列佔用的地區,會由於二者的隱藏而重新給使用者使用,所以我覺得客戶區應該包括工具條和狀態列佔用的那部分視窗,因為這些是可以給使用者自由使用的,畢竟沒有工具條和狀態列,我們也照樣使用程式,而且繪圖的地區更大一點。
理解了客戶區,視窗的理解就很容易了,就是你的應用程式佔用螢幕的那一部分,你的視窗中的任何內容都不會繪製到別的應用程式的視窗中去。別人的也不會繪製到你的視窗中去。也就是說你在你的應用程式的視窗中看不到別的應用程式的視窗中的內容。
至於螢幕,這個就不用解釋了吧,你只用一個螢幕(顯示器的顯示部分),你肯定不可能看到螢幕之外的東西吧。不過你要是有兩個顯示器的話,你把視窗移動到螢幕邊緣,你會在另一個螢幕中看到在這一個螢幕中看不到的那部分視窗。你要是有三個螢幕的話,hoho,那就爽死了!!!羅嗦了這麼多,宗旨就是,系統資源是有限的,每個視窗會佔用一部分螢幕,客戶區和每個控制項(可見的)也會佔用一部分視窗。這些東西都會用光的(算我沒說)。

滾動繪圖區
我說的繪圖區,在VB裡面就是那個PictureBox控制項,但是PictureBox不支援滾動。圖片大了有的部分就不顯示出來,所以我們自己要讓他能夠滾動顯示超過PictureBox大小的內容。我不知道什麼方法是最好的,但是,經曆過一些事情之後,我覺得完成任務的方法是最好的方法。有時候,你可能為了尋找一種高效的,速度快的方法,或者說技術含量更高的方法,浪費了很多時間,還沒有達到目的。而在這個時間裡,你如果用最笨的方法,也許早就實現了你的功能。
這裡,奇技淫巧是我不提倡的。畢竟方法技巧不是目的,只是完成任務的手段。我隨便找了一種方法,能夠滾就行。

螢幕映射模式,繪圖模式
螢幕映射模式說的是這麼回事:就是圖形顯示的度量問題。你的顯示器可能是17英寸的純平彩顯(這個17英寸指的是對角線的長度),17英寸是多少厘米?43.18厘米(1英寸等於2.54厘米)。那麼又是多少像素呢?如果你的顯示器是使用1024*960像素模式的,你自己算算17英寸有多少像素,如果解析度是800*600像素模式的,再算算。如果說你的直線有3厘米長,但是在螢幕上呢,顯示器總是用像素來度量的,所以它要轉換為像素的度量,大約。而且,外國佬們最喜歡用的度量單位是英寸,VB裡面的控制項的寬高總是使用緹(Twips)(緹:計量單位,等於“磅”的 1/20,英寸的 1/1440。一厘米有 567 緹。像素(Pixels):監視器或印表機解析度的最小單位。如果你按右鍵案頭,選擇屬性,選擇“設定”選卡,單擊進階按鈕。裡面就會出現DPI設定。一般為“正常尺寸(96 DPI)”。DPI的意思就是 DPI (Dots per Inch)。因此我們可以得到如下換算公式:1 Twip = 1440 TPI / 96 DPI = 15 Pixels。順便說點別的計量單位:
磅:指列印的字元的高度的度量單位。1 磅等於 1/72 英寸,或大約等於 1 厘米的 1/28。
英寸:2.54 厘米
螢幕的映射模式就是說像素的長寬比,如果是1:1的話,就是像素就表現為一個正方形,如果不是的話,就是長方形。還有映射模式中提到就是用一厘米代替一米(甚至更多),因為我們的顯示器只有那麼大,要在這麼小的螢幕上顯示世界,就只有通過映射的方式把大的長度或者寬度映射到小的。這一點很像地圖的比例尺,1比多少萬。

繪圖模式說的又是另外一回事。在VB中用的是PictureBox的DrawMode屬性來設定的。要瞭解繪圖模式,先得說一下前景色彩和背景色。前景色彩就是畫布上所畫圖形的顏色,背景色就是畫布的顏色,如果前景色彩和背景色是一樣的,你將看不到所繪製的圖形。至於怎麼選擇前景色彩和背景色,就要看你的美術功底和欣賞力了。這裡假設前景色彩是黑色,背景色是白色,當你用滑鼠繪圖的時候,對於複製模式(DrawMode=vbCopyPen),你畫一條黑線就是一條黑線,前景色彩改為綠色,畫一條綠線就是一條綠線;對於反轉繪圖模式(DrawMode=vbInvert),你的前景色彩不論是黑色的還是紅色的,你畫的線條就永遠是背景色的反轉色--黑色,也就是說,不管前景色彩是什麼顏色,你畫直線,在螢幕上看到的都是黑色(背景色的反轉色,背景色為白色的時候)。利用這一個特性,我們就可以基本實現橡皮筋的技術了(見後面敘述)。

橡皮筋框的原理
橡皮筋框的功能就像這樣:用滑鼠點中起始位置,按住滑鼠鍵,移動滑鼠,這時滑鼠的當前位置就偏離了起始位置,然後就用PictureBox的Line函數,在滑鼠的起始位置和當前位置之間划出一個矩形框。“橡皮筋”這個術語就是因為這個框會隨著滑鼠的移動增大和減小而得名。當你鬆開滑鼠按鍵的時候,這個框就會保留在螢幕上。這個提示就告訴了你如何使用Visual Basic建立一個橡皮筋框。

使用Line方法在表單或者Picture Box控制項裡畫一個框是很容易的,但是橡皮筋這個功能需要你在滑鼠移動和畫新框的時候讓以前畫的的框消失。解決這個問題的方法就在DrawMode屬性裡。DrawMode的預設設定是vbCopyPen,繪製一根實線,但是這不符合我們的要求。相反,我們會使用vbInvert這個設定,這就意味著像Line方法這樣的劃線操作會使用與表單或者Picture Box控制項已有顏色相反的色調。因此,如果背景色是白色,那麼vbInvert就會畫一條黑線,反過來也一樣。調色盤裡的任何顏色都是這樣的,這就解決了兩個問題:

這個框相對於背景而言總是可見的。
如果我們再次這個框再畫一遍,那麼顏色就會再次反轉,成為與原始顏色相同的值,這樣視窗就不見了。

那麼,方法就是下面這樣的:
當使用者按滑鼠鍵的時候,滑鼠當前的座標會被記錄下來。這會用於定位框的角。同時,將“Drawing”標記(flag)設定為真(True)。
當滑鼠移動的時候,前一個框會被重新畫一次從而被刪掉。這一步在第一次劃框的時候是沒有的,但是在後來畫框都需要這一步。
當滑鼠移動的時候,在滑鼠起始座標和新座標之間畫一個框。
當滑鼠鍵被放開的時候,將“Drawing”標記設定為假(False)。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。