




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、工業(yè)和信息化部工業(yè)和信息化部“十二五十二五”規(guī)劃教材規(guī)劃教材普通高等學(xué)校普通高等學(xué)?!笆迨濉币?guī)劃教材規(guī)劃教材C#網(wǎng)絡(luò)應(yīng)用編程網(wǎng)絡(luò)應(yīng)用編程第第3版版第第2章數(shù)字墨跡與動態(tài)章數(shù)字墨跡與動態(tài)繪圖基礎(chǔ)繪圖基礎(chǔ)2Ch2 數(shù)字墨跡與動態(tài)繪圖基礎(chǔ)數(shù)字墨跡與動態(tài)繪圖基礎(chǔ)2.1 Ribbon控件及其基本用法控件及其基本用法2.2 WPF中的數(shù)字墨跡中的數(shù)字墨跡2.3 自定義墨跡畫板自定義墨跡畫板2.4 利用自定義墨跡畫板實現(xiàn)動態(tài)繪利用自定義墨跡畫板實現(xiàn)動態(tài)繪2.5 功能擴展建議功能擴展建議2.1 Ribbon控件及其基本用法控件及其基本用法l2.1.1 設(shè)計選項卡設(shè)計選項卡l2.1.2 在多個選項卡中重
2、用選項在多個選項卡中重用選項42.1.1 設(shè)計選項卡設(shè)計選項卡lWPF提供的提供的Ribbon控件控件將界面分為兩大部分將界面分為兩大部分,上部是功能區(qū)(將應(yīng)用程序的功上部是功能區(qū)(將應(yīng)用程序的功能組織到窗口頂部的一系列選項卡中)能組織到窗口頂部的一系列選項卡中),下部是處理界下部是處理界面面比傳統(tǒng)的菜單欄和工具欄具有更強的展現(xiàn)效果比傳統(tǒng)的菜單欄和工具欄具有更強的展現(xiàn)效果注意注意uRibbonRibbon控件屬于高級控件,默認(rèn)沒有放到工具箱中,因控件屬于高級控件,默認(rèn)沒有放到工具箱中,因此,使用該控件前,首先需要通過添加引用的辦法將其此,使用該控件前,首先需要通過添加引用的辦法將其添加到項目中
3、添加到項目中52.1.1 設(shè)計選項卡設(shè)計選項卡l添加添加Ribbon控件控件2.1.1 設(shè)計選項卡設(shè)計選項卡lRibbon控件主要包括以下子項:控件主要包括以下子項:QuickAccessToolBar(快速訪問工具欄)、(快速訪問工具欄)、ApplicationMenu(應(yīng)用程序菜單)、(應(yīng)用程序菜單)、RibbonTab(選項卡)。選項卡)。在在QuickAccessToolBar和和RibbonTab子項內(nèi),除了子項內(nèi),除了可以使用一般的可以使用一般的WPF控件外,最常見的做法是在該控控件外,最常見的做法是在該控件的子項中包含件的子項中包含Ribbon專用的子控件。專用的子控件。2.1.
4、1 設(shè)計選項卡設(shè)計選項卡lShowQuickAccessToolBarOnTop屬性屬性可控制快速訪問工具欄顯示的位置(控制顯示在功能區(qū)的上部還可控制快速訪問工具欄顯示的位置(控制顯示在功能區(qū)的上部還是下部)。是下部)。lRibbonApplicationMenu的的Visibility屬性屬性可控制菜單的可見形式(顯示、隱藏、折疊)。可控制菜單的可見形式(顯示、隱藏、折疊)。l設(shè)置快速訪問工具欄作為窗口的標(biāo)題欄設(shè)置快速訪問工具欄作為窗口的標(biāo)題欄要將根元素(默認(rèn)是要將根元素(默認(rèn)是Window元素)改為元素)改為RibbonWindow即可。即可。這并不是必需的,開發(fā)人員可根據(jù)需要決定是否這樣
5、做。這并不是必需的,開發(fā)人員可根據(jù)需要決定是否這樣做。2.1.1 設(shè)計選項卡設(shè)計選項卡l演示示例:設(shè)計演示示例:設(shè)計Ribbon控件(具體實現(xiàn)課本控件(具體實現(xiàn)課本P25)2.1.2 在多個選項卡中重用選項在多個選項卡中重用選項l要在要在Ribbon的多個選項卡中重復(fù)使用完全相同的選項,辦法的多個選項卡中重復(fù)使用完全相同的選項,辦法是將這些選項設(shè)計為單獨的是將這些選項設(shè)計為單獨的WPF用戶控件。用戶控件。l具體做法具體做法在項目中添加一個在項目中添加一個WPF用戶控件用戶控件首先修改為讓其繼承自首先修改為讓其繼承自RibbonTab將將RibbonTab包含的項復(fù)制到該用戶控件中包含的項復(fù)制到
6、該用戶控件中2.1.2 在多個選項卡中重用選項在多個選項卡中重用選項l例如:例如:InkExamples項目中項目中MyRibbonTab用戶控件用戶控件部分部分XAML代碼代碼 RibbonGroup Header= RibbonRadioButton Label= IsChecked=True/ RibbonRadioButton Label= / RibbonGroup Header= RibbonRadioButton x:Name=rrbPen Label= / RibbonRadioButton Label= / 2.1.2 在多個選項卡中重用選項在多個選項卡中重用選項隱藏類代碼隱
7、藏類代碼. public partial class MyRibbonTab : RibbonTab public partial class MyRibbonTab : RibbonTab . . 在在Ribbon控件中如何使用控件中如何使用MyRibbonTab用戶控件。用戶控件。RibbonWindow x:Class=InkExamples.MainWindow . xmlns:uc=clr-namespace:InkExamples.UserControls . . . uc:MyRibbonTab x:Name=rt2 Header= 2/ .2.2 WPF中的數(shù)字墨跡中的數(shù)字墨跡
8、l2.2.1 墨跡畫板(墨跡畫板(InkCanvas)l2.2.2 觸筆和手勢觸筆和手勢l2.2.3 觸筆事件觸筆事件l2.2.4 墨跡筆畫(墨跡筆畫(Stroke)和墨跡數(shù)據(jù)()和墨跡數(shù)據(jù)(StrokeCollection)2.2 WPF中的數(shù)字墨跡中的數(shù)字墨跡l數(shù)字墨跡數(shù)字墨跡是指用手指或觸筆在具有觸摸功能的屏幕表面劃動時產(chǎn)生的動態(tài)是指用手指或觸筆在具有觸摸功能的屏幕表面劃動時產(chǎn)生的動態(tài)繪圖效果繪圖效果也可以在普通的臺式機上通過拖動鼠標(biāo)來模擬手指或觸筆。也可以在普通的臺式機上通過拖動鼠標(biāo)來模擬手指或觸筆。WPF在在System.Windows.Ink命名空間下提供了與數(shù)字墨跡相關(guān)命名空間下
9、提供了與數(shù)字墨跡相關(guān)的類的類2.2.1 墨跡畫板(墨跡畫板(InkCanvas)lInkCanvas控件控件在在System.Windows.Controls命名空間下,命名空間下,實現(xiàn)墨跡的收集、復(fù)制、選擇、顯示和輸入等功能。實現(xiàn)墨跡的收集、復(fù)制、選擇、顯示和輸入等功能。利用利用InkCanvas,可以讓用戶修改或刪除現(xiàn)有的,可以讓用戶修改或刪除現(xiàn)有的Stroke對象,同對象,同時還可以將其他控件添加到時還可以將其他控件添加到InkCanvas中。中。2.2.1 墨跡畫板(墨跡畫板(InkCanvas)lInkCanvas類的常用屬性如下類的常用屬性如下1.DefaultDrawingAtt
10、ributes屬性屬性u用于獲取或設(shè)置用于獲取或設(shè)置InkCanvasInkCanvas中新筆畫的繪制特性(中新筆畫的繪制特性(DrawingAttributesDrawingAttributes對象)。對象)。u該屬性的可選值有:該屬性的可選值有:Color(筆畫顏色)Width(觸筆寬度)Height(觸筆高度)StylusTip(觸筆形狀,圓形或者矩形)IsHighlighter(觸筆是否像熒光筆)FitToCurve(是否用貝塞爾曲線平滑法來呈現(xiàn)筆畫)IgnorePressure(筆畫粗細(xì)是否隨壓力自動改變)。2.2.1 墨跡畫板(墨跡畫板(InkCanvas)2EditingMode
11、屬性屬性u該屬性指定了觸筆、手指、鼠標(biāo)等設(shè)備與該屬性指定了觸筆、手指、鼠標(biāo)等設(shè)備與InkCanvasInkCanvas交互的模交互的模式式u屬性的值屬性的值InkCanvasEditingModeInkCanvasEditingMode枚舉來表示,默認(rèn)值為枚舉來表示,默認(rèn)值為InkInk??煽蒊nk 接收墨跡GestureOnly 只響應(yīng)筆勢或手勢但不接收墨跡None 不執(zhí)行任何操作Select 用套索方式以及用觸筆與墨跡相交的方式選擇墨跡EraseByPoint 當(dāng)觸筆與墨跡相交時清除相交處的墨跡EraseByStroke 當(dāng)觸筆與墨跡相交時清除整個筆畫 。2.2.1 墨跡畫板(墨跡畫板(I
12、nkCanvas)l例例2-1 演示演示InkCanvas的基本用法。運行效果如圖所示的基本用法。運行效果如圖所示2.2.2 觸筆和手勢觸筆和手勢l1觸筆(觸筆(Stylus)觸筆(觸筆(Stylus)類似于我們平時手寫用的筆,其用途是將筆和圖)類似于我們平時手寫用的筆,其用途是將筆和圖面接觸在一起繪制圖形或?qū)懽?。面接觸在一起繪制圖形或?qū)懽帧T谥悄苁謾C、平板電腦以及車載導(dǎo)航儀上都有專用的觸筆。另外在智能手機、平板電腦以及車載導(dǎo)航儀上都有專用的觸筆。另外,在這些設(shè)備上,也都可以用手指來代替觸筆。,在這些設(shè)備上,也都可以用手指來代替觸筆。對于臺式計算機來說,如果使用觸摸設(shè)備(觸摸屏),一樣可以對于
13、臺式計算機來說,如果使用觸摸設(shè)備(觸摸屏),一樣可以用手指來代替觸筆。但是,由于大部分普通計算機的屏幕并沒有用手指來代替觸筆。但是,由于大部分普通計算機的屏幕并沒有觸摸功能,所以只能用鼠標(biāo)來模擬。觸摸功能,所以只能用鼠標(biāo)來模擬。2.2.2 觸筆和手勢觸筆和手勢l2手勢(手勢(Gesture)手勢表示用觸筆或手指在畫面上劃動時產(chǎn)生的軌跡。其基本特征手勢表示用觸筆或手指在畫面上劃動時產(chǎn)生的軌跡。其基本特征是:劃動時既可以不顯示劃動軌跡,也可以用墨跡顯示劃動的軌是:劃動時既可以不顯示劃動軌跡,也可以用墨跡顯示劃動的軌跡,但是,一旦抬起觸筆或手指,劃動時產(chǎn)生的墨跡就會自動消跡,但是,一旦抬起觸筆或手指
14、,劃動時產(chǎn)生的墨跡就會自動消失。失。目前的智能手機基本上都有手勢功能,而且可以用兩個手指同時目前的智能手機基本上都有手勢功能,而且可以用兩個手指同時向不同的方向劃動。但是,用鼠標(biāo)來模擬手勢時,由于無法用一向不同的方向劃動。但是,用鼠標(biāo)來模擬手勢時,由于無法用一個鼠標(biāo)同時向不同的方向移動,所以只能模擬單個手指劃動時的個鼠標(biāo)同時向不同的方向移動,所以只能模擬單個手指劃動時的手勢效果。手勢效果。2.2.2 觸筆和手勢觸筆和手勢l3觸點(觸點(StylusPoint)觸點表示手指在圖面上劃動或者按住鼠標(biāo)左鍵拖動時收集到的數(shù)觸點表示手指在圖面上劃動或者按住鼠標(biāo)左鍵拖動時收集到的數(shù)據(jù)點,有了這些數(shù)據(jù)點,就
15、可以用它構(gòu)成墨跡筆畫(據(jù)點,有了這些數(shù)據(jù)點,就可以用它構(gòu)成墨跡筆畫(Stroke)。)。觸點用觸點用System.Windows.Ink命名空間下的命名空間下的StylusPoint結(jié)構(gòu)來結(jié)構(gòu)來表示,該結(jié)構(gòu)的屬性如下。表示,該結(jié)構(gòu)的屬性如下。uX X、Y Y:獲取或設(shè)置:獲取或設(shè)置StylusPointStylusPoint的的X X坐標(biāo)值或者坐標(biāo)值或者Y Y坐標(biāo)值。坐標(biāo)值。uPressureFactorPressureFactor屬性:獲取或設(shè)置觸筆施加于圖面設(shè)備的壓力大小屬性:獲取或設(shè)置觸筆施加于圖面設(shè)備的壓力大小uDescriptionDescription屬性:指定屬性:指定Stylu
16、sPointStylusPoint中的中的StylusPointDescriptionStylusPointDescription包含哪些屬性。默認(rèn)情況下,所有包含哪些屬性。默認(rèn)情況下,所有StylusPointStylusPoint對象均包含(對象均包含(x, yx, y)坐標(biāo)以及觸點壓力屬性。坐標(biāo)以及觸點壓力屬性。2.2.2 觸筆和手勢觸筆和手勢l4觸點壓力(觸點壓力(PressureFactor)System.Windows.Ink命名空間下的命名空間下的PressureFactor類表示當(dāng)觸類表示當(dāng)觸筆或手指按壓在圖面設(shè)備上時按壓力量的大小,簡稱觸點壓力筆或手指按壓在圖面設(shè)備上時按壓力
17、量的大小,簡稱觸點壓力用鼠標(biāo)模擬時,可通過鼠標(biāo)移動的快慢來表示,移動越快,表示用鼠標(biāo)模擬時,可通過鼠標(biāo)移動的快慢來表示,移動越快,表示觸點壓力越??;移動越慢,表示觸點壓力越大。觸點壓力越??;移動越慢,表示觸點壓力越大。觸點壓力最小為觸點壓力最小為0.0,最大為,最大為1.0,默認(rèn)值為,默認(rèn)值為0.5。l5手寫識別手寫識別手寫識別只是在數(shù)字墨跡的基礎(chǔ)上增加了文字識別技術(shù),并將識手寫識別只是在數(shù)字墨跡的基礎(chǔ)上增加了文字識別技術(shù),并將識別的文字自動顯示出來供用戶選擇。由于這部分內(nèi)容超出了本書別的文字自動顯示出來供用戶選擇。由于這部分內(nèi)容超出了本書的范圍,因此不再介紹。的范圍,因此不再介紹。2.2.3
18、 觸筆事件觸筆事件l在所有在所有WPF控件上,都可以用觸筆繪制,并引發(fā)相應(yīng)的觸筆事控件上,都可以用觸筆繪制,并引發(fā)相應(yīng)的觸筆事件。件。所有觸筆事件都有所有觸筆事件都有Stylus前綴。前綴。觸筆事件也都具有成對的觸筆事件也都具有成對的“隧道隧道/冒泡冒泡”事件,而且這些事件都始事件,而且這些事件都始終在應(yīng)用程序線程上引發(fā)。終在應(yīng)用程序線程上引發(fā)。當(dāng)用戶在任何一個當(dāng)用戶在任何一個WPF控件(或者叫元素)上用手指、觸筆或者控件(或者叫元素)上用手指、觸筆或者拖動鼠標(biāo)實現(xiàn)圖形繪制和平移時,如果屏幕有觸摸功能,都會引拖動鼠標(biāo)實現(xiàn)圖形繪制和平移時,如果屏幕有觸摸功能,都會引發(fā)該控件的觸筆事件。發(fā)該控件的
19、觸筆事件。注意:注意:u對于對于InkCanvasInkCanvas控件來說,它還會自動將鼠標(biāo)作為觸筆來處理??丶碚f,它還會自動將鼠標(biāo)作為觸筆來處理。2.2.3 觸筆事件觸筆事件l1常用事件(常用事件( InkCanvas為例)為例)StylusDown事件:事件:u用戶在用戶在InkCanvasInkCanvas控件上用觸筆、手指與圖面接觸,或者按下鼠標(biāo)左控件上用觸筆、手指與圖面接觸,或者按下鼠標(biāo)左鍵時,都會引發(fā)鍵時,都會引發(fā)StylusDownStylusDown事件??梢栽诖耸录胁东@觸點集合(事件??梢栽诖耸录胁东@觸點集合(StylusPointCollectionStylusPo
20、intCollection),剛按下時該集合中只有一個觸點。),剛按下時該集合中只有一個觸點。StylusMove事件:事件:u用戶在用戶在InkCanvasInkCanvas控件內(nèi)移動觸筆或手指,或者按住鼠標(biāo)左鍵移動鼠控件內(nèi)移動觸筆或手指,或者按住鼠標(biāo)左鍵移動鼠標(biāo)時,都會引發(fā)標(biāo)時,都會引發(fā)StylusMoveStylusMove事件。在移動觸筆、手指或者鼠標(biāo)的過事件。在移動觸筆、手指或者鼠標(biāo)的過程中,可以持續(xù)獲得一系列觸點。程中,可以持續(xù)獲得一系列觸點。StylusUp事件:事件:u用戶釋放鼠標(biāo)左鍵、拿開觸筆或者抬起手指時,都會引發(fā)用戶釋放鼠標(biāo)左鍵、拿開觸筆或者抬起手指時,都會引發(fā)Stylu
21、sUpStylusUp事件。事件。2.2.3 觸筆事件觸筆事件l2其他事件其他事件除了常用的觸筆事件外,還有一些觸筆事件,例如除了常用的觸筆事件外,還有一些觸筆事件,例如StylusEnter(觸筆進(jìn)入控件范圍內(nèi)時引發(fā))(觸筆進(jìn)入控件范圍內(nèi)時引發(fā))StylusLeave(觸筆離開控件范圍內(nèi)時引發(fā))(觸筆離開控件范圍內(nèi)時引發(fā))StylusRange(觸筆懸停于此控件上方并位于圖面設(shè)備可檢測的(觸筆懸停于此控件上方并位于圖面設(shè)備可檢測的范圍之內(nèi)時引發(fā))范圍之內(nèi)時引發(fā))StylusOutOfRange(觸筆懸停于此控件上方并位于圖面設(shè)備可(觸筆懸停于此控件上方并位于圖面設(shè)備可檢測的范圍之外時引發(fā))檢
22、測的范圍之外時引發(fā))StylusInAirMove(在觸筆掠過控件但并未實際接觸圖面設(shè)備時(在觸筆掠過控件但并未實際接觸圖面設(shè)備時引發(fā))引發(fā))2.2.4 墨跡筆畫(墨跡筆畫(Stroke)和墨跡數(shù))和墨跡數(shù)據(jù)(據(jù)(StrokeCollection)l筆畫筆畫觸筆(觸筆(Stylus)在畫板上移動時顯示的痕跡叫墨跡筆畫()在畫板上移動時顯示的痕跡叫墨跡筆畫(Stroke),簡稱筆畫。),簡稱筆畫。當(dāng)按住鼠標(biāo)左鍵拖動時(模擬手指在觸摸屏、平板電腦、智能手當(dāng)按住鼠標(biāo)左鍵拖動時(模擬手指在觸摸屏、平板電腦、智能手機、導(dǎo)航儀等屏幕上劃動),或者加載墨跡文件時,創(chuàng)建的筆畫機、導(dǎo)航儀等屏幕上劃動),或者加載
23、墨跡文件時,創(chuàng)建的筆畫用用System.Windows.Ink命名空間下的命名空間下的Stroke對象來表示。對象來表示。注意注意u使用時不要將筆畫(使用時不要將筆畫(StrokeStroke)和畫筆()和畫筆(BrushBrush)混淆在一起。)混淆在一起。2.2.4 墨跡筆畫(墨跡筆畫(Stroke)和墨跡數(shù))和墨跡數(shù)據(jù)(據(jù)(StrokeCollection)l1Stroke對象對象Stroke對象的對象的DrawingAttributes屬性用于獲取或設(shè)置筆畫的繪屬性用于獲取或設(shè)置筆畫的繪制特性。制特性。DrawingAttributes類類u該類用于指定該類用于指定StrokeStro
24、ke的外觀。包括顏色、寬度、透明度、形狀等。的外觀。包括顏色、寬度、透明度、形狀等。Guid結(jié)構(gòu)結(jié)構(gòu)u全局唯一標(biāo)識符(全局唯一標(biāo)識符(GUIDGUID)是一個)是一個3232位的十六進(jìn)制數(shù)(位的十六進(jìn)制數(shù)(1616個字節(jié)),個字節(jié)),繪制墨跡時,可用它表示唯一的墨跡繪制墨跡時,可用它表示唯一的墨跡IDID。2.2.4 墨跡筆畫(墨跡筆畫(Stroke)和墨跡數(shù))和墨跡數(shù)據(jù)(據(jù)(StrokeCollection)用字符串表示用字符串表示Guid結(jié)構(gòu)時,一般用結(jié)構(gòu)時,一般用8-4-4-4-12的格式對其分組(的格式對其分組(每個字符表示一位十六進(jìn)制數(shù),每個字符表示一位十六進(jìn)制數(shù),16個字節(jié)共個字節(jié)
25、共32個字符),各組之個字符),各組之間用連線符分隔。例如:間用連線符分隔。例如:u00000001-0002-0003-0001-02030405060700000001-0002-0003-0001-020304050607uca761232-ed42-11ce-bacd-00aa0057b223ca761232-ed42-11ce-bacd-00aa0057b223uCA761232-ED42-11CE-BACD-00AA0057B223CA761232-ED42-11CE-BACD-00AA0057B223Guid結(jié)構(gòu)有多種構(gòu)造函數(shù),下面是其中的一種構(gòu)造函數(shù)語法。結(jié)構(gòu)有多種構(gòu)造函數(shù),下
26、面是其中的一種構(gòu)造函數(shù)語法。public Guid(public Guid( int a, /4 int a, /4字節(jié)字節(jié) short b, /2 short b, /2字節(jié)字節(jié) short c, /2 short c, /2字節(jié)字節(jié) byte d /8 byte d /8字節(jié)字節(jié) ) )2.2.4 墨跡筆畫(墨跡筆畫(Stroke)和墨跡數(shù))和墨跡數(shù)據(jù)(據(jù)(StrokeCollection)構(gòu)造函數(shù)中參數(shù)構(gòu)造函數(shù)中參數(shù)a、b、c、d所占的字節(jié)數(shù)分別為:所占的字節(jié)數(shù)分別為:4、2、2、8例如:例如:public static int a = 1;Guid id = new Guid(a+,
27、2, 3, new byte0,1,2,3,4,5,6,7)string s = id.ToString(); /首次調(diào)用結(jié)果為首次調(diào)用結(jié)果為“00000001-0002-0003-0001-020304050607”public static classpublic static int Id = 0; public static NewId() return Id+; 2.2.4 墨跡筆畫(墨跡筆畫(Stroke)和墨跡數(shù))和墨跡數(shù)據(jù)(據(jù)(StrokeCollection)l注意注意如果隨機生成如果隨機生成id,只需要用哈希函數(shù)或者,只需要用哈希函數(shù)或者Random類隨機生成每類隨機生成每
28、個值,然后判斷是否和已經(jīng)存在的個值,然后判斷是否和已經(jīng)存在的id相同,如果相同,再次隨機相同,如果相同,再次隨機生成。生成。一般用一般用Guid的靜態(tài)的靜態(tài)NewGuid方法自動獲取新的方法自動獲取新的GUID。例如:。例如:uGuid id = Guid.NewGuid();Guid id = Guid.NewGuid();u這種方式能確保每次創(chuàng)建的這種方式能確保每次創(chuàng)建的idid都不相同。這樣一來,繪圖時我們就都不相同。這樣一來,繪圖時我們就不需要自己去創(chuàng)建和維護每個對象的不需要自己去創(chuàng)建和維護每個對象的IDID號了。號了。2.2.4 墨跡筆畫(墨跡筆畫(Stroke)和墨跡數(shù))和墨跡數(shù)據(jù)
29、(據(jù)(StrokeCollection)l2StrokeCollection對象對象在在WPF中,墨跡數(shù)據(jù)用墨跡集合(中,墨跡數(shù)據(jù)用墨跡集合(StrokeCollection對象)來表對象)來表示示該集合中的每個成員都是一個該集合中的每個成員都是一個Stroke對象,而且每個對象,而且每個Stroke對象對象都自動擁有自己的生命周期。都自動擁有自己的生命周期。在在InkCanvas類或者從該類繼承的類中,類或者從該類繼承的類中,WPF會自動將一組會自動將一組Stroke對象收集到一個對象收集到一個StrokeCollection內(nèi),并自動提供常用的內(nèi),并自動提供常用的墨跡管理和操作方法(命中測
30、試、擦除、轉(zhuǎn)換、序列化、保存、墨跡管理和操作方法(命中測試、擦除、轉(zhuǎn)換、序列化、保存、加載、復(fù)制、粘貼等)。加載、復(fù)制、粘貼等)。直接用從直接用從InkCanvas繼承的類和繼承的類和StrokeCollection對象來實現(xiàn)墨對象來實現(xiàn)墨跡的各種處理功能。跡的各種處理功能。2.3 自定義墨跡畫板自定義墨跡畫板l2.3.1 靜態(tài)呈現(xiàn)和動態(tài)呈現(xiàn)靜態(tài)呈現(xiàn)和動態(tài)呈現(xiàn)l2.3.2 制作自定義墨跡控件制作自定義墨跡控件2.3.1 靜態(tài)呈現(xiàn)和動態(tài)呈現(xiàn)靜態(tài)呈現(xiàn)和動態(tài)呈現(xiàn)l墨跡呈現(xiàn)方法:墨跡呈現(xiàn)方法:動態(tài)和靜態(tài)。動態(tài)和靜態(tài)。為了能繪制各種自定義的形狀,一般情況下,我們需要創(chuàng)建一個為了能繪制各種自定義的形狀,一
31、般情況下,我們需要創(chuàng)建一個既能動態(tài)呈現(xiàn)墨跡又能靜態(tài)呈現(xiàn)墨跡的自定義墨跡控件。既能動態(tài)呈現(xiàn)墨跡又能靜態(tài)呈現(xiàn)墨跡的自定義墨跡控件。2.3.1 靜態(tài)呈現(xiàn)和動態(tài)呈現(xiàn)靜態(tài)呈現(xiàn)和動態(tài)呈現(xiàn)l1靜態(tài)呈現(xiàn)靜態(tài)呈現(xiàn)靜態(tài)呈現(xiàn)是指將墨跡添加到控件之后再顯示墨跡。靜態(tài)呈現(xiàn)是指將墨跡添加到控件之后再顯示墨跡。添加方式有:添加方式有:u通過觸筆添加、從剪貼板中粘貼、從文件中加載通過觸筆添加、從剪貼板中粘貼、從文件中加載靜態(tài)呈現(xiàn)墨跡的辦法是自定義從靜態(tài)呈現(xiàn)墨跡的辦法是自定義從Stroke類繼承的類。類繼承的類。u由于由于StrokeStroke對象會自動收集對象會自動收集StylusPointStylusPoint數(shù)據(jù)、創(chuàng)建
32、筆畫以及將筆畫數(shù)據(jù)、創(chuàng)建筆畫以及將筆畫添加到自定義的墨跡控件上,因此我們只需要在自定義的類中重寫添加到自定義的墨跡控件上,因此我們只需要在自定義的類中重寫引發(fā)觸筆事件的引發(fā)觸筆事件的DrawCoreDrawCore方法,即可實現(xiàn)靜態(tài)呈現(xiàn)功能。其他引發(fā)方法,即可實現(xiàn)靜態(tài)呈現(xiàn)功能。其他引發(fā)觸筆事件的方法可以根據(jù)需要決定是否重寫。觸筆事件的方法可以根據(jù)需要決定是否重寫。2.3.1 靜態(tài)呈現(xiàn)和動態(tài)呈現(xiàn)靜態(tài)呈現(xiàn)和動態(tài)呈現(xiàn)l2動態(tài)呈現(xiàn)動態(tài)呈現(xiàn)動態(tài)呈現(xiàn)是指在移動觸點的過程中同時呈現(xiàn)墨跡。在這種方式下動態(tài)呈現(xiàn)是指在移動觸點的過程中同時呈現(xiàn)墨跡。在這種方式下,墨跡看上去好像是用觸筆畫出來的。,墨跡看上去好像是用
33、觸筆畫出來的。動態(tài)呈現(xiàn)墨跡的辦法:動態(tài)呈現(xiàn)墨跡的辦法:u是將自定義墨跡控件的是將自定義墨跡控件的DynamicRendererDynamicRenderer屬性設(shè)置為自定義的從屬性設(shè)置為自定義的從DynamicRendererDynamicRenderer類繼承的類。類繼承的類。u在自定義的類中,分別重寫引發(fā)觸筆事件的方法,常用的有在自定義的類中,分別重寫引發(fā)觸筆事件的方法,常用的有OnStylusDownOnStylusDown、OnStylusMoveOnStylusMove以及以及OnDrawOnDraw等。其中等。其中OnDrawOnDraw是必須重是必須重寫的方法,其他方法可以根據(jù)需
34、要決定是否重寫。寫的方法,其他方法可以根據(jù)需要決定是否重寫。注意注意u如果用鼠標(biāo)來模擬觸筆,動態(tài)呈現(xiàn)時,它每次收集到的墨跡數(shù)據(jù)只如果用鼠標(biāo)來模擬觸筆,動態(tài)呈現(xiàn)時,它每次收集到的墨跡數(shù)據(jù)只有兩個點,注意這和靜態(tài)呈現(xiàn)時已經(jīng)有很多個點的情況完全不同。有兩個點,注意這和靜態(tài)呈現(xiàn)時已經(jīng)有很多個點的情況完全不同。2.3.2 制作自定義墨跡控件制作自定義墨跡控件l創(chuàng)建自定義墨跡畫板創(chuàng)建自定義墨跡畫板創(chuàng)建自定義墨跡畫板的辦法就是讓其繼承自創(chuàng)建自定義墨跡畫板的辦法就是讓其繼承自InkCanvas類。類。一個一個InkCanvas可以具有一個或多個動態(tài)呈現(xiàn)的對象(可以具有一個或多個動態(tài)呈現(xiàn)的對象(DynamicR
35、enderer)。)。在自定義的墨跡畫板中,我們只需要將多個在自定義的墨跡畫板中,我們只需要將多個DynamicRenderer對對象分別添加到象分別添加到StylusPlugIns屬性中,再將其賦值給屬性中,再將其賦值給DynamicRenderer屬性,即可將其添加到自定義的屬性,即可將其添加到自定義的InkCanvas中中DynamicRenderer對象是一個特殊的對象是一個特殊的StylusPlugIns對象,在對象,在WPF應(yīng)用程序中,使用應(yīng)用程序中,使用InkCanvas或者使用繼承自或者使用繼承自InkCanvas類類的自定義墨跡控件,不需要顯式聲明的自定義墨跡控件,不需要顯式
36、聲明StylusPlugIns,只需要設(shè)計,只需要設(shè)計從從DynamicRenderer繼承的類,即可實現(xiàn)動態(tài)的即時呈現(xiàn)。繼承的類,即可實現(xiàn)動態(tài)的即時呈現(xiàn)。2.3.2 制作自定義墨跡控件制作自定義墨跡控件l制作自定義墨跡畫板的主要設(shè)計步驟如下。制作自定義墨跡畫板的主要設(shè)計步驟如下。創(chuàng)建一個從創(chuàng)建一個從InkCanvas派生的類。派生的類。將自定義的將自定義的DynamicRenderer分配給分配給InkCanvas.DynamicRenderer屬性。屬性。重寫重寫OnStrokeCollected方法。在此方法中,移除已添加到方法。在此方法中,移除已添加到InkCanvas中的原始筆畫,然
37、后創(chuàng)建一個自定義筆畫,將其添加中的原始筆畫,然后創(chuàng)建一個自定義筆畫,將其添加到到Strokes屬性中。屬性中。最后再使用包含該自定義筆畫的新最后再使用包含該自定義筆畫的新InkCanvasStrokeCollectedEventArgs調(diào)用基類相應(yīng)的方法。調(diào)用基類相應(yīng)的方法。2.4 利用自定義墨跡畫板實現(xiàn)動態(tài)繪圖利用自定義墨跡畫板實現(xiàn)動態(tài)繪圖l2.4.1 繪制球形繪制球形l2.4.2 繪制球形序列繪制球形序列l(wèi)2.4.3 繪制矩形和矩形序列繪制矩形和矩形序列l(wèi)2.4.4 繪制圖像和圖像序列繪制圖像和圖像序列l(wèi)2.4.5 繪制漸變直線繪制漸變直線l2.4.6 繪制漸變曲線和文字繪制漸變曲線和文字
38、l2.4.7 選擇、編輯、縮放與橡皮擦選擇、編輯、縮放與橡皮擦l2.4.8 保存和打開墨跡文件保存和打開墨跡文件2.4.1 繪制球形繪制球形l【例【例2-2】演示如何利用】演示如何利用InkCanvas自定義墨跡畫板,并利用自定義墨跡畫板,并利用它繪制單個球形或圓環(huán),運行效果如圖它繪制單個球形或圓環(huán),運行效果如圖2-3所示。所示。圖圖2-3 例例2-2的運行效果的運行效果2.4.2 繪制球形序列繪制球形序列l(wèi)【例【例2-3】使用鼠標(biāo)拖動的辦法,在自定義墨跡畫板中繪制任】使用鼠標(biāo)拖動的辦法,在自定義墨跡畫板中繪制任意數(shù)量的球形序列,或者用球形序列繪制單個大小固定的球形意數(shù)量的球形序列,或者用球形
39、序列繪制單個大小固定的球形。程序運行效果如圖。程序運行效果如圖2-4所示。所示。圖圖2-4 例例2-3的運行效果的運行效果2.4.3 繪制矩形和矩形序列繪制矩形和矩形序列l(wèi)【例【例2-4】使用鼠標(biāo)拖動的辦法,在自定義墨跡畫板中繪制單】使用鼠標(biāo)拖動的辦法,在自定義墨跡畫板中繪制單個矩形和任意數(shù)量的矩形序列。運行效果如圖個矩形和任意數(shù)量的矩形序列。運行效果如圖2-5所示。所示。圖圖2-5 例例2-4的運行效果的運行效果2.4.4 繪制圖像和圖像序列繪制圖像和圖像序列l(wèi)【例【例2-5】使用鼠標(biāo)拖動的辦法,在自定義墨跡畫板中繪制單】使用鼠標(biāo)拖動的辦法,在自定義墨跡畫板中繪制單個圖像和任意數(shù)量的圖像序列
40、。運行效果如圖個圖像和任意數(shù)量的圖像序列。運行效果如圖2-6所示。所示。圖圖2-6 例例2-5的運行效果的運行效果2.4.5 繪制漸變直線繪制漸變直線l【例【例2-6】使用鼠標(biāo)拖動的辦法,在自定義墨跡畫板中繪制任】使用鼠標(biāo)拖動的辦法,在自定義墨跡畫板中繪制任意數(shù)量和方向的漸變直線。運行效果如圖意數(shù)量和方向的漸變直線。運行效果如圖2-7所示。所示。圖圖2-7 例例2-6的運行效果的運行效果2.4.6 繪制漸變曲線和文字繪制漸變曲線和文字l【例【例2-7】使用鼠標(biāo)拖動的辦法,在自定義墨跡畫板中繪制純】使用鼠標(biāo)拖動的辦法,在自定義墨跡畫板中繪制純色或者漸變的曲線和文字。運行效果如圖色或者漸變的曲線和
41、文字。運行效果如圖2-8所示。所示。圖圖2-8 例例2-7的運行效果的運行效果2.4.7 選擇、編輯、縮放與橡皮擦選擇、編輯、縮放與橡皮擦l1選擇、編輯、縮放選擇、編輯、縮放當(dāng)利用【套索選擇】工具或者【全選】工具選擇墨跡后,可直接當(dāng)利用【套索選擇】工具或者【全選】工具選擇墨跡后,可直接通過鼠標(biāo)移動所選筆畫,或者通過鼠標(biāo)拖動其周圍的控制點,編通過鼠標(biāo)移動所選筆畫,或者通過鼠標(biāo)拖動其周圍的控制點,編輯或縮放所選筆畫,圖輯或縮放所選筆畫,圖2-9演示了套索選擇的范圍。演示了套索選擇的范圍。圖圖2-9 套索選擇套索選擇2.4.7 選擇、編輯、縮放與橡皮擦選擇、編輯、縮放與橡皮擦l選擇了筆畫,即可對其縮
42、放,圖選擇了筆畫,即可對其縮放,圖2-10所示為套索選擇的對象縮所示為套索選擇的對象縮小后的效果。小后的效果。圖圖2-10 縮放套索選擇的筆畫縮放套索選擇的筆畫2.4.7 選擇、編輯、縮放與橡皮擦選擇、編輯、縮放與橡皮擦l橡皮擦:橡皮擦:既可以按照墨跡擦除筆畫中的一部分(或者利用它把一個墨跡分既可以按照墨跡擦除筆畫中的一部分(或者利用它把一個墨跡分為幾部分),也可以一次性刪除所選的筆畫,圖為幾部分),也可以一次性刪除所選的筆畫,圖2-11演示了墨跡演示了墨跡擦除的效果擦除的效果圖圖2-11 利用墨跡擦除將筆畫分為多個部分利用墨跡擦除將筆畫分為多個部分2.4.8 保存和打開墨跡文件保存和打開墨跡文件l1自定義墨跡筆畫自定義墨跡筆畫當(dāng)需要保存筆畫的自定義屬性時,可以用筆畫的當(dāng)需要保存筆畫的自定義屬性時,可以用筆畫的AddPropertyData方法。這些自定義的屬性都存儲在每個筆畫(方法。這些自定義的屬性都存儲在每個筆畫(Stroke對象)的內(nèi)部。對象)的內(nèi)部。通過通過AddPr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 互聯(lián)網(wǎng)產(chǎn)品策劃題
- 辦公空間能源消耗表格:能耗統(tǒng)計、節(jié)能減排
- 金融投資行業(yè)市場波動風(fēng)險免責(zé)聲明
- 醫(yī)學(xué)知識視頻培訓(xùn)課件
- 工作計劃完成情況統(tǒng)計表格
- 進(jìn)出口代理合同
- 季度項目進(jìn)展與成果匯報會議紀(jì)要
- 辦公軟件產(chǎn)品功能手冊與使用說明
- 人工智能圖像處理技術(shù)試題及答案
- 新能源汽車充電樁建設(shè)項目合同
- 項目工期管理
- DB31-T 1296-2021 電動汽車智能充電樁智能充電及互動響應(yīng)技術(shù)要求
- 網(wǎng)絡(luò)游戲游戲運營及營銷策略規(guī)劃方案
- 建筑垃圾粉碎合同范例
- ANCA相關(guān)性血管炎-3
- 2023年廣西公務(wù)員考試申論試題(C卷)
- 流體壓強與流速的關(guān)系市公開課一等獎?wù)f課公開課獲獎?wù)n件百校聯(lián)賽一等獎?wù)n件
- 第25課+中華人民共和國成立和向社會主義的過渡+課時作業(yè) 高一上學(xué)期統(tǒng)編版(2019)必修中外歷史綱要上
- 人教版思想政治必修二期末測試卷附參考答案
- 2024-2025學(xué)年初中信息技術(shù)(信息科技)七年級上冊粵教清華版教學(xué)設(shè)計合集
- 霧化吸入療法合理用藥專家共識(2024版)解讀
評論
0/150
提交評論