天天看點

C#進行Visio二次開發之知識點考核試題

本次準備的教育訓練,除了全面介紹Visio的相關知識和概念,還以實戰開發的方式加深Visio二次開發的知識掌握,另外還通過試題來考核各個學生的掌握情況,本文主要是介紹我根據自己一直以來的Visio開發經驗所得,準備的Visio二次開發試題,并提供相應的解答分析,希望大家批評指正,一起溝通交流。 

雖然Visio已經在各行各業應用的很廣,不過這兩年來關注的部落格文章,Visio二次開發方面的文章除了我零星寫的一些,其他同行基本上沒有文章涉及(可能是沒有時間寫這方面經驗),雖然目前已經很少從項目上去升華、研究Visio二次開發方面的工作(除非又有一些特殊的項目合作需要)。是以,如果這方面我自己有一些新的心得或者資料,我是很樂意和大家一起分享。 

一)判斷題(每題5分,共20題,總分100分)

1)部署Visio二次開發的應用程式不需要安裝Office Visio。

   答案:錯,開發、部署都需要。

2)Visio的“以開發人員模式運作”模式,能幫助我們檢視更多、更細的Visio圖元的資訊。

答案: 對。

3)形狀資料視窗顯示的字段資訊,是Visio圖元内部固定的資料,不能通過代碼進行更改。

答案:錯,可以通過代碼修改,增加、修改、删除均可。

4)通過宏錄制功能,可以檢視某個功能的具體實作代碼,也能實作對圖元(Shape對象)等對象屬性的調試跟蹤。

答案:對。

5)可以通過Visio來實作模具的繪制,修改,調整其内部相應的控制内容,但模具顯示的圖示不可修改。

答案:錯,圖示也一樣可以修改。

6)Visio Drawing Control控件是一個COM控件,該控件除了提供界面顯示Visio文檔外,也提供了Visio二次開發中涉及到的Window、Document、Shape、Page、Selection等對象的事件處理。

7)Visio文檔裡面儲存到Shape Data屬性資料的時候,數值型、字元型的值儲存均要再前後加雙引号。

答案:錯,數值型是不需要加雙引号的。

8)Visio二次開發,可以通過代碼實作形狀資料視窗、模具檔案視窗、掃視和縮放等視窗的可見性進行控制,但不能通過代碼調用Visio控件裡面的界面元件對象(如CommandBar等UI元件對象)。

答案:錯,均可以。

9)Visio除了可以在Winform中通過控件實作對文檔的編輯外,也可以通過安裝Visio Viewer工具,實作Visio文檔基于Web方式的修改編輯。

答案:錯,Web方式隻能檢視,無法實作修改。

10) Visio Drawing Control控件,有一個重要的SRC屬性是用來打開或者關閉目前文檔,如果開始為該屬性指定特定的檔案路徑後,再次設定SRC為空,那麼控件顯示的文檔就會變為空白文檔。

答案:錯,SRC隻是關閉對引用檔案的操作,不會影響文檔的顯示,還是顯示原來的文檔。

11)模具檔案屬性的修改,必須先以讀寫方式打開模具文檔,才能進行相關的操作。

12)Visio文檔通過SRC打開指定檔案後,如果要重新關聯到不同的檔案上去,需要通過Marshal.ReleaseComObject方法來釋放已有的對象,如果是建立一個Visio文檔,則不需要這樣操作。

  答案:錯,均需要釋放對象。

13)Visio開發的Winform程式,可以使用兩種方式實作右鍵菜單:一種是通過捕捉Visio控件的MouseUpEvent事件,一種是通過RUNADDONWARGS函數來實作。兩種方式效果一樣,都帶有Visio常用的複制、粘貼、格式、資料等基本的菜單項目。

答案:錯,第一種沒有其他菜單。

14)屬性資料的下拉清單分為:固定清單、可變清單。兩者差別前者不可以通過代碼增加清單項目,後者可以增加;但兩者都可以既從清單中選擇資料,也可以輸入新的内容。

答案:錯誤,他們都可以通過代碼增加清單項目,隻是後者可以選擇已有的,也可以輸入其他内容。

15)Visio文檔提供列印目前頁、目前視圖、分頁列印等操作,同時也支援列印標明區域。

16)如果修改了模具的Master對象的形狀資料定義,如增加一個屬性字段,那麼圖紙對應的Master和Shape也能自動實作更新。

答案:錯,更新模具形狀屬性後,需要手動更新圖紙的資訊。

17)通過代碼操作,除了可以修改Shape對象的值外,還可以實作Shape對象的文本内容、字型大小、線條粗細、顯示顔色等屬性的修改。

  對。

18)Visio文檔有且隻有一個模具模闆(Master對象),一個模具對象在文檔中可有多個圖元(Shape對象)。

答案:對。  

19)一個形狀檔案包含一系列的模具組合,如開關模具組、跨越模具組。

20)Visio文檔可以儲存為XML格式檔案,通過這個檔案可以看到各種Visio對象之間的組織關系。

二)實戰開發題(每題50分,共1題,總分50分)

例子要求: 

1、打開指定的Visio及模具檔案,可以儲存Visio檔案,導出Visio為CAD。

2、選擇打開不同的Visio檔案,實作對象釋放及重新加載。

3、模仿EnventSink.cs代碼實作事件的偵聽及處理操作。

4、為頁面添加一個右鍵菜單【測試】,單擊測試彈出對話框顯示頁面數量、目前頁面名稱、Shape數量。

5、可以打開、隐藏模具檔案視窗。

答案: 

打開相關的Visio檔案,并在圖紙上右鍵,顯示右鍵菜單【測試】 

響應菜單操作後,界面彈出對話框,提示相關的資訊,如下圖。 

例子關鍵的代碼如下所示:

       private void btnOpen_Click(object sender, EventArgs e)

        {

            OpenFileDialog dlg = new OpenFileDialog();

            dlg.Filter = "Visio檔案(*.vsd)|*.vsd|所有檔案(*.*)|*.*";

            dlg.FilterIndex = 1;

            if (dlg.ShowDialog() == DialogResult.OK)

            {

                OpenVisio(dlg.FileName);

            }

        }

        private void OpenVisio(string fileName)

            VisioUtility.CloseAllStencileDocument(VisApplication);

            Marshal.ReleaseComObject(VisApplication);

            Marshal.ReleaseComObject(VisDocument.EventList);

            Marshal.ReleaseComObject(VisDocument);

            Marshal.ReleaseComObject(VisWindow);

            GC.Collect();

            Thread.Sleep(100);

            this.axDrawingControl1.Src = fileName;

            this.axDrawingControl1.Src = "";

            InitEventSink(VisApplication, VisDocument);

            this.axDrawingControl1.Document.Saved = true;

            List<string> filePaths = GetFilePaths(gStencileFileBasePath);

            foreach (string stencil in filePaths)

                VisioUtility.OpenStencilRead(VisApplication.Documents, stencil);

            AddContextMenu();

        private void AddContextMenu()

            Visio.Page page = VisioUtility.GetPage(VisDocument, "饋線圖");

            bool isEnable = true;

            if (page != null)

                //清除所有相關的菜單事件

                page.PageSheet.DeleteSection((short)VisSectionIndices.visSectionAction);

                //加入新的菜單

                VisioUtility.AddRightMouseAction(page.PageSheet,

                    "\"測試\"",

                    "RUNADDONWARGS(\"QUEUEMARKEREVENT\", \"/Drawing=測試\")",

                    isEnable, true, false, false, true, true);

        }