연습: 런타임에 리본 메뉴의 컨트롤 업데이트
업데이트: 2007년 11월
적용 대상 |
---|
이 항목의 정보는 지정된 Visual Studio Tools for Office 프로젝트 및 Microsoft Office 버전에만 적용됩니다. 프로젝트 형식
Microsoft Office 버전
자세한 내용은 응용 프로그램 및 프로젝트 형식에 따라 사용 가능한 기능을 참조하십시오. |
이 연습에서는 Office 응용 프로그램에 리본 메뉴를 로드한 후 리본 개체 모델을 사용하여 리본 메뉴의 컨트롤을 업데이트하는 방법을 보여 줍니다.
예제에서는 AdventureWorks 샘플 데이터베이스의 데이터를 가져와 Microsoft Office Outlook의 콤보 상자와 메뉴를 채웁니다.
이 연습에서는 다음 작업을 수행합니다.
새 Outlook 추가 기능 프로젝트 만들기
사용자 지정 리본 그룹 디자인
기본 제공 탭에 사용자 지정 그룹 추가
런타임에 리본 메뉴의 컨트롤 업데이트
참고: |
---|
시스템에서 일부 Visual Studio 사용자 인터페이스 요소에 대해 다음 지침에서 설명한 것과 다른 이름 또는 위치를 표시할 수 있습니다. 설치한 Visual Studio 버전과 사용하는 설정에 따라 이러한 요소가 결정됩니다. 자세한 내용은 Visual Studio 설정을 참조하십시오. |
사전 요구 사항
이 연습을 완료하려면 다음 구성 요소가 필요합니다.
Visual Studio Tools for Office(Visual Studio 2008 Professional 및 Visual Studio Team System의 선택적 구성 요소)
Microsoft Office Outlook 2007
SQL Server Express용 AdventureWorks 샘플 데이터베이스에 대한 액세스 권한. AdventureWorks 데이터베이스를 설치하는 방법에 대한 자세한 내용은 연습: AdventureWorks 데이터베이스 설치를 참조하십시오.
Visual Studio Tools for Office는 기본적으로 나열된 Visual Studio 버전과 함께 설치됩니다. 설치 여부를 확인하려면 Visual Studio Tools for Office 설치를 참조하십시오.
새 Outlook 추가 기능 프로젝트 만들기
먼저 Outlook 추가 기능 프로젝트를 만듭니다.
새 Outlook 추가 기능 프로젝트를 만들려면
Visual Studio에서 MyOutlookAddIn이라는 Outlook 2007 추가 기능 프로젝트를 만듭니다.
새 프로젝트 대화 상자에서 솔루션용 디렉터리 만들기를 선택합니다.
프로젝트를 기본 프로젝트 디렉터리에 저장합니다.
자세한 내용은 방법: Visual Studio Tools for Office 프로젝트 만들기를 참조하십시오.
사용자 지정 리본 그룹 디자인
Outlook의 주 인터페이스 영역에는 리본 메뉴가 표시되지 않으므로 이 예제의 리본 메뉴는 사용자가 새 메일 메시지를 작성할 때 나타납니다. 리본 메뉴의 사용자 지정 그룹을 만들려면 먼저 프로젝트에 리본 항목을 추가한 다음 리본 디자이너에서 그룹을 디자인합니다. 이 사용자 지정 그룹을 사용하면 데이터베이스에서 이름 및 주문 기록을 가져와서 고객에게 보낼 후속 전자 메일 메시지를 손쉽게 생성할 수 있습니다.
사용자 지정 그룹을 디자인하려면
프로젝트 메뉴에서 새 항목 추가를 클릭합니다.
새 항목 추가 대화 상자에서 **리본(비주얼 디자이너)**을 선택합니다.
새 리본 메뉴의 이름을 CustomerRibbon으로 바꾸고 추가를 클릭합니다.
CustomerRibbon.cs 또는 CustomerRibbon.vb 파일이 리본 디자이너에서 열리고 기본 탭 및 그룹이 표시됩니다.
리본 디자이너를 클릭하여 선택합니다.
보기 메뉴에서 속성 창을 클릭합니다.
속성 창에서 RibbonType 속성 옆의 드롭다운 화살표를 클릭하고 Microsoft.Outlook.Mail.Compose를 클릭합니다.
이렇게 하면 사용자가 Outlook에서 새 메일 메시지를 작성할 때 리본 메뉴가 나타납니다.
리본 디자이너에서 Group1을 클릭하여 선택합니다.
속성 창에서 Label을 Customer Purchases로 설정합니다.
도구 상자의 Office 리본 컨트롤 탭에서 ComboBox를 Customer Purchases 그룹으로 끌어 옵니다.
ComboBox1을 클릭하여 선택합니다.
속성 창에서 Label을 Customers로 설정합니다.
도구 상자의 Office 리본 컨트롤 탭에서 Menu를 Customer Purchases 그룹으로 끌어 옵니다.
속성 창에서 Label을 Product Purchased로 설정합니다.
동적을 true로 설정합니다.
이렇게 하면 Office 응용 프로그램에 리본 메뉴를 로드한 후 런타임에 메뉴의 컨트롤을 추가 및 제거할 수 있습니다.
기본 제공 탭에 사용자 지정 그룹 추가
기본 제공 탭은 Outlook 검사기의 리본 메뉴에 이미 포함된 탭입니다. 이 프로시저에서는 기본 제공 탭에 사용자 지정 그룹을 추가한 다음 탭에서 사용자 지정 그룹이 표시되는 위치를 지정합니다.
기본 제공 탭에 사용자 지정 그룹을 추가하려면
TabAddins (기본 제공) 탭을 클릭하여 선택합니다.
속성 창에서 ControlId 속성을 확장한 다음 OfficeId를 TabNewMailMessage로 설정합니다.
이렇게 하면 새 메일 메시지에 나타나는 리본 메뉴의 메시지 탭에 Customer Purchases 그룹이 추가됩니다.
Customer Purchases 그룹을 클릭하여 선택합니다.
속성 창에서 Position 속성을 확장하고 PositionType 속성 옆의 드롭다운 화살표를 클릭한 다음 BeforeOfficeId를 클릭합니다.
OfficeId 속성을 GroupClipBoard로 설정합니다.
이렇게 하면 메시지 탭의 클립보드 그룹 앞에 Customer Purchases 그룹이 배치됩니다.
런타임에 사용자 지정 그룹의 컨트롤 업데이트
리본 개체 모델을 사용하여 다음 작업을 수행할 수 있습니다.
Customers 콤보 상자에 고객 이름을 추가합니다.
Products Purchased 메뉴에 판매 주문과 판매된 제품을 나타내는 메뉴 및 확인란 컨트롤을 추가합니다.
Customers 콤보 상자 및 Products Purchased 메뉴의 데이터를 사용하여 새 메일 메시지의 Microsoft.Office.Interop.Outlook.MailItem.To, Microsoft.Office.Interop.Outlook.MailItem.Subject 및 Microsoft.Office.Interop.Outlook.MailItem.Body 필드를 채웁니다.
리본 개체 모델을 사용하여 사용자 지정 그룹의 컨트롤을 업데이트하려면
프로젝트 메뉴에서 참조 추가를 클릭합니다.
참조 추가 대화 상자에서 .NET을 클릭하고 System.Data.Linq 어셈블리를 선택한 다음 확인을 클릭합니다.
이 어셈블리에는 LINQ(통합 언어 쿼리)를 사용하기 위한 클래스가 들어 있습니다. LINQ는 사용자 지정 그룹의 컨트롤을 AdventureWorks 데이터베이스의 데이터로 채우는 데 사용합니다. LINQ에 대한 자세한 내용은 LINQ(통합 언어 쿼리)를 참조하십시오.
솔루션 탐색기에서 CustomerRibbon.cs 또는 CustomerRibbon.vb를 클릭하여 선택합니다.
보기 메뉴에서 코드를 클릭합니다.
코드 편집기에서 리본 코드 파일이 열립니다.
리본 코드 파일의 맨 위에 다음 문을 추가합니다. 이러한 문은 LINQ 네임스페이스와 Outlook PIA(주 interop 어셈블리)의 네임스페이스에 쉽게 액세스할 수 있게 해 줍니다.
Imports Microsoft.Office.Tools.Ribbon Imports System.Data.Linq Imports System.Linq Imports System.Data.Linq.Mapping Imports System.Linq.Expressions Imports Outlook = Microsoft.Office.Interop.Outlook
using System.Data.Linq; using System.Linq; using System.Data.Linq.Mapping; using System.Linq.Expressions; using Outlook = Microsoft.Office.Interop.Outlook; using System.IO;
리본 코드 파일에 다음 클래스를 추가합니다. 이러한 클래스는 AdventureWorks 데이터베이스의 Customer, Contact, Sales Order Header, Sales Order Detail 및 Product 테이블에 있는 정보를 저장하는 데 사용합니다.
' Customer Table. <Table(Name:="Sales.Customer")> _ Public Class Customer <Column(IsPrimaryKey:=True)> _ Public CustomerID As Integer End Class ' Contact Table. <Table(Name:="Person.Contact")> _ Public Class Contact <Column(IsPrimaryKey:=True)> _ Public ContactID As Integer <Column()> _ Public LastName As String End Class ' Sales Order Header Table. <Table(Name:="Sales.SalesOrderHeader")> _ Public Class SalesOrderHeader <Column(IsPrimaryKey:=True)> _ Public SalesOrderID As Integer <Column()> _ Public SalesOrderNumber As String <Column()> _ Public CustomerID As Integer End Class ' Sales Order Detail Table. <Table(Name:="Sales.SalesOrderDetail")> _ Public Class SalesOrderDetail <Column(IsPrimaryKey:=True)> _ Public SalesOrderDetailID As Integer <Column()> _ Public SalesOrderID As Integer <Column()> _ Public ProductID As Integer End Class ' Product Table. <Table(Name:="Production.Product")> _ Public Class Product <Column(IsPrimaryKey:=True)> _ Public ProductID As Integer <Column()> _ Public Name As String End Class ' Data Context Class. Partial Public Class AdventureWorks Inherits DataContext Public Customer As Table(Of Customer) Public Contact As Table(Of Contact) Public SalesOrderHeader As Table(Of SalesOrderHeader) Public SalesOrderDetail As Table(Of SalesOrderDetail) Public Product As Table(Of Product) Public Sub New(ByVal connection As String) MyBase.New(connection) End Sub End Class
// Customer Table. [Table(Name = "Sales.Customer")] public class Customer { [Column(IsPrimaryKey = true)] public int CustomerID; } // Contact Table. [Table(Name = "Person.Contact")] public class Contact { [Column(IsPrimaryKey = true)] public int ContactID; [Column] public string LastName; } // Sales Order Header Table. [Table(Name = "Sales.SalesOrderHeader")] public class SalesOrderHeader { [Column(IsPrimaryKey = true)] public int SalesOrderID; [Column] public string SalesOrderNumber; [Column] public int CustomerID; } // Sales Order Detail Table. [Table(Name = "Sales.SalesOrderDetail")] public class SalesOrderDetail { [Column(IsPrimaryKey = true)] public int SalesOrderDetailID; [Column] public int SalesOrderID; [Column] public int ProductID; } // Product Table. [Table(Name = "Production.Product")] public class Product { [Column(IsPrimaryKey = true)] public int ProductID; [Column] public string Name; } // Data Context Table. public partial class AdventureWorks : DataContext { public Table<Customer> Customer; public Table<Contact> Contact; public Table<SalesOrderHeader> SalesOrderHeader; public Table<SalesOrderDetail> SalesOrderDetail; public Table<Product> Product; public AdventureWorks(string connection) : base(connection) { } }
CustomerRibbon_Load 이벤트 처리기 메서드를 다음 코드로 바꿉니다. 이 코드는 LINQ 쿼리를 사용하여 다음 작업을 수행합니다.
AdventureWorks 데이터베이스에 있는 20명의 고객 ID 및 이름을 사용하여 Customers 콤보 상자를 채웁니다.
PopulateSalesOrderInfo 도우미 메서드를 호출합니다. 이 메서드는 현재 선택된 고객과 관련된 판매 주문 번호로 Products Purchased 메뉴를 업데이트합니다.
Private Sub CustomerRibbon_Load(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonUIEventArgs) _ Handles MyBase.Load Dim programFilesDir As String = Environment.GetFolderPath _ (Environment.SpecialFolder.ProgramFiles) Dim db As New AdventureWorks(programFilesDir + _ "\Microsoft SQL Server\" + "MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf") Dim customerQuery = From customers In db.Customer.Take(20), contact In db.Contact _ Where customers.CustomerID = contact.ContactID _ Select CustomerID = customers.CustomerID, LastName = _ contact.LastName ' Execute the query. For Each item In customerQuery Me.ComboBox1.Items.Add(New RibbonDropDownItem()) Me.ComboBox1.Items.Last().Label = item.CustomerID.ToString() _ + "|" + item.LastName Next item Me.ComboBox1.Text = Me.ComboBox1.Items.First().Label PopulateSalesOrderInfo() End Sub
private void CustomerRibbon_Load(object sender, RibbonUIEventArgs e) { string programFilesDir = Environment.GetFolderPath (Environment.SpecialFolder.ProgramFiles); AdventureWorks db = new AdventureWorks (programFilesDir + "\\Microsoft SQL Server\\" + "MSSQL.1\\MSSQL\\Data\\AdventureWorks_Data.mdf"); var customerQuery = from customers in db.Customer.Take(20) join contacts in db.Contact on customers.CustomerID equals contacts.ContactID select new { customers.CustomerID, contacts.LastName }; // Execute the query. foreach (var item in customerQuery) { this.comboBox1.Items.Add(new RibbonDropDownItem()); this.comboBox1.Items.Last().Label = item.CustomerID.ToString() + "|" + item.LastName; } this.comboBox1.Text = this.comboBox1.Items.First().Label; PopulateSalesOrderInfo(); }
CustomerRibbon 클래스에 다음 코드를 추가합니다. 이 코드는 LINQ 쿼리를 사용하여 다음 작업을 수행합니다.
Products Purchased 메뉴에 선택된 고객과 관련된 각 판매 주문에 대한 하위 메뉴를 추가합니다.
각 하위 메뉴에 해당 판매 주문과 관련된 제품에 대한 확인란을 추가합니다.
각 확인란에 이벤트 처리기를 추가합니다.
Private Sub PopulateSalesOrderInfo() Dim tempArray As [String]() = comboBox1.Text.Split(New [Char]() {"|"c}) Menu1.Items.Clear() Dim programFilesDir As String = Environment.GetFolderPath _ (Environment.SpecialFolder.ProgramFiles) Dim db As New AdventureWorks(programFilesDir + _ "\Microsoft SQL Server\" + "MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf") Dim orderQuery = From orders In db.SalesOrderHeader _ Where orders.CustomerID.ToString() = tempArray(0) _ Select SalesOrderID = _ orders.SalesOrderID, SalesOrderNumber = _ orders.SalesOrderNumber For Each orderItem In orderQuery Dim Menu2 As New RibbonMenu() Menu2.Dynamic = True Menu1.Items.Add(Menu2) CType(Menu1.Items.Last(), RibbonMenu).Label = _ orderItem.SalesOrderNumber.ToString() CType(Menu1.Items.Last(), RibbonMenu).Tag = _ orderItem.SalesOrderID Dim productQuery = From orderDetail In db.SalesOrderDetail, _ product In db.Product _ Where orderDetail.ProductID = _ product.ProductID _ And orderDetail.SalesOrderID = _ orderItem.SalesOrderID _ Select productName = product.Name For Each productItem In productQuery CType(Menu1.Items.Last(), RibbonMenu).Items.Add _ (New RibbonCheckBox()) CType(CType(Menu1.Items.Last(), _ RibbonMenu).Items.Last(), RibbonCheckBox).Label = productItem AddHandler (CType(CType(Menu1.Items.Last(), _ RibbonMenu).Items.Last(), RibbonCheckBox).Click), AddressOf CheckBox_Click Next productItem Next orderItem End Sub
private void PopulateSalesOrderInfo() { String[] tempArray = comboBox1.Text.Split(new Char[] { '|' }); menu1.Items.Clear(); string programFilesDir = Environment.GetFolderPath (Environment.SpecialFolder.ProgramFiles); AdventureWorks db = new AdventureWorks (programFilesDir + "\\Microsoft SQL Server\\" + "MSSQL.1\\MSSQL\\Data\\AdventureWorks_Data.mdf"); var orderQuery = from orders in db.SalesOrderHeader where orders.CustomerID.ToString() == tempArray[0] select new { orders.SalesOrderID, orders.SalesOrderNumber }; foreach (var orderItem in orderQuery) { RibbonMenu menu2 = new RibbonMenu(); menu2.Dynamic = true; menu1.Items.Add(menu2); ((RibbonMenu)menu1.Items.Last()).Label = orderItem.SalesOrderNumber.ToString(); ((RibbonMenu)menu1.Items.Last()).Tag = orderItem.SalesOrderID; var productQuery = from orderDetail in db.SalesOrderDetail join product in db.Product on orderDetail.ProductID equals product.ProductID where orderDetail.SalesOrderID == orderItem.SalesOrderID select new { product.Name }; foreach (var productItem in productQuery) { ((RibbonMenu)menu1.Items.Last()).Items.Add (new RibbonCheckBox()); ((RibbonCheckBox)((RibbonMenu)menu1.Items.Last()). Items.Last()).Label = productItem.Name; ((RibbonCheckBox)((RibbonMenu)menu1.Items.Last()). Items.Last()).Click += new EventHandler<RibbonControlEventArgs>(checkBox_Click); } } }
솔루션 탐색기에서 리본 코드 파일을 두 번 클릭합니다.
리본 디자이너가 열립니다.
리본 디자이너에서 Customers 콤보 상자를 두 번 클릭합니다.
코드 편집기에서 리본 코드 파일이 열리고 ComboBox1_TextChanged 이벤트 처리기가 나타납니다.
ComboBox1_TextChanged 이벤트 처리기를 다음 코드로 바꿉니다. 이 코드는 다음 작업을 수행합니다.
PopulateSalesOrderInfo 도우미 메서드를 호출합니다. 이 메서드는 선택된 고객과 관련된 판매 주문으로 Products Purchased 메뉴를 업데이트합니다.
PopulateMailItem 도우미 메서드를 호출합니다. 이 메서드는 새 메일 메시지의 Microsoft.Office.Interop.Outlook.MailItem.To, Microsoft.Office.Interop.Outlook.MailItem.Subject 및 Microsoft.Office.Interop.Outlook.MailItem.Body 필드를 채웁니다.
Private Sub ComboBox1_TextChanged(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) _ Handles ComboBox1.TextChanged PopulateSalesOrderInfo() PopulateMailItem(ComboBox1.Text) End Sub
private void comboBox1_TextChanged(object sender, RibbonControlEventArgs e) { PopulateSalesOrderInfo(); PopulateMailItem(comboBox1.Text); }
CustomerRibbon 클래스에 다음 코드를 추가합니다. 이 코드는 새 메일 메시지의 Microsoft.Office.Interop.Outlook.MailItem.Body 필드에 선택된 제품의 이름을 추가합니다.
Private Sub CheckBox_Click(ByVal sender As System.Object, _ ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Dim application As Outlook.Application = Globals.ThisAddIn.Application Dim inspector As Outlook.Inspector = application.ActiveInspector() Dim myMailItem As Outlook.MailItem = CType(inspector.CurrentItem, _ Outlook.MailItem) Dim myCheckBox As RibbonCheckBox = CType(sender, RibbonCheckBox) myMailItem.Subject = "Following up on your order" myMailItem.Body = myMailItem.Body + ControlChars.Lf + "* " _ + myCheckBox.Label End Sub
private void checkBox_Click(object sender, RibbonControlEventArgs e) { Outlook.Application application = Globals.ThisAddIn.Application; Outlook.Inspector inspector = application.ActiveInspector(); Outlook.MailItem myMailItem = (Outlook.MailItem)inspector.CurrentItem; RibbonCheckBox myCheckBox = (RibbonCheckBox)sender; myMailItem.Subject = "Following up on your order"; myMailItem.Body = myMailItem.Body + "\n" + "* " + myCheckBox.Label; }
CustomerRibbon 클래스에 다음 코드를 추가합니다. 이 코드는 다음 작업을 수행합니다.
현재 선택된 고객의 전자 메일 주소를 사용하여 새 메일 메시지의 Microsoft.Office.Interop.Outlook.MailItem.To 줄을 채웁니다.
새 메일 메시지의 Microsoft.Office.Interop.Outlook.MailItem.Subject 및 Microsoft.Office.Interop.Outlook.MailItem.Body 필드에 텍스트를 추가합니다.
Private Sub PopulateMailItem(ByVal addressToLine As String) Dim application As Outlook.Application = Globals.ThisAddIn.Application Dim inspector As Outlook.Inspector = application.ActiveInspector() Dim myMailItem As Outlook.MailItem = _ CType(inspector.CurrentItem, Outlook.MailItem) myMailItem.To = "" Dim tempArray As [String]() = addressToLine.Split(New [Char]() {"|"c}) myMailItem.To = tempArray(1) + "@example.com" myMailItem.Subject = "Following up on your order" myMailItem.Body = "Hello " + tempArray(1) + "," myMailItem.Body = myMailItem.Body + ControlChars.Lf + _ "We would like to get your " + _ "feedback on the following products that you recently ordered: " End Sub
private void PopulateMailItem(string addressToLine) { Outlook.Application application = Globals.ThisAddIn.Application; Outlook.Inspector inspector = application.ActiveInspector(); Outlook.MailItem myMailItem = (Outlook.MailItem)inspector.CurrentItem; myMailItem.To = ""; String[] tempArray = addressToLine.Split(new Char[] { '|' }); myMailItem.To = tempArray[1] + "@example.com"; myMailItem.Subject = "Following up on your order"; myMailItem.Body = "Hello " + tempArray[1] + ","; myMailItem.Body = myMailItem.Body + "\n" + "We would like to get your " + "feedback on the following products that you recently ordered: "; }
사용자 지정 그룹의 컨트롤 테스트
Outlook에서 새 메일 양식을 열면 리본 메뉴의 메시지 탭에 Customer Purchases라는 사용자 지정 그룹이 나타납니다.
고객에 대한 후속 전자 메일 메시지를 만들려면 고객을 선택한 다음 해당 고객이 구입한 제품을 선택합니다. Customer Purchases 그룹의 컨트롤은 런타임에 AdventureWorks 데이터베이스의 데이터로 업데이트됩니다.
사용자 지정 그룹의 컨트롤을 테스트하려면
F5 키를 눌러 프로젝트를 실행합니다.
Outlook이 시작됩니다.
Outlook의 파일 메뉴에서 새로 만들기를 가리킨 다음 메일 메시지를 클릭합니다.
다음 동작이 발생합니다.
새 메일 메시지 검사기 창이 나타납니다.
리본 메뉴의 메시지 탭에서 클립보드 그룹 앞에 Customer Purchases 그룹이 나타납니다.
그룹의 Customers 콤보 상자가 AdventureWorks 데이터베이스에 있는 고객의 이름으로 업데이트됩니다.
리본 메뉴의 메시지 탭에 있는 Customer Purchases 그룹의 Customers 콤보 상자에서 고객을 선택합니다.
다음 동작이 발생합니다.
Products Purchased 메뉴가 해당 고객의 각 판매 주문을 나타내는 메뉴로 업데이트됩니다.
각 판매 주문 메뉴가 해당 고객이 구입한 제품을 나타내는 확인란으로 업데이트됩니다.
선택된 고객의 전자 메일 주소가 메일 메시지의 받는 사람 줄에 추가되고 메일 메시지의 제목 및 본문에 텍스트가 채워집니다.
Products Purchases 메뉴를 클릭하고 아무 판매 주문이나 가리킨 다음 판매 주문의 제품을 클릭합니다.
해당 제품 이름이 메일 메시지의 본문에 추가됩니다.
다음 단계
다음 항목에서는 Office UI를 사용자 지정하는 방법에 대해 더 자세히 설명합니다.
문서 수준 사용자 지정에 컨텍스트 기반 UI를 추가합니다. 자세한 내용은 작업 창 개요를 참조하십시오.
표준 또는 사용자 지정 Microsoft Office Outlook 양식을 확장합니다. 자세한 내용은 연습: Outlook 양식 영역 디자인을 참조하십시오.
Outlook에 사용자 지정 작업 창을 추가합니다. 자세한 내용은 사용자 지정 작업 창 개요를 참조하십시오.
참고 항목
작업
연습: 리본 디자이너를 사용하여 사용자 지정 탭 만들기
방법: Microsoft Office 메뉴 사용자 지정
방법: 리본 디자이너에서 리본 XML로 리본 메뉴 내보내기