青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

AVEVA .Net 菜單自定義

Posted on 2013-03-17 11:25 eryar 閱讀(5127) 評論(1)  編輯 收藏 引用 所屬分類: 4.AVEVA Solution

AVEVA .Net 菜單自定義

AVEVA .Net Command and Menu Customisation

eryar@163.com

 

摘要Abstract:以一個具體實例詳細介紹AVEVA .Net中自定義菜單的原理及方法。掌握了自定義菜單的方法就可以對二次開發的程序進行分類和整理,便于用戶使用。

關鍵字Key words:AVEVA .Net、Addin Commands、Menu Customisation、PDMS、二次開發

 

一、概述 Introduction

通過《AVEVA .Net Quick Start Guide》這篇文章,大家對AVEVA .Net的二次開發有了個大概認識,但是這樣并不能編寫出實際有用的二次開發插件(Addin)。本文再深入一步,介紹自定義菜單方法,在菜單中調用二次開發的插件,便于用戶操作。

用戶通過菜單、右鍵菜單命令、工具條來調用開發的插件。通用程序框架CAF(The Common Application Framework)通過類CommandBarManager來提供了創建菜單、工具條等的接口。也提供了與這些工具交互事件的接口,這種方法CAF雖然支持但不推薦。

通用程序框架CAF還支持通過UIC(用戶界面自定義文件User Interface Customisation)文件來自定義菜單、工具條等,UIC文件是XML格式的。

基于XML定義的菜單及工具條需要有個機制將用戶界面實體與需要調用的相關功能關聯上。為了實現這人目的,插件(Addins)功能通過一些命令對象(command objects)暴露出來。插件通過類CommandManager來加載這些命令對象。XML定義中可以包含用戶界面實體如菜單入口、工具條的按鈕及與其相關的命令對象。選擇相應的菜單或點擊工具條上的按鈕都可以導致相關聯的命令被執行。

基于命令模型的一個好處就是將用戶界面或顯示層與邏輯層解耦。程序邏輯層就與顯示層沒有什么直接關系了。若程序的狀態需要對用戶界面上的操作做出反映,程序只需要修改命令的狀態即可。命令對象知道它與哪個用戶界面實體關聯,所以確保其內部狀態反映相應的用戶界面。這對一些狀態是很簡單的,如“enabled”、“visible、“checked”;但對動態程序狀態就有點復雜了,如“combo-box”。

 

二、編寫命令類 Writing a Command Class

如下所示的代碼是一個簡單的命令類示例,用來管理一個可停靠窗口的可見性,代碼中是控制AttributeBrowser 可停靠窗口。通用程序框架CAF提供了一個抽象的命令類Command,所有的命令類都必須派生自Command類。在其構造函數中應該設置屬性Key,在UIC文件中是通過Key這個屬性來找到相應的命令,后面將會以一個實例來說明。

 

  1using System; 
  2
  3using System.Collections.Generic; 
  4
  5using System.Text; 
  6
  7using Aveva.ApplicationFramework.Presentation; 
  8
  9namespace Aveva.Presentation.AttributeBrowserAddin 
 10
 11
 12
 13/// <summary> 
 14
 15/// Class to manage the visibility state of the AttributeBrowser docked window 
 16
 17/// This command should be associated with a StateButtonTool. 
 18
 19/// </summary> 

 20
 21public class ShowAttributeBrowserCommand : Command 
 22
 23
 24
 25private DockedWindow _window; 
 26
 27/// <summary> 
 28
 29/// Constructor for ShowAttributeBrowserCommand 
 30
 31/// </summary> 
 32
 33/// <param name="window">The docked window whose visibilty state will be managed.</param> 

 34
 35public ShowAttributeBrowserCommand(DockedWindow window) 
 36
 37
 38
 39// Set the command key 
 40
 41this.Key = "Aveva.ShowAttributeBrowserCommand"
 42
 43// Save the docked window 
 44
 45            _window = window; 
 46
 47// Create an event handler for the window closed event 
 48
 49            _window.Closed += new EventHandler(_window_Closed); 
 50
 51// Create an event handler for the WindowLayoutLoaded event 
 52
 53            WindowManager.Instance.WindowLayoutLoaded += new EventHandler(Instance_WindowLayoutLoaded); 
 54
 55}
 
 56
 57void Instance_WindowLayoutLoaded(object sender, EventArgs e) 
 58
 59
 60
 61// Update the command state to match initial window visibility 
 62
 63this.Checked = _window.Visible; 
 64
 65}
 
 66
 67void _window_Closed(object sender, EventArgs e) 
 68
 69
 70
 71// Update the command state when the window is closed 
 72
 73this.Checked = false
 74
 75}
 
 76
 77        /// <summary> 
 78
 79        /// Override the base class Execute method to show and hide the window 
 80
 81        /// </summary> 

 82
 83        public override void Execute() 
 84
 85        
 86
 87            if (this.Checked) 
 88
 89            
 90
 91                _window.Show(); 
 92
 93            }
 
 94
 95            else 
 96
 97            
 98
 99                _window.Hide(); 
100
101            }
 
102
103        }
 
104
105    }
 
106
107}
 
108
109


抽象基類Command提供了以下方法,其派生類中可以重載:

l void Execute():必須被重載,在執行命令時調用這個函數;

l CommandState GetState():這個函數由通用程序框架CAF調用,以便更新用戶界面或上下文菜單。返回值是一個CommandState枚舉值,反應了命令的狀態。枚舉值用來位來表示命令狀態,這些狀態可以使用位的或OR操作。

l String Description:命令的描述;

l void Refrest(string context):當CommandManager.ApplicationContext的屬性更改時都會調用這個方法。這也就給了一個更新其Enabled或visible狀態的機會。

抽象基類Command也有一些屬性可以用來更新用戶界面上的狀態:

l bool Checked:若命令與像StateButtonTool這樣的用戶界面關聯,則此屬性值與用戶界面上的狀態會同步;

l bool Enabled:此屬性值的改變將會影響所有與其關聯的用戶界面;

l ArrayList List:此屬性允許命令可以與有字符列表的用戶界面交流。如ComboBoxTool;

l int SelectedIndex:此屬性表示被用記選中的列表中的索引值;

l object Value:此屬性保存了當前關聯的用戶界面實體;

l bool ValueChanged:通用程序框架CAF在調用命令類的Execute方法之前,若用戶界面的值改變時會設置此屬性的值。當命令執行結束后此值會被清除;

l bool Visible:此屬性值的改變將會影響所有與其關聯的用戶界面;

在通用程序框架CAF中注冊一個命令是通過向CommanManagers.Commands的集合中添加一個命令實例來實現的。程序代碼如下所示:

 

 1 // Create and register addins commands 
 2 
 3 // Get the CommandManager 
 4 
 5 CommandManager commandManager = (CommandManager)serviceManager.GetService(typeof(CommandManager)); 
 6 
 7 ShowAttributeBrowserCommand showCommand = new ShowAttributeBrowserCommand(attributeListWindow); 
 8 
 9 commandManager.Commands.Add(showCommand); 
10 

 

 

三、命令事件 Command Events

命令基類Command提供了兩個事件BeforeCommandExecute和CommandExecuted給程序員,用來響應命令的執行,即在命令執行前后做些處理。示例代碼如下:

 

 1 Command anotherCommand = commandManager.Commands["KeyOfCommand"]; 
 2 
 3 anotherCommand.BeforeCommandExecute += new System.ComponentModel.CancelEventHandler(anotherCommand_BeforeCommandExecute); 
 4 
 5 anotherCommand.CommandExecuted += new EventHandler(anotherCommand_CommandExecuted); 
 6 
 7 //The BeforeCommandExecute event handler is of type  
 8 
 9 //CancelEventHandler and is passed a CancelEventArgs object  
10 
11 //which enables the command execution to be cancelled by setting  
12 
13 //the Cancel property to true. 
14 
15 void anotherCommand_BeforeCommandExecute(object sender, System.ComponentModel.CancelEventArgs e) 
16 
17 
18 
19     e.Cancel = true
20 
21 
22 
23 

 

四、菜單自定義 Menu Customisation

用戶使用插件的方式通常都是通過使用菜單或命令欄上的按鈕。如前文所述,通用程序框架CAF提供了自定義菜單和命令欄的機制,即通過配置“User Interface Customisation”(UIC)文件。下面將會對UIC文件的細節進行描述,如怎樣配置通用程序框架CAF來加載UIC文件,通過用戶交互的自定義工具來編輯UIC文件等等。

 

五、配置要加載UIC文件的模塊 Configuring a Module to Load a UIC File

每個基于通用程序框架CAF的插件都有一個XML格式的配置文件,包含了程序啟動時需要加載的一系列UIC文件。此文件的默認路徑就是安裝目錄,文件名的命令方式為<模塊名>Customisation.xml。例如AVEVA Marine模塊Hull Design就有一個名為HullDesignCustomisation.xml的配置文件,文件內容如下所示。默認情況下UIC文件也希望在相同的目錄下。標專“$1”表示UIC文件的路徑將會由當前工程名代替。

 

<?xml version="1.0" encoding="utf-8"?> 

<UICustomizationSet xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<UICustomizationFiles> 

<CustomizationFile Name="Hull General" Path="AVEVA.Marine.UI.HullGeneral.uic" /> 

<CustomizationFile Name="Hull Design" Path="AVEVA.Marine.UI.HullDesign.uic" /> 

<CustomizationFile Name="Project" Path="$1.uic" /> 

<CustomizationFile Name="StatusControllerAddin" Path="StatusController.uic" /> 

</UICustomizationFiles> 

</UICustomizationSet> 

 

配置文件中UIC文件的順序是很重要的,它表示了程序加載這些自定義界面的順序。一個新的UIC文件可以加載到一個模塊中,通過在其配置文件中簡單添加一行即可。

與在模塊的配置文件中添加UIC文件的功能類似的方法是在程序中編碼實現對UIC文件的添加,通過CommandBarManager的方法AddUICustomisationFile來編碼實現UIC文件的添加。程序代碼如下所示:

 

1 // Load a UIC file for the AttributeBrowser. 
2 
3 CommandBarManager commandBarManager = (CommandBarManager)serviceManager.GetService(typeof(CommandBarManager)); 
4 
5 commandBarManager.AddUICustomizationFile("AttributeBrowser.uic""AttributeBrowser"); 
6 

 

通過具體實例將會看出,通過自定義對話框,配置文件中的UIC文件將會被管理,不用自己手動更改UIC文件中的內容。

 

六、UIC文件的編輯 Editing UIC File

UIC文件是通過通用程序框架CAF的內置交互工具來創建與編輯的,不需要親自更其中內容。通過在工具欄上右鍵,選擇Customize來啟動自定義對話框,如下圖所示:

wps_clip_image-4427

自定義對話框主要由七個部分組成:

① CommandBar Preview Area

② Active Customisation File

③ Tree showing CommandBars

④ List of tools

⑤ Property grid

⑥ Action buttons

⑦ Resource Editor

wps_clip_image-7897

wps_clip_image-27513

以下將會以具體實例來介紹相應的用法。更多細節請參考《AVEVA .NET Customisation User Guide》。通過自定義對話框,UIC文件中的內容將會被AVEVA管理,所以創建自定義的菜單或工具欄按鈕,都從這個自定義對話框中編輯,還是很方便。

 

七、程序實例 Codes

本節以一個具體實例來說明AVEVA .Net的菜單的自定義及與相關命令的關聯方法。步驟如下:

1. 創建一個C#的類庫(Class Library),工程名為HelloWorld,并選擇.NET Framework 3.5,如下圖所示:

wps_clip_image-19242

2. 添加引用Aveva.ApplicationFramework.dll和 Aveva.ApplicationFramework.Presentation.dll,如下圖所示:

wps_clip_image-11032

添加完后的引用庫如下圖所示:

wps_clip_image-24383

3. 編寫一個插件類HelloAddin,派生自IAddin,并實現那四個虛函數,程序代碼如下所示:

 

 1 using System; 
 2 
 3 using System.Collections.Generic; 
 4 
 5 using System.Text; 
 6 
 7 using Aveva.ApplicationFramework; 
 8 
 9 using Aveva.ApplicationFramework.Presentation; 
10 
11 namespace HelloWorld 
12 
13 
14 
15 public class HelloAddin : IAddin 
16 
17 
18 
19 #region IAddin Members 
20 
21 public string Description 
22 
23 
24 
25             get 
26 
27 
28 
29 return "AVEVA .Net Menu Customisation Demo."
30 
31 
32 
33 
34 
35 public string Name 
36 
37 
38 
39             get 
40 
41 
42 
43 return "HelloAddin"
44 
45 
46 
47 
48 
49 public void Start(ServiceManager serviceManager) 
50 
51 
52 
53 // Stop for attaching to the process. 
54 
55             System.Windows.Forms.MessageBox.Show("Debug"); 
56 
57 
58 
59 public void Stop() 
60 
61 
62 
63 
64 
65 #endregion 
66 
67 
68 
69 
70 
71 


4. 添加一個用戶控件(User Control)而不是一個窗口(Windows Form),如下圖所示:

wps_clip_image-5158

5. 自定義用戶控件上內容,本例僅在其上添加最簡單的label為例,添加后并將其內容改為“Hello World”,如下圖所示:

wps_clip_image-22989

6. 添加命令類HelloWorldCommand,派生自抽象基類Command,并實現幾個關鍵的方法。如在其構造函數中添加Key屬性,Key屬性在后面添加菜單時很重要。還有必須實現的Execute方法。程序代碼如下所示:

 

 1 using System; 
 2 
 3 using System.Collections.Generic; 
 4 
 5 using System.Text; 
 6 
 7 using Aveva.ApplicationFramework.Presentation; 
 8 
 9 namespace HelloWorld 
10 
11 
12 
13 class HelloWorldCommand : Command 
14 
15 
16 
17 private DockedWindow myWindow; 
18 
19 // Default Constructor. 
20 
21 public HelloWorldCommand(DockedWindow window) 
22 
23 
24 
25 // Set the command key. 
26 
27 // This is very import!!! 
28 
29 this.Key = "Aveva.HelloWorldCommand"
30 
31 // Save the docked window. 
32 
33             myWindow = window; 
34 
35 // Create an event handler for the window closed event. 
36 
37             myWindow.Closed += new EventHandler(_window_Closed); 
38 
39 // Create an event handler for the windowLayoutLoaded event. 
40 
41             WindowManager.Instance.WindowLayoutLoaded += new EventHandler(Instance_WindowLayoutLoaded); 
42 
43 
44 
45 void _window_Closed(object sender, EventArgs e) 
46 
47 
48 
49 this.Checked = false
50 
51 
52 
53 void Instance_WindowLayoutLoaded(object sender, EventArgs e) 
54 
55 
56 
57 // Update the command state to match initial window visibility. 
58 
59 this.Checked = myWindow.Visible; 
60 
61 
62 
63 // This method must be overriden to provide the command execution functionality. 
64 
65 public override void Execute() 
66 
67 
68 
69 // Always show the DockedWindow. 
70 
71             myWindow.Show(); 
72 
73 
74 
75 
76 
77 
78 
79 


7. 在派生自IAddin的類中的Start方法中添加創建可停靠窗口的代碼,并將命令添加通用程序框架的命令集合中去,程序如下所示:

 

 1 public void Start(ServiceManager serviceManager) 
 2 
 3 
 4 
 5 // Stop for attaching to the process. 
 6 
 7             System.Windows.Forms.MessageBox.Show("Debug"); 
 8 
 9 // Get the WindowManager service. 
10 
11             WindowManager windowManger = (WindowManager)serviceManager.GetService(typeof(WindowManager)); 
12 
13 // Create a docked window to host and Hello World User control. 
14 
15             DockedWindow myWindow = windowManger.CreateDockedWindow("Aveva.HelloAddin.UserControl"
16 
17 "HelloWorld"
18 
19 new HelloAddinControl(), 
20 
21                 DockedPosition.Right); 
22 
23 // Create and register Addin's command. 
24 
25             CommandManager commandManager = (CommandManager)serviceManager.GetService(typeof(CommandManager)); 
26 
27             HelloWorldCommand showCommand = new HelloWorldCommand(myWindow); 
28 
29             commandManager.Commands.Add(showCommand); 
30 
31 
32 
33 


8. 編譯工程(Build HelloWorld),并將生成的動態庫(HelloWorld.dll)復制到AVEVA的安裝目錄;

9. 修改配置文件,使其加載該插件,修改方法如下圖所示:

wps_clip_image-4719

10. 添加自定義菜單,方便插件的調用。在工具欄的任意位置點擊鼠標右鍵,選擇Customize,出現自定義的對話框,并在Active Customization File 的選項框中選擇Module,如下圖所示:

wps_clip_image-26549

在Menubar中添加自定義菜單項,將其名稱改為MenuTest,如下圖所示:

wps_clip_image-22156

在對話框中間任意位置點鼠標右鍵,添加一個按鈕(button),如下圖所示:

wps_clip_image-14721

修改按鈕的標題為ButtonTest,修改其命令(Command),在Core Command中選擇我們創建的命令類的Key,如下圖所示:

wps_clip_image-20459

將按鈕拖到左邊的菜單下后,Apply結束。如下圖所示:

wps_clip_image-9665

11. 自定義后的菜單如下圖所示:

wps_clip_image-5167

 

八、結論 Conclusion

通過實例對AVEVA .Net的二次開發有了便全面的認識,可以通過自定義菜單方便調用二次開發的插件。自定義菜單或者工具欄按鈕主要是通過自定義對話框來實現,不需要程序員手動修改UIC文件,交互操作使用方便。

若有術語用詞不當之處,敬請指出。eryar@163.com

 

九、參考資料 Bibliography

1. AVEVA .Net Customisation User Guide 本文基本上是對這個Guide的部分翻譯。

2. GoF book: Design Patterns Elements of Reusable Object-Oriented Software 對Command模式感興趣的可以一讀。

 

Feedback

# re: AVEVA .Net 菜單自定義  回復  更多評論   

2013-03-19 06:29 by http://www.essaycapital.com/


通過或者工具欄按鈕主要是通過自定義對話框來實現
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲日本va午夜在线影院| 亚洲精品影视| 亚洲精品乱码久久久久久黑人 | 亚洲大片免费看| 西西裸体人体做爰大胆久久久| 亚洲视频一区| 亚洲天堂久久| 欧美中文字幕在线播放| 久久国产精品免费一区| 久久精品视频播放| 欧美1区2区| 亚洲福利视频一区二区| 亚洲人成网站999久久久综合| 亚洲电影av| 在线中文字幕日韩| 欧美在线免费| 欧美激情女人20p| 欧美精品在线观看播放| 欧美深夜福利| 国内成人精品一区| 最新中文字幕亚洲| 亚洲欧美日韩精品久久亚洲区 | 国产午夜精品久久久| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 蜜臀av国产精品久久久久| 欧美高清视频在线观看| 欧美色中文字幕| 精品成人免费| 亚洲无线视频| 麻豆国产精品va在线观看不卡| 亚洲国产精品第一区二区| 99成人免费视频| 久久久亚洲综合| 国产精品成人在线| **欧美日韩vr在线| 午夜精品视频在线观看一区二区| 久久婷婷国产麻豆91天堂| 亚洲免费精彩视频| 久久久精品久久久久| 欧美日韩国语| 亚洲国产合集| 久久电影一区| 99这里有精品| 男男成人高潮片免费网站| 国产一级精品aaaaa看| 一区二区三区鲁丝不卡| 免费亚洲电影在线观看| 亚洲欧美国产精品va在线观看| 欧美11—12娇小xxxx| 亚洲图片欧美午夜| 欧美国产一区二区在线观看| 亚洲午夜久久久久久久久电影院 | 噜噜爱69成人精品| 国产欧美精品一区| 亚洲午夜视频| 亚洲国产专区| 老司机午夜精品| 亚洲成人自拍视频| 久久噜噜亚洲综合| 国产午夜精品全部视频播放| 亚洲第一久久影院| 欧美一区二区在线免费观看| 欧美视频在线播放| 欧美国产日韩一二三区| 亚洲国产精品成人综合色在线婷婷| 亚洲欧美视频在线观看视频| 亚洲伦理在线观看| 欧美精品在线网站| 在线一区观看| 一区二区三区精品久久久| 欧美日韩一卡| 亚洲无线视频| 亚洲性人人天天夜夜摸| 国产精品国产三级国产专播品爱网 | 国产亚洲一区二区在线观看| 欧美在线你懂的| 先锋影音网一区二区| 国产精品色网| 久久久久久日产精品| 久久国产福利国产秒拍| 精品成人a区在线观看| 欧美aⅴ一区二区三区视频| 老鸭窝亚洲一区二区三区| 亚洲韩国日本中文字幕| 亚洲高清视频在线观看| 欧美日韩国产另类不卡| 亚洲欧美日产图| 久久不射中文字幕| 亚洲国产成人在线播放| 日韩视频免费在线| 国产精品久久久久久久久动漫| 久久精品在这里| 免费在线成人av| 亚洲视频一起| 欧美一区综合| 99国产精品99久久久久久| 在线一区二区日韩| 伊人婷婷欧美激情| 亚洲精品麻豆| 国产精品一区二区女厕厕| 欧美成人免费播放| 欧美日韩一区不卡| 久久天天躁狠狠躁夜夜爽蜜月| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久精品国语| 鲁鲁狠狠狠7777一区二区| 精品动漫3d一区二区三区免费版| 免费久久99精品国产自| 欧美日韩中文字幕精品| 鲁大师影院一区二区三区| 欧美日韩亚洲高清| 麻豆精品一区二区av白丝在线| 欧美日韩卡一卡二| 老巨人导航500精品| 国产精品hd| 男男成人高潮片免费网站| 欧美午夜电影在线| 浪潮色综合久久天堂| 国产精品女人久久久久久| 欧美激情小视频| 国产一在线精品一区在线观看| 亚洲精美视频| 亚洲成人在线视频网站| 亚洲自拍偷拍色片视频| 日韩视频免费| 久久综合久久综合这里只有精品| 午夜久久tv| 欧美日本在线一区| 美女爽到呻吟久久久久| 国产欧美精品一区| 亚洲色图在线视频| 99精品视频免费观看视频| 久久亚洲春色中文字幕| 欧美在线视频免费| 国产精品vip| 亚洲精品日韩激情在线电影| 在线观看一区二区精品视频| 性欧美video另类hd性玩具| 亚洲私人黄色宅男| 欧美精品一区二区三区一线天视频| 乱码第一页成人| 在线观看久久av| 久久精品国语| 美女在线一区二区| 激情综合激情| 久久久国产精彩视频美女艺术照福利| 欧美一区二区三区视频免费| 国产精品久久久久免费a∨| 亚洲视频精选| 亚洲欧美99| 国产精品wwwwww| 亚洲少妇自拍| 欧美在线不卡视频| 国产亚洲精品bt天堂精选| 欧美一区二区三区视频免费播放 | 一本久久知道综合久久| 亚洲国产日韩一级| 欧美11—12娇小xxxx| 国产欧美一区二区三区沐欲| 久久久国产精品一区二区三区| 欧美日韩三区| 一区二区三区久久| 国产精品分类| 亚洲一区在线观看免费观看电影高清| 亚洲视频大全| 国产精品久久久久久久免费软件| 亚洲香蕉在线观看| 亚洲欧美一级二级三级| 国产精品香蕉在线观看| 午夜精品久久久久久久男人的天堂| 久久精品国产在热久久| 91久久精品国产91久久性色| 欧美日韩一区二区三区高清| 午夜亚洲福利| 亚洲国产日韩一区| 性做久久久久久| 亚洲国产日韩在线| 欧美性片在线观看| 久久久久久久一区二区三区| 亚洲福利视频二区| 欧美日韩午夜在线视频| 欧美一区二区三区精品电影| 久久亚洲高清| 亚洲宅男天堂在线观看无病毒| 国产日产高清欧美一区二区三区| 久久久久久伊人| 亚洲国产欧美精品| 欧美一区激情视频在线观看| 伊人精品久久久久7777| 欧美日韩一区二区在线| 欧美在线免费播放| 中国日韩欧美久久久久久久久| 久久综合中文字幕| 亚洲视频1区2区| 国产亚洲视频在线观看| 欧美剧在线观看| 久久亚洲欧美国产精品乐播| 一本久久综合亚洲鲁鲁| 欧美国产综合| 欧美在线视频不卡|