初級代碼游戲的專欄介紹與文章目錄-CSDN博客
我的github:codetoys,所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。
這些代碼大部分以Linux為目標但部分代碼是純C++的,可以在任何平臺上使用。
源碼指引:github源碼指引_初級代碼游戲的博客-CSDN博客
? ? ? ? 前一篇VSTO(C#)Excel開發5:調整表格到一頁-CSDN博客
? ? ? ? 本篇來研究一下與窗體交互,也就是與普通的C#窗體代碼協作。當我們能與普通的C#代碼協作我們就可以說可以把原來的程序和Excel整合在一起了。
目錄
一、創建一個窗體
二、修改功能區按鈕代碼來顯示窗體
三、效果
四、C#form窗體的基本操作
五、在窗體上顯示內容
一、創建一個窗體
? ? ? ? 項目上右鍵-添加-新建項:
? ? ? ? 選“窗體(Windows窗體)”,名稱可以改可以不改,無關緊要。?我用的名字是“FormFitToOnePage.cs”,生成的類就是FormFitToOnePage。
二、修改功能區按鈕代碼來顯示窗體
? ? ? ? 功能區按鈕我們已經很熟悉了,新建或者直接在原來的上面改都行。在功能區的代碼里添加如下代碼:
? ? ? ? 功能區的類名我改成了“RibbonFitToOnePage”。第一個紅框的代碼可以讓開發工具自動添加,第二個紅框是在類里面添加窗體變量,第三個紅框是在功能區加載時創建窗體對象,第四個紅框就是在點擊按鈕時把窗體顯示出來。
? ? ? ? 為了方便你驗證(Ctrl-C、Ctrl-V),上面幾句代碼如下:
using System.Windows.Forms;
using Microsoft.Office.Tools.Ribbon;namespace ctExcelTools
{public partial class RibbonFitToOnePage{private FormFitToOnePage formFitToOnePage;private void RibbonFitToOnePage_Load(object sender, RibbonUIEventArgs e){formFitToOnePage = new FormFitToOnePage();}private void button1_Click(object sender, RibbonControlEventArgs e){formFitToOnePage.TopMost = true;formFitToOnePage.Show();
三、效果
? ? ? ? 添這幾句代碼應該沒什么風險,編譯運行點擊按鈕:
? ? ? ? 窗體能夠顯示,窗體的內容我們后面再說。
? ? ? ? 任務欄上是這樣的:
? ? ? ? 也就是說通過功能區顯示的窗體和Excel是可以來回切換的。
四、C#form窗體的基本操作
? ? ? ? C#窗體比MFC方便,但也有些奇怪,form.Show()其實是無模式對話框,點右上角紅叉關閉的話對話框就沒有了,不能重復顯示,為此需要處理FormClosing事件,在事件里寫如下代碼:
private void FormFitToOnePage_FormClosing(object sender, FormClosingEventArgs e){e.Cancel = true;this.Hide();}
? ? ? ? ?先取消關閉事件,然后隱藏窗體,這樣就能在用Show來顯示了。但是第二次顯示的窗體不會顯示在頂層,因此需要在顯示之前設置為頂層:
formFitToOnePage.TopMost = true;formFitToOnePage.Show();
? ? ? ? 但是這樣一來永遠在頂層,會遮住我們要看的內容,所以又要在顯示之后取消頂層,這樣才能把窗口放到后面去,我在按鈕事件的最后取消了窗體的頂層顯示。
五、在窗體上顯示內容
? ? ? ? 窗體上增加一個文本框(這不是本主題的內容),因為我們的程序功能很簡單,所以把文本框對象改成public就可以在功能區代碼里直接使用了:
? ? ? ? 添了一個textbox,改了一下Anchor屬性,四邊綁定,也就是隨著窗體大小伸縮,設置為多行和只讀。
? ? ? ? 紅框那一句是窗體設計器添加的,但是是“private”,改成“public”就可以了。?
? ? ? ? 功能區按鈕的事件代碼如下:
private void button1_Click(object sender, RibbonControlEventArgs e){formFitToOnePage.TopMost = true;formFitToOnePage.Show();string str = "開始操作。。。。。。\r\n";try{Worksheet worksheet = Globals.ThisAddIn.Application.ActiveSheet;Range usedRange = worksheet.UsedRange;str += " UsedRange:" + usedRange.Address + "\r\n";str += " UsedRange.Column:" + usedRange.Column + "\r\n";str += " UsedRange.Columns.Count:" + usedRange.Columns.Count + "\r\n";str += " UsedRange.Row:" + usedRange.Row + "\n";str += " UsedRange.Rows.Count:" + usedRange.Rows.Count + "\r\n";str += " PrintArea:" + worksheet.PageSetup.PrintArea + "\r\n";str += " PaperSize:" + worksheet.PageSetup.PaperSize.ToString() + "\r\n";str += " ChartSize:" + worksheet.PageSetup.ChartSize + "\r\n";str += " Orientation:" + worksheet.PageSetup.Orientation.ToString() + "\r\n";str += " TopMargin:" + worksheet.PageSetup.TopMargin + "\r\n";str += " BottomMargin:" + worksheet.PageSetup.BottomMargin + "\r\n";str += " LeftMargin:" + worksheet.PageSetup.LeftMargin + "\r\n";str += " RightMargin:" + worksheet.PageSetup.RightMargin + "\r\n";str += " Pages:" + worksheet.PageSetup.Pages.Count + "\r\n";//worksheet.PageSetup.Zoom = false;//設置為false才能Fit//worksheet.PageSetup.FitToPagesWide = 1;double originalTotalWidth = 0;double originalTotalHeigh = 0;for (int i = 0; i < usedRange.Columns.Count; ++i){Range colum = worksheet.Columns[usedRange.Column + i];originalTotalWidth += colum.ColumnWidth;}for (int i = 0; i < usedRange.Rows.Count; ++i){Range row = worksheet.Rows[usedRange.Row + i];originalTotalHeigh += row.RowHeight;}str += " originalTotalWidth:" + originalTotalWidth + "\r\n";str += " originalTotalHeigh:" + originalTotalHeigh + "\r\n";str += "操作成功完成\n";}catch (Exception ex){formFitToOnePage.textBox_Info.Text += ex.ToString();}formFitToOnePage.textBox_Info.Text += str;formFitToOnePage.TopMost = false;}
? ? ? ? 就是把上一篇顯示的內容輸出到窗體的文本框里了。
? ? ? ? 現在可以切換窗口、關閉窗口、點擊按鈕重新顯示,注意,窗口的文本是追加,會越來越多,也能因此確認窗口只是隱藏了。
下一篇VSTO(C#)Excel開發7:自定義任務窗格-CSDN博客?
(這里是文檔結束)