第02章-數(shù)字墨跡與動(dòng)態(tài)繪圖基礎(chǔ)_第1頁(yè)
第02章-數(shù)字墨跡與動(dòng)態(tài)繪圖基礎(chǔ)_第2頁(yè)
第02章-數(shù)字墨跡與動(dòng)態(tài)繪圖基礎(chǔ)_第3頁(yè)
第02章-數(shù)字墨跡與動(dòng)態(tài)繪圖基礎(chǔ)_第4頁(yè)
第02章-數(shù)字墨跡與動(dòng)態(tài)繪圖基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、工業(yè)和信息化部工業(yè)和信息化部“十二五十二五”規(guī)劃教材規(guī)劃教材普通高等學(xué)校普通高等學(xué)校“十二五十二五”規(guī)劃教材規(guī)劃教材C#網(wǎng)絡(luò)應(yīng)用編程網(wǎng)絡(luò)應(yīng)用編程第第3版版第第2章數(shù)字墨跡與動(dòng)態(tài)章數(shù)字墨跡與動(dòng)態(tài)繪圖基礎(chǔ)繪圖基礎(chǔ)2Ch2 數(shù)字墨跡與動(dòng)態(tài)繪圖基礎(chǔ)數(shù)字墨跡與動(dòng)態(tài)繪圖基礎(chǔ)2.1 Ribbon控件及其基本用法控件及其基本用法2.2 WPF中的數(shù)字墨跡中的數(shù)字墨跡2.3 自定義墨跡畫板自定義墨跡畫板2.4 利用自定義墨跡畫板實(shí)現(xiàn)動(dòng)態(tài)繪利用自定義墨跡畫板實(shí)現(xiàn)動(dòng)態(tài)繪2.5 功能擴(kuò)展建議功能擴(kuò)展建議2.1 Ribbon控件及其基本用法控件及其基本用法l2.1.1 設(shè)計(jì)選項(xiàng)卡設(shè)計(jì)選項(xiàng)卡l2.1.2 在多個(gè)選項(xiàng)卡中重

2、用選項(xiàng)在多個(gè)選項(xiàng)卡中重用選項(xiàng)42.1.1 設(shè)計(jì)選項(xiàng)卡設(shè)計(jì)選項(xiàng)卡lWPF提供的提供的Ribbon控件控件將界面分為兩大部分將界面分為兩大部分,上部是功能區(qū)(將應(yīng)用程序的功上部是功能區(qū)(將應(yīng)用程序的功能組織到窗口頂部的一系列選項(xiàng)卡中)能組織到窗口頂部的一系列選項(xiàng)卡中),下部是處理界下部是處理界面面比傳統(tǒng)的菜單欄和工具欄具有更強(qiáng)的展現(xiàn)效果比傳統(tǒng)的菜單欄和工具欄具有更強(qiáng)的展現(xiàn)效果注意注意uRibbonRibbon控件屬于高級(jí)控件,默認(rèn)沒(méi)有放到工具箱中,因控件屬于高級(jí)控件,默認(rèn)沒(méi)有放到工具箱中,因此,使用該控件前,首先需要通過(guò)添加引用的辦法將其此,使用該控件前,首先需要通過(guò)添加引用的辦法將其添加到項(xiàng)目中

3、添加到項(xiàng)目中52.1.1 設(shè)計(jì)選項(xiàng)卡設(shè)計(jì)選項(xiàng)卡l添加添加Ribbon控件控件2.1.1 設(shè)計(jì)選項(xiàng)卡設(shè)計(jì)選項(xiàng)卡lRibbon控件主要包括以下子項(xiàng):控件主要包括以下子項(xiàng):QuickAccessToolBar(快速訪問(wèn)工具欄)、(快速訪問(wèn)工具欄)、ApplicationMenu(應(yīng)用程序菜單)、(應(yīng)用程序菜單)、RibbonTab(選項(xiàng)卡)。選項(xiàng)卡)。在在QuickAccessToolBar和和RibbonTab子項(xiàng)內(nèi),除了子項(xiàng)內(nèi),除了可以使用一般的可以使用一般的WPF控件外,最常見(jiàn)的做法是在該控控件外,最常見(jiàn)的做法是在該控件的子項(xiàng)中包含件的子項(xiàng)中包含Ribbon專用的子控件。專用的子控件。2.1.

4、1 設(shè)計(jì)選項(xiàng)卡設(shè)計(jì)選項(xiàng)卡lShowQuickAccessToolBarOnTop屬性屬性可控制快速訪問(wèn)工具欄顯示的位置(控制顯示在功能區(qū)的上部還可控制快速訪問(wèn)工具欄顯示的位置(控制顯示在功能區(qū)的上部還是下部)。是下部)。lRibbonApplicationMenu的的Visibility屬性屬性可控制菜單的可見(jiàn)形式(顯示、隱藏、折疊)。可控制菜單的可見(jiàn)形式(顯示、隱藏、折疊)。l設(shè)置快速訪問(wèn)工具欄作為窗口的標(biāo)題欄設(shè)置快速訪問(wèn)工具欄作為窗口的標(biāo)題欄要將根元素(默認(rèn)是要將根元素(默認(rèn)是Window元素)改為元素)改為RibbonWindow即可。即可。這并不是必需的,開發(fā)人員可根據(jù)需要決定是否這樣

5、做。這并不是必需的,開發(fā)人員可根據(jù)需要決定是否這樣做。2.1.1 設(shè)計(jì)選項(xiàng)卡設(shè)計(jì)選項(xiàng)卡l演示示例:設(shè)計(jì)演示示例:設(shè)計(jì)Ribbon控件(具體實(shí)現(xiàn)課本控件(具體實(shí)現(xiàn)課本P25)2.1.2 在多個(gè)選項(xiàng)卡中重用選項(xiàng)在多個(gè)選項(xiàng)卡中重用選項(xiàng)l要在要在Ribbon的多個(gè)選項(xiàng)卡中重復(fù)使用完全相同的選項(xiàng),辦法的多個(gè)選項(xiàng)卡中重復(fù)使用完全相同的選項(xiàng),辦法是將這些選項(xiàng)設(shè)計(jì)為單獨(dú)的是將這些選項(xiàng)設(shè)計(jì)為單獨(dú)的WPF用戶控件。用戶控件。l具體做法具體做法在項(xiàng)目中添加一個(gè)在項(xiàng)目中添加一個(gè)WPF用戶控件用戶控件首先修改為讓其繼承自首先修改為讓其繼承自RibbonTab將將RibbonTab包含的項(xiàng)復(fù)制到該用戶控件中包含的項(xiàng)復(fù)制到

6、該用戶控件中2.1.2 在多個(gè)選項(xiàng)卡中重用選項(xiàng)在多個(gè)選項(xiàng)卡中重用選項(xiàng)l例如:例如:InkExamples項(xiàng)目中項(xiàng)目中MyRibbonTab用戶控件用戶控件部分部分XAML代碼代碼 RibbonGroup Header= RibbonRadioButton Label= IsChecked=True/ RibbonRadioButton Label= / RibbonGroup Header= RibbonRadioButton x:Name=rrbPen Label= / RibbonRadioButton Label= / 2.1.2 在多個(gè)選項(xiàng)卡中重用選項(xiàng)在多個(gè)選項(xiàng)卡中重用選項(xiàng)隱藏類代碼隱

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 觸筆和手勢(shì)觸筆和手勢(shì)l2.2.3 觸筆事件觸筆事件l2.2.4 墨跡筆畫(墨跡筆畫(Stroke)和墨跡數(shù)據(jù)()和墨跡數(shù)據(jù)(StrokeCollection)2.2 WPF中的數(shù)字墨跡中的數(shù)字墨跡l數(shù)字墨跡數(shù)字墨跡是指用手指或觸筆在具有觸摸功能的屏幕表面劃動(dòng)時(shí)產(chǎn)生的動(dòng)態(tài)是指用手指或觸筆在具有觸摸功能的屏幕表面劃動(dòng)時(shí)產(chǎn)生的動(dòng)態(tài)繪圖效果繪圖效果也可以在普通的臺(tái)式機(jī)上通過(guò)拖動(dòng)鼠標(biāo)來(lái)模擬手指或觸筆。也可以在普通的臺(tái)式機(jī)上通過(guò)拖動(dòng)鼠標(biāo)來(lái)模擬手指或觸筆。WPF在在System.Windows.Ink命名空間下提供了與數(shù)字墨跡相關(guān)命名空間下

9、提供了與數(shù)字墨跡相關(guān)的類的類2.2.1 墨跡畫板(墨跡畫板(InkCanvas)lInkCanvas控件控件在在System.Windows.Controls命名空間下,命名空間下,實(shí)現(xiàn)墨跡的收集、復(fù)制、選擇、顯示和輸入等功能。實(shí)現(xiàn)墨跡的收集、復(fù)制、選擇、顯示和輸入等功能。利用利用InkCanvas,可以讓用戶修改或刪除現(xiàn)有的,可以讓用戶修改或刪除現(xiàn)有的Stroke對(duì)象,同對(duì)象,同時(shí)還可以將其他控件添加到時(shí)還可以將其他控件添加到InkCanvas中。中。2.2.1 墨跡畫板(墨跡畫板(InkCanvas)lInkCanvas類的常用屬性如下類的常用屬性如下1.DefaultDrawingAtt

10、ributes屬性屬性u(píng)用于獲取或設(shè)置用于獲取或設(shè)置InkCanvasInkCanvas中新筆畫的繪制特性(中新筆畫的繪制特性(DrawingAttributesDrawingAttributes對(duì)象)。對(duì)象)。u該屬性的可選值有:該屬性的可選值有:Color(筆畫顏色)Width(觸筆寬度)Height(觸筆高度)StylusTip(觸筆形狀,圓形或者矩形)IsHighlighter(觸筆是否像熒光筆)FitToCurve(是否用貝塞爾曲線平滑法來(lái)呈現(xiàn)筆畫)IgnorePressure(筆畫粗細(xì)是否隨壓力自動(dòng)改變)。2.2.1 墨跡畫板(墨跡畫板(InkCanvas)2EditingMode

11、屬性屬性u(píng)該屬性指定了觸筆、手指、鼠標(biāo)等設(shè)備與該屬性指定了觸筆、手指、鼠標(biāo)等設(shè)備與InkCanvasInkCanvas交互的模交互的模式式u屬性的值屬性的值InkCanvasEditingModeInkCanvasEditingMode枚舉來(lái)表示,默認(rèn)值為枚舉來(lái)表示,默認(rèn)值為InkInk??煽蒊nk 接收墨跡GestureOnly 只響應(yīng)筆勢(shì)或手勢(shì)但不接收墨跡None 不執(zhí)行任何操作Select 用套索方式以及用觸筆與墨跡相交的方式選擇墨跡EraseByPoint 當(dāng)觸筆與墨跡相交時(shí)清除相交處的墨跡EraseByStroke 當(dāng)觸筆與墨跡相交時(shí)清除整個(gè)筆畫 。2.2.1 墨跡畫板(墨跡畫板(I

12、nkCanvas)l例例2-1 演示演示InkCanvas的基本用法。運(yùn)行效果如圖所示的基本用法。運(yùn)行效果如圖所示2.2.2 觸筆和手勢(shì)觸筆和手勢(shì)l1觸筆(觸筆(Stylus)觸筆(觸筆(Stylus)類似于我們平時(shí)手寫用的筆,其用途是將筆和圖)類似于我們平時(shí)手寫用的筆,其用途是將筆和圖面接觸在一起繪制圖形或?qū)懽帧C娼佑|在一起繪制圖形或?qū)懽?。在智能手機(jī)、平板電腦以及車載導(dǎo)航儀上都有專用的觸筆。另外在智能手機(jī)、平板電腦以及車載導(dǎo)航儀上都有專用的觸筆。另外,在這些設(shè)備上,也都可以用手指來(lái)代替觸筆。,在這些設(shè)備上,也都可以用手指來(lái)代替觸筆。對(duì)于臺(tái)式計(jì)算機(jī)來(lái)說(shuō),如果使用觸摸設(shè)備(觸摸屏),一樣可以對(duì)于

13、臺(tái)式計(jì)算機(jī)來(lái)說(shuō),如果使用觸摸設(shè)備(觸摸屏),一樣可以用手指來(lái)代替觸筆。但是,由于大部分普通計(jì)算機(jī)的屏幕并沒(méi)有用手指來(lái)代替觸筆。但是,由于大部分普通計(jì)算機(jī)的屏幕并沒(méi)有觸摸功能,所以只能用鼠標(biāo)來(lái)模擬。觸摸功能,所以只能用鼠標(biāo)來(lái)模擬。2.2.2 觸筆和手勢(shì)觸筆和手勢(shì)l2手勢(shì)(手勢(shì)(Gesture)手勢(shì)表示用觸筆或手指在畫面上劃動(dòng)時(shí)產(chǎn)生的軌跡。其基本特征手勢(shì)表示用觸筆或手指在畫面上劃動(dòng)時(shí)產(chǎn)生的軌跡。其基本特征是:劃動(dòng)時(shí)既可以不顯示劃動(dòng)軌跡,也可以用墨跡顯示劃動(dòng)的軌是:劃動(dòng)時(shí)既可以不顯示劃動(dòng)軌跡,也可以用墨跡顯示劃動(dòng)的軌跡,但是,一旦抬起觸筆或手指,劃動(dòng)時(shí)產(chǎn)生的墨跡就會(huì)自動(dòng)消跡,但是,一旦抬起觸筆或手指

14、,劃動(dòng)時(shí)產(chǎn)生的墨跡就會(huì)自動(dòng)消失。失。目前的智能手機(jī)基本上都有手勢(shì)功能,而且可以用兩個(gè)手指同時(shí)目前的智能手機(jī)基本上都有手勢(shì)功能,而且可以用兩個(gè)手指同時(shí)向不同的方向劃動(dòng)。但是,用鼠標(biāo)來(lái)模擬手勢(shì)時(shí),由于無(wú)法用一向不同的方向劃動(dòng)。但是,用鼠標(biāo)來(lái)模擬手勢(shì)時(shí),由于無(wú)法用一個(gè)鼠標(biāo)同時(shí)向不同的方向移動(dòng),所以只能模擬單個(gè)手指劃動(dòng)時(shí)的個(gè)鼠標(biāo)同時(shí)向不同的方向移動(dòng),所以只能模擬單個(gè)手指劃動(dòng)時(shí)的手勢(shì)效果。手勢(shì)效果。2.2.2 觸筆和手勢(shì)觸筆和手勢(shì)l3觸點(diǎn)(觸點(diǎn)(StylusPoint)觸點(diǎn)表示手指在圖面上劃動(dòng)或者按住鼠標(biāo)左鍵拖動(dòng)時(shí)收集到的數(shù)觸點(diǎn)表示手指在圖面上劃動(dòng)或者按住鼠標(biāo)左鍵拖動(dòng)時(shí)收集到的數(shù)據(jù)點(diǎn),有了這些數(shù)據(jù)點(diǎn),就

15、可以用它構(gòu)成墨跡筆畫(據(jù)點(diǎn),有了這些數(shù)據(jù)點(diǎn),就可以用它構(gòu)成墨跡筆畫(Stroke)。)。觸點(diǎn)用觸點(diǎn)用System.Windows.Ink命名空間下的命名空間下的StylusPoint結(jié)構(gòu)來(lái)結(jié)構(gòu)來(lái)表示,該結(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對(duì)象均包含(對(duì)象均包含(x, yx, y)坐標(biāo)以及觸點(diǎn)壓力屬性。坐標(biāo)以及觸點(diǎn)壓力屬性。2.2.2 觸筆和手勢(shì)觸筆和手勢(shì)l4觸點(diǎn)壓力(觸點(diǎn)壓力(PressureFactor)System.Windows.Ink命名空間下的命名空間下的PressureFactor類表示當(dāng)觸類表示當(dāng)觸筆或手指按壓在圖面設(shè)備上時(shí)按壓力量的大小,簡(jiǎn)稱觸點(diǎn)壓力筆或手指按壓在圖面設(shè)備上時(shí)按壓力

17、量的大小,簡(jiǎn)稱觸點(diǎn)壓力用鼠標(biāo)模擬時(shí),可通過(guò)鼠標(biāo)移動(dòng)的快慢來(lái)表示,移動(dòng)越快,表示用鼠標(biāo)模擬時(shí),可通過(guò)鼠標(biāo)移動(dòng)的快慢來(lái)表示,移動(dòng)越快,表示觸點(diǎn)壓力越??;移動(dòng)越慢,表示觸點(diǎn)壓力越大。觸點(diǎn)壓力越??;移動(dòng)越慢,表示觸點(diǎn)壓力越大。觸點(diǎn)壓力最小為觸點(diǎn)壓力最小為0.0,最大為,最大為1.0,默認(rèn)值為,默認(rèn)值為0.5。l5手寫識(shí)別手寫識(shí)別手寫識(shí)別只是在數(shù)字墨跡的基礎(chǔ)上增加了文字識(shí)別技術(shù),并將識(shí)手寫識(shí)別只是在數(shù)字墨跡的基礎(chǔ)上增加了文字識(shí)別技術(shù),并將識(shí)別的文字自動(dòng)顯示出來(lái)供用戶選擇。由于這部分內(nèi)容超出了本書別的文字自動(dòng)顯示出來(lái)供用戶選擇。由于這部分內(nèi)容超出了本書的范圍,因此不再介紹。的范圍,因此不再介紹。2.2.3

18、 觸筆事件觸筆事件l在所有在所有WPF控件上,都可以用觸筆繪制,并引發(fā)相應(yīng)的觸筆事控件上,都可以用觸筆繪制,并引發(fā)相應(yīng)的觸筆事件。件。所有觸筆事件都有所有觸筆事件都有Stylus前綴。前綴。觸筆事件也都具有成對(duì)的觸筆事件也都具有成對(duì)的“隧道隧道/冒泡冒泡”事件,而且這些事件都始事件,而且這些事件都始終在應(yīng)用程序線程上引發(fā)。終在應(yīng)用程序線程上引發(fā)。當(dāng)用戶在任何一個(gè)當(dāng)用戶在任何一個(gè)WPF控件(或者叫元素)上用手指、觸筆或者控件(或者叫元素)上用手指、觸筆或者拖動(dòng)鼠標(biāo)實(shí)現(xiàn)圖形繪制和平移時(shí),如果屏幕有觸摸功能,都會(huì)引拖動(dòng)鼠標(biāo)實(shí)現(xiàn)圖形繪制和平移時(shí),如果屏幕有觸摸功能,都會(huì)引發(fā)該控件的觸筆事件。發(fā)該控件的

19、觸筆事件。注意:注意:u對(duì)于對(duì)于InkCanvasInkCanvas控件來(lái)說(shuō),它還會(huì)自動(dòng)將鼠標(biāo)作為觸筆來(lái)處理??丶?lái)說(shuō),它還會(huì)自動(dòng)將鼠標(biāo)作為觸筆來(lái)處理。2.2.3 觸筆事件觸筆事件l1常用事件(常用事件( InkCanvas為例)為例)StylusDown事件:事件:u用戶在用戶在InkCanvasInkCanvas控件上用觸筆、手指與圖面接觸,或者按下鼠標(biāo)左控件上用觸筆、手指與圖面接觸,或者按下鼠標(biāo)左鍵時(shí),都會(huì)引發(fā)鍵時(shí),都會(huì)引發(fā)StylusDownStylusDown事件??梢栽诖耸录胁东@觸點(diǎn)集合(事件。可以在此事件中捕獲觸點(diǎn)集合(StylusPointCollectionStylusPo

20、intCollection),剛按下時(shí)該集合中只有一個(gè)觸點(diǎn)。),剛按下時(shí)該集合中只有一個(gè)觸點(diǎn)。StylusMove事件:事件:u用戶在用戶在InkCanvasInkCanvas控件內(nèi)移動(dòng)觸筆或手指,或者按住鼠標(biāo)左鍵移動(dòng)鼠控件內(nèi)移動(dòng)觸筆或手指,或者按住鼠標(biāo)左鍵移動(dòng)鼠標(biāo)時(shí),都會(huì)引發(fā)標(biāo)時(shí),都會(huì)引發(fā)StylusMoveStylusMove事件。在移動(dòng)觸筆、手指或者鼠標(biāo)的過(guò)事件。在移動(dòng)觸筆、手指或者鼠標(biāo)的過(guò)程中,可以持續(xù)獲得一系列觸點(diǎn)。程中,可以持續(xù)獲得一系列觸點(diǎn)。StylusUp事件:事件:u用戶釋放鼠標(biāo)左鍵、拿開觸筆或者抬起手指時(shí),都會(huì)引發(fā)用戶釋放鼠標(biāo)左鍵、拿開觸筆或者抬起手指時(shí),都會(huì)引發(fā)Stylu

21、sUpStylusUp事件。事件。2.2.3 觸筆事件觸筆事件l2其他事件其他事件除了常用的觸筆事件外,還有一些觸筆事件,例如除了常用的觸筆事件外,還有一些觸筆事件,例如StylusEnter(觸筆進(jìn)入控件范圍內(nèi)時(shí)引發(fā))(觸筆進(jìn)入控件范圍內(nèi)時(shí)引發(fā))StylusLeave(觸筆離開控件范圍內(nèi)時(shí)引發(fā))(觸筆離開控件范圍內(nèi)時(shí)引發(fā))StylusRange(觸筆懸停于此控件上方并位于圖面設(shè)備可檢測(cè)的(觸筆懸停于此控件上方并位于圖面設(shè)備可檢測(cè)的范圍之內(nèi)時(shí)引發(fā))范圍之內(nèi)時(shí)引發(fā))StylusOutOfRange(觸筆懸停于此控件上方并位于圖面設(shè)備可(觸筆懸停于此控件上方并位于圖面設(shè)備可檢測(cè)的范圍之外時(shí)引發(fā))檢

22、測(cè)的范圍之外時(shí)引發(fā))StylusInAirMove(在觸筆掠過(guò)控件但并未實(shí)際接觸圖面設(shè)備時(shí)(在觸筆掠過(guò)控件但并未實(shí)際接觸圖面設(shè)備時(shí)引發(fā))引發(fā))2.2.4 墨跡筆畫(墨跡筆畫(Stroke)和墨跡數(shù))和墨跡數(shù)據(jù)(據(jù)(StrokeCollection)l筆畫筆畫觸筆(觸筆(Stylus)在畫板上移動(dòng)時(shí)顯示的痕跡叫墨跡筆畫()在畫板上移動(dòng)時(shí)顯示的痕跡叫墨跡筆畫(Stroke),簡(jiǎn)稱筆畫。),簡(jiǎn)稱筆畫。當(dāng)按住鼠標(biāo)左鍵拖動(dòng)時(shí)(模擬手指在觸摸屏、平板電腦、智能手當(dāng)按住鼠標(biāo)左鍵拖動(dòng)時(shí)(模擬手指在觸摸屏、平板電腦、智能手機(jī)、導(dǎo)航儀等屏幕上劃動(dòng)),或者加載墨跡文件時(shí),創(chuàng)建的筆畫機(jī)、導(dǎo)航儀等屏幕上劃動(dòng)),或者加載

23、墨跡文件時(shí),創(chuàng)建的筆畫用用System.Windows.Ink命名空間下的命名空間下的Stroke對(duì)象來(lái)表示。對(duì)象來(lái)表示。注意注意u使用時(shí)不要將筆畫(使用時(shí)不要將筆畫(StrokeStroke)和畫筆()和畫筆(BrushBrush)混淆在一起。)混淆在一起。2.2.4 墨跡筆畫(墨跡筆畫(Stroke)和墨跡數(shù))和墨跡數(shù)據(jù)(據(jù)(StrokeCollection)l1Stroke對(duì)象對(duì)象Stroke對(duì)象的對(duì)象的DrawingAttributes屬性用于獲取或設(shè)置筆畫的繪屬性用于獲取或設(shè)置筆畫的繪制特性。制特性。DrawingAttributes類類u該類用于指定該類用于指定StrokeStro

24、ke的外觀。包括顏色、寬度、透明度、形狀等。的外觀。包括顏色、寬度、透明度、形狀等。Guid結(jié)構(gòu)結(jié)構(gòu)u全局唯一標(biāo)識(shí)符(全局唯一標(biāo)識(shí)符(GUIDGUID)是一個(gè))是一個(gè)3232位的十六進(jìn)制數(shù)(位的十六進(jìn)制數(shù)(1616個(gè)字節(jié)),個(gè)字節(jié)),繪制墨跡時(shí),可用它表示唯一的墨跡繪制墨跡時(shí),可用它表示唯一的墨跡IDID。2.2.4 墨跡筆畫(墨跡筆畫(Stroke)和墨跡數(shù))和墨跡數(shù)據(jù)(據(jù)(StrokeCollection)用字符串表示用字符串表示Guid結(jié)構(gòu)時(shí),一般用結(jié)構(gòu)時(shí),一般用8-4-4-4-12的格式對(duì)其分組(的格式對(duì)其分組(每個(gè)字符表示一位十六進(jìn)制數(shù),每個(gè)字符表示一位十六進(jìn)制數(shù),16個(gè)字節(jié)共個(gè)字節(jié)

25、共32個(gè)字符),各組之個(gè)字符),各組之間用連線符分隔。例如:間用連線符分隔。例如: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ù)語(yǔ)法。結(jié)構(gòu)有多種構(gòu)造函數(shù),下

26、面是其中的一種構(gòu)造函數(shù)語(yǔ)法。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注意注意如果隨機(jī)生成如果隨機(jī)生成id,只需要用哈希函數(shù)或者,只需要用哈希函數(shù)或者Random類隨機(jī)生成每類隨機(jī)生成每

28、個(gè)值,然后判斷是否和已經(jīng)存在的個(gè)值,然后判斷是否和已經(jīng)存在的id相同,如果相同,再次隨機(jī)相同,如果相同,再次隨機(jī)生成。生成。一般用一般用Guid的靜態(tài)的靜態(tài)NewGuid方法自動(dòng)獲取新的方法自動(dòng)獲取新的GUID。例如:。例如:uGuid id = Guid.NewGuid();Guid id = Guid.NewGuid();u這種方式能確保每次創(chuàng)建的這種方式能確保每次創(chuàng)建的idid都不相同。這樣一來(lái),繪圖時(shí)我們就都不相同。這樣一來(lái),繪圖時(shí)我們就不需要自己去創(chuàng)建和維護(hù)每個(gè)對(duì)象的不需要自己去創(chuàng)建和維護(hù)每個(gè)對(duì)象的IDID號(hào)了。號(hào)了。2.2.4 墨跡筆畫(墨跡筆畫(Stroke)和墨跡數(shù))和墨跡數(shù)據(jù)

29、(據(jù)(StrokeCollection)l2StrokeCollection對(duì)象對(duì)象在在WPF中,墨跡數(shù)據(jù)用墨跡集合(中,墨跡數(shù)據(jù)用墨跡集合(StrokeCollection對(duì)象)來(lái)表對(duì)象)來(lái)表示示該集合中的每個(gè)成員都是一個(gè)該集合中的每個(gè)成員都是一個(gè)Stroke對(duì)象,而且每個(gè)對(duì)象,而且每個(gè)Stroke對(duì)象對(duì)象都自動(dòng)擁有自己的生命周期。都自動(dòng)擁有自己的生命周期。在在InkCanvas類或者從該類繼承的類中,類或者從該類繼承的類中,WPF會(huì)自動(dòng)將一組會(huì)自動(dòng)將一組Stroke對(duì)象收集到一個(gè)對(duì)象收集到一個(gè)StrokeCollection內(nèi),并自動(dòng)提供常用的內(nèi),并自動(dòng)提供常用的墨跡管理和操作方法(命中測(cè)

30、試、擦除、轉(zhuǎn)換、序列化、保存、墨跡管理和操作方法(命中測(cè)試、擦除、轉(zhuǎn)換、序列化、保存、加載、復(fù)制、粘貼等)。加載、復(fù)制、粘貼等)。直接用從直接用從InkCanvas繼承的類和繼承的類和StrokeCollection對(duì)象來(lái)實(shí)現(xiàn)墨對(duì)象來(lái)實(shí)現(xiàn)墨跡的各種處理功能。跡的各種處理功能。2.3 自定義墨跡畫板自定義墨跡畫板l2.3.1 靜態(tài)呈現(xiàn)和動(dòng)態(tài)呈現(xiàn)靜態(tài)呈現(xiàn)和動(dòng)態(tài)呈現(xiàn)l2.3.2 制作自定義墨跡控件制作自定義墨跡控件2.3.1 靜態(tài)呈現(xiàn)和動(dòng)態(tài)呈現(xiàn)靜態(tài)呈現(xiàn)和動(dòng)態(tài)呈現(xiàn)l墨跡呈現(xiàn)方法:墨跡呈現(xiàn)方法:動(dòng)態(tài)和靜態(tài)。動(dòng)態(tài)和靜態(tài)。為了能繪制各種自定義的形狀,一般情況下,我們需要?jiǎng)?chuàng)建一個(gè)為了能繪制各種自定義的形狀,一

31、般情況下,我們需要?jiǎng)?chuàng)建一個(gè)既能動(dòng)態(tài)呈現(xiàn)墨跡又能靜態(tài)呈現(xiàn)墨跡的自定義墨跡控件。既能動(dòng)態(tài)呈現(xiàn)墨跡又能靜態(tài)呈現(xiàn)墨跡的自定義墨跡控件。2.3.1 靜態(tài)呈現(xiàn)和動(dòng)態(tài)呈現(xiàn)靜態(tài)呈現(xiàn)和動(dòng)態(tài)呈現(xiàn)l1靜態(tài)呈現(xiàn)靜態(tài)呈現(xiàn)靜態(tài)呈現(xiàn)是指將墨跡添加到控件之后再顯示墨跡。靜態(tài)呈現(xiàn)是指將墨跡添加到控件之后再顯示墨跡。添加方式有:添加方式有:u通過(guò)觸筆添加、從剪貼板中粘貼、從文件中加載通過(guò)觸筆添加、從剪貼板中粘貼、從文件中加載靜態(tài)呈現(xiàn)墨跡的辦法是自定義從靜態(tài)呈現(xiàn)墨跡的辦法是自定義從Stroke類繼承的類。類繼承的類。u由于由于StrokeStroke對(duì)象會(huì)自動(dòng)收集對(duì)象會(huì)自動(dòng)收集StylusPointStylusPoint數(shù)據(jù)、創(chuàng)建

32、筆畫以及將筆畫數(shù)據(jù)、創(chuàng)建筆畫以及將筆畫添加到自定義的墨跡控件上,因此我們只需要在自定義的類中重寫添加到自定義的墨跡控件上,因此我們只需要在自定義的類中重寫引發(fā)觸筆事件的引發(fā)觸筆事件的DrawCoreDrawCore方法,即可實(shí)現(xiàn)靜態(tài)呈現(xiàn)功能。其他引發(fā)方法,即可實(shí)現(xiàn)靜態(tài)呈現(xiàn)功能。其他引發(fā)觸筆事件的方法可以根據(jù)需要決定是否重寫。觸筆事件的方法可以根據(jù)需要決定是否重寫。2.3.1 靜態(tài)呈現(xiàn)和動(dòng)態(tài)呈現(xiàn)靜態(tài)呈現(xiàn)和動(dòng)態(tài)呈現(xiàn)l2動(dòng)態(tài)呈現(xiàn)動(dòng)態(tài)呈現(xiàn)動(dòng)態(tài)呈現(xiàn)是指在移動(dòng)觸點(diǎn)的過(guò)程中同時(shí)呈現(xiàn)墨跡。在這種方式下動(dòng)態(tài)呈現(xiàn)是指在移動(dòng)觸點(diǎn)的過(guò)程中同時(shí)呈現(xiàn)墨跡。在這種方式下,墨跡看上去好像是用觸筆畫出來(lái)的。,墨跡看上去好像是用

33、觸筆畫出來(lái)的。動(dòng)態(tài)呈現(xiàn)墨跡的辦法:動(dòng)態(tài)呈現(xiàn)墨跡的辦法:u是將自定義墨跡控件的是將自定義墨跡控件的DynamicRendererDynamicRenderer屬性設(shè)置為自定義的從屬性設(shè)置為自定義的從DynamicRendererDynamicRenderer類繼承的類。類繼承的類。u在自定義的類中,分別重寫引發(fā)觸筆事件的方法,常用的有在自定義的類中,分別重寫引發(fā)觸筆事件的方法,常用的有OnStylusDownOnStylusDown、OnStylusMoveOnStylusMove以及以及OnDrawOnDraw等。其中等。其中OnDrawOnDraw是必須重是必須重寫的方法,其他方法可以根據(jù)需

34、要決定是否重寫。寫的方法,其他方法可以根據(jù)需要決定是否重寫。注意注意u如果用鼠標(biāo)來(lái)模擬觸筆,動(dòng)態(tài)呈現(xiàn)時(shí),它每次收集到的墨跡數(shù)據(jù)只如果用鼠標(biāo)來(lái)模擬觸筆,動(dòng)態(tài)呈現(xiàn)時(shí),它每次收集到的墨跡數(shù)據(jù)只有兩個(gè)點(diǎn),注意這和靜態(tài)呈現(xiàn)時(shí)已經(jīng)有很多個(gè)點(diǎn)的情況完全不同。有兩個(gè)點(diǎn),注意這和靜態(tài)呈現(xiàn)時(shí)已經(jīng)有很多個(gè)點(diǎn)的情況完全不同。2.3.2 制作自定義墨跡控件制作自定義墨跡控件l創(chuàng)建自定義墨跡畫板創(chuàng)建自定義墨跡畫板創(chuàng)建自定義墨跡畫板的辦法就是讓其繼承自創(chuàng)建自定義墨跡畫板的辦法就是讓其繼承自InkCanvas類。類。一個(gè)一個(gè)InkCanvas可以具有一個(gè)或多個(gè)動(dòng)態(tài)呈現(xiàn)的對(duì)象(可以具有一個(gè)或多個(gè)動(dòng)態(tài)呈現(xiàn)的對(duì)象(DynamicR

35、enderer)。)。在自定義的墨跡畫板中,我們只需要將多個(gè)在自定義的墨跡畫板中,我們只需要將多個(gè)DynamicRenderer對(duì)對(duì)象分別添加到象分別添加到StylusPlugIns屬性中,再將其賦值給屬性中,再將其賦值給DynamicRenderer屬性,即可將其添加到自定義的屬性,即可將其添加到自定義的InkCanvas中中DynamicRenderer對(duì)象是一個(gè)特殊的對(duì)象是一個(gè)特殊的StylusPlugIns對(duì)象,在對(duì)象,在WPF應(yīng)用程序中,使用應(yīng)用程序中,使用InkCanvas或者使用繼承自或者使用繼承自InkCanvas類類的自定義墨跡控件,不需要顯式聲明的自定義墨跡控件,不需要顯式

36、聲明StylusPlugIns,只需要設(shè)計(jì),只需要設(shè)計(jì)從從DynamicRenderer繼承的類,即可實(shí)現(xiàn)動(dòng)態(tài)的即時(shí)呈現(xiàn)。繼承的類,即可實(shí)現(xiàn)動(dòng)態(tài)的即時(shí)呈現(xiàn)。2.3.2 制作自定義墨跡控件制作自定義墨跡控件l制作自定義墨跡畫板的主要設(shè)計(jì)步驟如下。制作自定義墨跡畫板的主要設(shè)計(jì)步驟如下。創(chuàng)建一個(gè)從創(chuàng)建一個(gè)從InkCanvas派生的類。派生的類。將自定義的將自定義的DynamicRenderer分配給分配給InkCanvas.DynamicRenderer屬性。屬性。重寫重寫OnStrokeCollected方法。在此方法中,移除已添加到方法。在此方法中,移除已添加到InkCanvas中的原始筆畫,然

37、后創(chuàng)建一個(gè)自定義筆畫,將其添加中的原始筆畫,然后創(chuàng)建一個(gè)自定義筆畫,將其添加到到Strokes屬性中。屬性中。最后再使用包含該自定義筆畫的新最后再使用包含該自定義筆畫的新InkCanvasStrokeCollectedEventArgs調(diào)用基類相應(yīng)的方法。調(diào)用基類相應(yīng)的方法。2.4 利用自定義墨跡畫板實(shí)現(xiàn)動(dòng)態(tài)繪圖利用自定義墨跡畫板實(shí)現(xiàn)動(dòng)態(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自定義墨跡畫板,并利用自定義墨跡畫板,并利用它繪制單個(gè)球形或圓環(huán),運(yùn)行效果如圖它繪制單個(gè)球形或圓環(huán),運(yùn)行效果如圖2-3所示。所示。圖圖2-3 例例2-2的運(yùn)行效果的運(yùn)行效果2.4.2 繪制球形序列繪制球形序列l(wèi)【例【例2-3】使用鼠標(biāo)拖動(dòng)的辦法,在自定義墨跡畫板中繪制任】使用鼠標(biāo)拖動(dòng)的辦法,在自定義墨跡畫板中繪制任意數(shù)量的球形序列,或者用球形序列繪制單個(gè)大小固定的球形意數(shù)量的球形序列,或者用球形

39、序列繪制單個(gè)大小固定的球形。程序運(yùn)行效果如圖。程序運(yùn)行效果如圖2-4所示。所示。圖圖2-4 例例2-3的運(yùn)行效果的運(yùn)行效果2.4.3 繪制矩形和矩形序列繪制矩形和矩形序列l(wèi)【例【例2-4】使用鼠標(biāo)拖動(dòng)的辦法,在自定義墨跡畫板中繪制單】使用鼠標(biāo)拖動(dòng)的辦法,在自定義墨跡畫板中繪制單個(gè)矩形和任意數(shù)量的矩形序列。運(yùn)行效果如圖個(gè)矩形和任意數(shù)量的矩形序列。運(yùn)行效果如圖2-5所示。所示。圖圖2-5 例例2-4的運(yùn)行效果的運(yùn)行效果2.4.4 繪制圖像和圖像序列繪制圖像和圖像序列l(wèi)【例【例2-5】使用鼠標(biāo)拖動(dòng)的辦法,在自定義墨跡畫板中繪制單】使用鼠標(biāo)拖動(dòng)的辦法,在自定義墨跡畫板中繪制單個(gè)圖像和任意數(shù)量的圖像序列

40、。運(yùn)行效果如圖個(gè)圖像和任意數(shù)量的圖像序列。運(yùn)行效果如圖2-6所示。所示。圖圖2-6 例例2-5的運(yùn)行效果的運(yùn)行效果2.4.5 繪制漸變直線繪制漸變直線l【例【例2-6】使用鼠標(biāo)拖動(dòng)的辦法,在自定義墨跡畫板中繪制任】使用鼠標(biāo)拖動(dòng)的辦法,在自定義墨跡畫板中繪制任意數(shù)量和方向的漸變直線。運(yùn)行效果如圖意數(shù)量和方向的漸變直線。運(yùn)行效果如圖2-7所示。所示。圖圖2-7 例例2-6的運(yùn)行效果的運(yùn)行效果2.4.6 繪制漸變曲線和文字繪制漸變曲線和文字l【例【例2-7】使用鼠標(biāo)拖動(dòng)的辦法,在自定義墨跡畫板中繪制純】使用鼠標(biāo)拖動(dòng)的辦法,在自定義墨跡畫板中繪制純色或者漸變的曲線和文字。運(yùn)行效果如圖色或者漸變的曲線和

41、文字。運(yùn)行效果如圖2-8所示。所示。圖圖2-8 例例2-7的運(yùn)行效果的運(yùn)行效果2.4.7 選擇、編輯、縮放與橡皮擦選擇、編輯、縮放與橡皮擦l1選擇、編輯、縮放選擇、編輯、縮放當(dāng)利用【套索選擇】工具或者【全選】工具選擇墨跡后,可直接當(dāng)利用【套索選擇】工具或者【全選】工具選擇墨跡后,可直接通過(guò)鼠標(biāo)移動(dòng)所選筆畫,或者通過(guò)鼠標(biāo)拖動(dòng)其周圍的控制點(diǎn),編通過(guò)鼠標(biāo)移動(dòng)所選筆畫,或者通過(guò)鼠標(biāo)拖動(dòng)其周圍的控制點(diǎn),編輯或縮放所選筆畫,圖輯或縮放所選筆畫,圖2-9演示了套索選擇的范圍。演示了套索選擇的范圍。圖圖2-9 套索選擇套索選擇2.4.7 選擇、編輯、縮放與橡皮擦選擇、編輯、縮放與橡皮擦l選擇了筆畫,即可對(duì)其縮

42、放,圖選擇了筆畫,即可對(duì)其縮放,圖2-10所示為套索選擇的對(duì)象縮所示為套索選擇的對(duì)象縮小后的效果。小后的效果。圖圖2-10 縮放套索選擇的筆畫縮放套索選擇的筆畫2.4.7 選擇、編輯、縮放與橡皮擦選擇、編輯、縮放與橡皮擦l橡皮擦:橡皮擦:既可以按照墨跡擦除筆畫中的一部分(或者利用它把一個(gè)墨跡分既可以按照墨跡擦除筆畫中的一部分(或者利用它把一個(gè)墨跡分為幾部分),也可以一次性刪除所選的筆畫,圖為幾部分),也可以一次性刪除所選的筆畫,圖2-11演示了墨跡演示了墨跡擦除的效果擦除的效果圖圖2-11 利用墨跡擦除將筆畫分為多個(gè)部分利用墨跡擦除將筆畫分為多個(gè)部分2.4.8 保存和打開墨跡文件保存和打開墨跡文件l1自定義墨跡筆畫自定義墨跡筆畫當(dāng)需要保存筆畫的自定義屬性時(shí),可以用筆畫的當(dāng)需要保存筆畫的自定義屬性時(shí),可以用筆畫的AddPropertyData方法。這些自定義的屬性都存儲(chǔ)在每個(gè)筆畫(方法。這些自定義的屬性都存儲(chǔ)在每個(gè)筆畫(Stroke對(duì)象)的內(nèi)部。對(duì)象)的內(nèi)部。通過(guò)通過(guò)AddPr

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論