VB鼠標繪圖基礎資料總結
2024-07-21 02:25:39
供稿:網友
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)。