470 likes | 649 Views
VB6 的繪圖方法與常用函數. 常用繪圖方法( Method )指令. Cls Cl ear S creen ,清除螢幕 用點、線、圓 …. 等繪圖方法所畫出的圖形或是用 Print 輸出的字串,都可以用 Cls 方法來加以清除。 語法 [Object].Cls 物件 .Cls. 常用繪圖方法、指令 ( 續 ). Pset 用來畫任意顏色的點 語法 [Object.]Pset[Step](X, Y)[, color]
E N D
常用繪圖方法(Method)指令 • Cls • Clear Screen,清除螢幕 • 用點、線、圓….等繪圖方法所畫出的圖形或是用 Print 輸出的字串,都可以用Cls 方法來加以清除。 • 語法 • [Object].Cls 物件.Cls
常用繪圖方法、指令(續) • Pset • 用來畫任意顏色的點 • 語法 • [Object.]Pset[Step](X, Y)[, color] • 其中的 X, Y 是單精度變數,因此可以使用小數數值、變數。如果不指定 color 引數,就以 ForeColor 屬性的顏色為顏色。 • 如果將color 引數,設定為 BackColor就會有「消除」的效果。
Picture1 AutoRedraw : True DrawWidth : 5 常用繪圖方法、指令(續) • Point • 可以讀取任意點的顏色值 • 語法 • [Object.]Point(X, Y)
常用繪圖方法、指令(續) • Line • 畫一條線 • 語法 • B:畫框 • BF:畫框且填滿 [Object.]Line[[Step](X1, Y1)] – [Step](X2, Y2) ,[Color][, B[F]]] Line (X1, Y1)-(X2, Y2) Line –(X1, Y1)
常用繪圖方法、指令(續) • Circle • 畫圓 • 語法 • Radius:半徑 • Start:弧的起點 • End:弧的終點 • Aspec:長短軸比 [Object.]Circle Step (X, Y), Radius, Color, Start, End, Aspec
牛刀小試(1) • 試寫一程式,模擬小畫家的噴霧、畫筆與畫線的功能
牛刀小試(1)---續 Picture1Box *1 CommandButton *8 Shape *16
牛刀小試(1)---續 • 屬性設定 • PictureBox (Picture1) • AutoRedraw:True • Appearance:0 – 平面 • BorderStyle:1 – 單線固定 • ScaleMode:3 – 像素 • Shape (Shape1(0)~(15)) • CommandButton (Command1~5) • Caption:如圖示 • Command4(0)~(3)表示線條寬度設定
牛刀小試(1)---續 全域變數宣告: mode1噴霧、2畫筆、3畫線 ttt滑鼠左鍵點選的狀態0第一次點選、1第二次點選 xx, yy記錄滑鼠第一次點選的座標 selcolor從調色盤選取的顏色值 ttt的起始值設為0 Picture1的起始線條寬度為1 填充Shape1,建立調色盤 當滑鼠的左鍵點選調色盤後,將色碼值 指派給selcolor變數
牛刀小試(1)---續 當按下Command1設定為「噴霧」 當按下Command2設定為「畫筆」 當按下Command3設定為「畫筆」 當按下Command4(0)~(3)時按所對應 Index的Caption設定Picture1的 線條寬度 當按下Command5時,清空Picture1的 內容
牛刀小試(1)---續 當mode=1時(噴霧) ,以滑鼠所點選的位置座標為 中心,上下左右各延伸十個像素,以亂數取20個 座標點,分別畫上一點 當mode=2時(畫筆) ,以滑鼠第一次點選的位置為 基準繪上一點,並令ttt變數值為1,倘若第二次點 選滑鼠,則令ttt變數值為0 當mode=3時(畫線) ,以滑鼠第一次點選的位置為 基準繪上一點,並令ttt變數值為1,以xx及yy變數 記錄起點,倘若第二次點選滑鼠,則令ttt變數值為 0,且於(xx,yy)到第二次的點選點繪製一條線 當mode=2且ttt=1時,移動滑鼠的同時,於Picture1 上繪製前一個座標到目前座標間的線條
常用的字串函數 • Left() • 傳回字串左邊指定數量的字元 • 語法 • Left_str=Left(Str, n) • 將Str字串的左邊n個字元放到Left_str中 • n為小數時,則系統會自動將n以四捨五入轉成整數型態 • 如果n>Str的長度時,將傳回全部字串 Str=“ABCDEFG” sss=Left(Str,3) sss=“ABC”
常用的字串函數(續) • Right() • 傳回字串右邊指定數量的字元 • 語法 • Right_str=Right(Str, n) • 將Str字串的右邊n個字元放到Right_str中 • n為小數時,則系統會自動將n以四捨五入轉成整數型態 • 如果n>Str的長度時,將傳回全部字串 Str=“ABCDEFG” sss=Right(Str,3) sss=“EFG”
常用的字串函數(續) • Mid() • 傳回字串中間指定數量的字元 • 語法 • Mid_str=Mid(Str,n) • 將Str字串的第n個字元起後的全部字元放到Mid_str中 • Mid_str=Mid(Str,n,m) • 將Str字串的第n個字元起後的m個字元放到Mid_str中 Str=“ABCDEFG” sss=Mid(Str,3) Str=“ABCDEFG” sss=Mid(Str,3,4) sss=“CDEFG” sss=“CDEF”
常用的字串函數(續) • Len() • 傳回字串的長度 • 語法 • Len_str=Len(Str) • 將Str字串長度的值放到Len_str中 Str=“ABCDEFG” sss=Len(Str) sss=7
常用的字串函數(續) • LTrim() 、Trim() 、RTrim() • 刪除字串中的空白字元 • L_str=LTrim(Str) • 傳回Str字串左邊不含空白字元的字串 • T_str=Trim(Str) • 傳回Str字串左右兩邊不含空白字元的字串 • R_str=RTrim(Str) • 傳回Str字串右邊不含空白字元的字串 Str=“ ABCD ” sss=Trim(Str) sss=“ABCD” Str=“ ABCD ” sss=LTrim(Str) Str=“ ABCD ” sss=RTrim(Str) sss=“ABCD ” sss=“ ABCD”
常用的字串函數(續) • Space() • 重複空白字元 • 語法 • Space_str=Space(n) • 傳回n個空白的字元 Str1=“ABCD” Str2=“EFGH” sss=Str1+Space(3)+Str2 sss=“ABCD EFGH”
常用的字串函數(續) • String() • 重複特定字元 • 語法 • String_str=String(n,Str) • 傳回n個Str字串的第一個字元 Str=“ABCD” sss=String(4,Str) sss=“AAAA”
常用的字串函數(續) • Chr() • Ascii碼轉成字元 • 語法 • Chr_str=Chr(Str) • 將數值資料轉成相對應的Ascii字元 • Asc() • 字元轉成Ascii碼 • 語法 • Asc_str=Asc(Str) • 傳回Str字串的第一個字元轉成Ascii碼 Str=“ABCD” sss=Asc(Str) Str=65 sss=Chr(Str) sss=65 sss=“A”
常用的字串函數(續) • Spc() • 移位函數 • 語法 • Spc(n) • 目前游標所在位置開始,向右邊插入n個空白字元 • 與Print指令搭配使用 • Tab() • 定位函數 • 語法 • Tab(n) • 目前游標所在行的最前面開始,向右邊移動n個位置 • 與Print指令搭配使用
常用的轉換函數 vbTrue:小數點前要補0 vbFalse:小數點前不補0 • Int_str=Val(Str) • 將字串轉為數值型態 • Str_str=Str(Int) • 將數值轉為字串型態 • CV=FormatCurrency(X,n,vbTrue 或 vbFalse) • 將數值資料轉為貨幣值格式 • FP=FormatPercent (X,n,vbTrue 或 vbFalse) • 將數值資料格式化為百分比格式 數值資料 小數位數
常用的轉換函數(續) • FN=FormatNumber (X,n,vbTrue 或 vbFalse) • 將數值資料格式化 • DV=FormatDateTime(X,[顯示日期時間的格式]) • 假令X=#5/5/2003 10:10:19 PM# • 則顯示日期時間的格式為 • 0 日期與時間 2003/5/5 PM 10:10:19 • 1 完整日期 2003年5月5日 • 2 簡短日期 2003/5/5 • 3 完整時間 PM 10:10:19 • 4 24小時格式 22:10
常用的轉換函數(續) • Week_name=WeekdayName(Str) • 傳回星期的名稱給Week_name • Month_name=MonthName(Str) • 傳回月份的名稱給Month_name • Reverse_str=StrReverse(Str) • 將字串Str反轉後回傳給Reverse_str • Join_str=Join(Str_Array,[d]) • 將字串陣列組合成一個字串,d代表分隔字元
常用的數學函數 • Sgn(X) • CInt(X) • Clog(X) • Int(X) • Fix(X) • Sqr(X) • Hex(X) • Oct(X) • Round(X,n) 符號函數 轉為整數函數 轉為長整數函數 求絕對值 • Abs(X) • Sin(X) • Cos(X) • Tan(X) • Atn(X) • Exp(X) • Log(X) • Rnd(X) 三角函數 求整數值 求平方根 16進位函數 8 進位函數 指數函數 自然對數 亂數函數 依指定求出小數點位 數並四捨五入
常用的日期時間函數 • Date • 目前的系統日期 • Time • 目前的系統時間 • Now • 目前的系統日期與時間
常用的日期時間函數(續) • Timer • 傳回一 Single型態的數值,其內容為從前一個午夜算起到現在所經過的秒數。 • Year(date) :傳回date變數的年份 • Month(date) :傳回date變數的月份 • Day(date) :傳回date變數的日期 • Hour(time) :傳回time變數的小時 • Minute(time) :傳回time變數的分鐘 • Second(time) :傳回time變數的秒鐘
範例 • 試設計一萬年曆程式
陽曆為何有閏年的安排?有何規律性? • 陽曆訂地球繞太陽公轉一周為一年,全年合計365日,稱為平年(平均太陽年的簡稱),但實際上地球繞日公轉一周平均為365.2422日,因此每積四年就會多出約0.9688日,為了使曆法能配合天象,規定當西元年數是四的倍數時,二月就增加1天成29天,該年稱為閏年,又因此法每四年又會多加0.03日左右,故再規定每四百年需減3天,當西元年數逢百年的倍數時,必需是400的倍數才是閏年,如1700、1800、1900都是平年,只有2000年能被400整除才是閏年。
閏年的規則 • 西元年數為4的倍數者閏 • 100的倍數者不閏 • 但400的倍數者閏 所有的年 可被4整除的年 可被100整除的年 可被400整除的年
西元元年一月一日是星期幾? • 星期一
因此… • 西元元年一月三十一日是星期? • 31 mod 7 = 3 • 星期三 • 西元元年二月十日是星期? • (31 + 10) mod 7 = 6 • 星期六 • 西元二年一月十三日是星期? • (365 + 13) mod 7 = 0 • 星期日
Label [Label1(0)] 版面配置 ComboBox [Combo1] Label [Label1(1)] Label [Label2] ComboBox [Combo2] Label [Label3] Command Button [Command1(0)~ Command1(36)] Command Button [Command2]
所使用的變數 • year (型態為long) • 欲查詢的西元年 • month (型態為integer) • 欲查詢的月份 • day (型態為long) • 自西元元年一月一日至欲查詢的西元年月的第一天的總天數 • 例如:欲查詢2001年12月,則day為西元元年1月1日至2001年12月1日的總天數 • month_day (型態為variant) • 一個儲存平年各月份天數的一維陣列 • (31,28,31,30,31,30,31,31,30,31,30,31)
程式開始執行時的初值設定 在Combo1中加入1999年至2010年的選項 在Combo2中加入1月至12月的選項 按平年各月的天數來設定month_day這個陣列的初始值
CommandButton2的內容 Private Sub Command2_Click() If MsgBox("是否確定離開??", vbOKCancel + vbQuestion, "離開") = vbOK Then End End If End Sub
CommandButton1要做什麼? 以複製方式建立Command1(0)~Command1(36) • 用來顯示月曆
程式核心—ComboBox2 • 希望當選定月份後立即顯示相對於所選年月的月曆 • 因此,整個動作的重心就該放在ComboBox2
ComboBox2的內容 滑鼠左鍵點選 Combo2兩次出現 Combo2_Change( )這不是所要的 Combo2_Click才是所要的 副程式段
ComboBox2的內容(續) 令變數year等於Combo1所點選的年份,並透過Val函數將其轉換為數值 year = Val(Combo1.Text) month = Val(Combo2.Text) For i = 0 To 36 Command1(i).Caption = "" Next i 令變數month等於Combo2所點選的月份,並透過Val函數將其轉換為數值 將Command1(0)到Command1(36)上Caption所顯示的值清空
ComboBox2的內容(續) 計算所欲查詢的年份前一年至西元元年的總天數 假設欲查詢的是2001年12月,year = 2001 day = (year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400 先將每年都當作平年 (365天),計算總天數 其中共計有幾個閏年 則從西元1年1月1日到西元2000年12月31日 共計有2000*365 + 2000/4 - 2000/100 + 2000/400 = 730000 + 500 – 20 + 5 =730485 天
ComboBox2的內容(續) If ((year Mod 4 = 0 And year Mod 100 <> 0) Or (year Mod 100 = 0 And year Mod 400 = 0)) Then month_day(1) = 29 Else month_day(1) = 28 End If For i = 0 To month - 2 day = day + month_day(i) Next i 假如所欲查詢的年份(2001)為閏年的話 則其2月有29天,否則為28天 累計總天數至欲查詢的前一個月的最後一天(11月30日) 730485+31+28+31+30+31+30+31+31+30+31+30 = 730485 + 334 = 730819 天
ComboBox2的內容(續) 假如欲查詢的年份大於1911年則Label2顯示 民國年份及月份(民國90年12月)否則顯示民 國前年份及月份(民國前5年8月) If year > 1911 Then Label2.Caption = "民國" + Str(year - 1911) + "年" + Str(month) + "月 " Else Label2.Caption = "民國前" + Str(Abs(1912 - year)) + "年" + Str(month) + "月 " End If day = day + 1 week = day Mod 7 累計天數至欲查詢的當月第一天730819 + 1 = 730820 天 計算欲查詢的年月第一天為星期幾(2000年12月1日) 730820 mod 7= 6 (星期六)
ComboBox2的內容(續) 將不需顯示的CommandButton隱藏 For i = 0 To week - 1 Command1(i).Visible = False Next I For i = week + month_day(month - 1) To 36 Command1(i).Visible = False Next i
ComboBox2的內容(續) For i = 1 To month_day(month - 1) Command1(week + i - 1).Visible = True Command1(week + i - 1).Caption = i Next i 依序將日期填註到每一個相對的 CommandButton中