Outlook 2007 におけるリボンのカスタマイズ
Randy Byrne
Microsoft Corporation
June 2006
日本語版最終更新日 2006 年 9 月 20 日
適用対象:
Microsoft Office Outlook 2007 (Beta 2)
要約: このドキュメントでは、Microsoft Office Outlook 2007 のリボン拡張機能 (RibbonX) について説明します。インスペクタ ウィンドウに表示される所定の Outlook アイテムの状態をカスタムのリボンに反映させるコードを記述することによって、Outlook 2007 においてリボンをカスタマイズする方法を示します。
Outlook2007RibbonXAddin.msi (英語) をダウンロードする。
目次
リボンのカスタマイズの概要
Outlook RibbonX Sample Add-In
インストールの手順
既存コードに発生する事項
RibbonX を使用するためのコードの変更
結論
その他の参考資料
リボンのカスタマイズの概要
Microsoft Office Word、Microsoft Office Excel、Microsoft Office PowerPoint など、排他的にリボンに依存する、2007 Microsoft Office システムの他のアプリケーションとは異なり、Microsoft Office Outlook 2007 では、リボンとコマンド バーの両方が使用されます。また、Outlook では、リボンのドキュメントレベルのカスタマイズはサポートされていません。リボンのカスタマイズは、Outlook のアドインで IRibbonExtensibility インターフェイスを実装することによってのみ実行できます。Outlook では、メイン アプリケーション ウィンドウに、以前のバージョンの Microsoft Office のユーザーには馴染みのあるコマンド バーが表示されます。オーサリングが主要なユーザー エクスペリエンスであるメール メッセージ ウィンドウなどのアイテム ウィンドウでは、新機能であるリボンが使用されます。エンド ユーザーが最適なオーサリング機能を利用できるように、Outlook のアイテム ウィンドウにはアイテム固有のリボンが表示されます。オブジェクト モデルとして考えた場合、Outlook のアイテム ウィンドウは、1 つの Inspector オブジェクトです。標準のまたはカスタムのアイテム タイプ用のコマンド バーのカスタマイズに Inspector.CommandBars プロパティから戻されるオブジェクトを使用する既存のコードがある場合、この記事では、RibbonX によって Outlook インスペクタ用のコマンド バーの既存のカスタマイズ機能が強化されるしくみを説明します。
メイン アプリケーション ウィンドウ (Explorer オブジェクト) では、以前のバージョンの Office で導入されたコマンド バーが引き続き使用されます。Outlook エクスプローラの場合、Outlook のアプリケーション ウィンドウのカスタマイズには、引き続き Explorer.CommandBars プロパティから戻されるオブジェクトを使用します。この記事では、読者は Office の CommandBars オブジェクト モデルのコード記述方法に精通していると仮定されているため、CommandBars オブジェクト モデルについては詳細には説明しません。
MSDN に、リボン拡張機能について詳細に説明しているブログおよび技術に関する記事があります。リボンの全容の包括的な説明については、「Jensen Harris : Office ユーザー インターフェイスのブログ」(英語) を参照してください。タブ、グループ、およびコントロールのリボン拡張機能に関する開発者向け情報については、Frank Rice による「<開発者向け> Office (2007) リボン ユーザー インターフェイスのカスタマイズ (1/2)」および「<開発者向け> Office (2007) リボン ユーザー インターフェイスのカスタマイズ (2/2)」を参照してください。リボン用 XML スキーマおよびコールバックのシグネチャの包括的な一覧については MSDN で参照可能なためここでは説明しません。このため、上記の参考資料を読むことを強くお勧めします。この記事では、Outlook におけるリボンの実装について知っておく必要のある事項に焦点を絞って説明します。
Outlook RibbonX Sample Add-In
Outlook RibbonX Sample Add-In は、ラーニング ツールの 1 つで、アイテムレベルの Outlook リボンの、アドインを使用したカスタマイズ方法を理解する上で役立ちます。Outlook RibbonX Sample Add-In は、次の新しい重要な領域を扱っています。
- IRibbonExtensibility.GetCustomUI メソッドで渡される <リボン ID> パラメータに基づいて、特定のアイテムに対してリボン用 XML を使用します。
- リボンのコールバックで渡される IRibbonControl.Context オブジェクトの使用方法を理解します。IRibbonControl.Context は、次に Outlook に表示される Inspector オブジェクトを表します。
- OutlookInspector クラスを使用して、複数のインスペクタ ウィンドウの状態を確認します。また、インスペクタ ウィンドウに表示される所定のアイテムでのプロパティ変更イベントを確認します。
- アイテムで状態の変更があった後、IRibbonUI.InvalidateControl メソッドを呼び出して、リボンを無効にし、コールバックを再度起動します。
この記事に含まれるサンプル コードでは、Microsoft Visual C# および Microsoft Visual Basic の両方を使用します。コードの使用例では、任意のエディションの Microsoft Visual Studio 2005 および Microsoft Office Outlook 2007 Beta 2 以降が必要です。この記事のサンプル コードは、Outlook RibbonX Sample Add-In で、Visual Basic .NET および Visual C# の両方のバージョンで使用できます。この記事で示すインライン コード スニペットは、Outlook 2007 におけるリボンのカスタマイズ方法の理解に役立ちます。
インストールの手順
Outlook RibbonX Sample Add-In をインストールするには
- ダウンロード パッケージのコンテンツを抽出したフォルダに進みます。
サンプル ソリューションは、それぞれ .zip ファイルに含まれています。サンプル ソリューション名のサフィックスにより、サンプルで使用される言語を識別できます。Visual Basic .NET のサンプルのサフィックスは VB で、Visual C# のサンプルのサフィックスは CS です。たとえば、OutlookRibbonXVB には、Visual Basic .NET バージョン、および OutlookRibbonXCS には、C# バージョンのサンプルの Outlook RibbonX Sample Add-In が含まれます。 - ソリューションの .zip ファイルに含まれるすべてのファイルを次のフォルダに抽出します。
My Documents\Visual Studio 2005\Projects
注: Visual C# Express Edition または Visual Basic Express Edition を使用してサンプル アドインを開く場合は、セットアップ/配置プロジェクトを構築したり、サンプル アドインをインストールしたりできません。
このサンプルの実行方法は、次のとおりです。
- Outlook 2007 を閉じます。
- My Documents\Visual Studio 2005\Project\<ソリューション名> フォルダで、<ソリューション名> ソリューションを開きます。
- ソリューション エクスプローラで、<アドイン名> Setup を選択します。
- [ビルド] メニューの [<アドイン名> Setup のビルド] をクリックします。
- ビルド プロセスが完了したら、[プロジェクト] メニューの [インストール] をクリックして、ソリューションをインストールします。
- Outlook を起動してアドインを "実行" モードで起動するか、F5 キーを押してアドインを "デバッグ" モードで起動します。
Outlook が "デバッグ" モードで起動しない場合は、次の手順を実行します。
- ソリューション エクスプローラで、<アドイン名> を選択します。
- [プロジェクト] メニューをクリックし、[<アドイン名> のプロパティ] をクリックしてから、[デバッグ] タブをクリックします。
- [開始動作] の [外部プログラムの開始] オプションをオンにして、[参照 (...)] をクリックします。
- <ドライブ>:\Program Files\Microsoft Office\Office12 フォルダで、Outlook.exe を選択します。
既存コードに発生する事項
既にコードを記述して、任意の Outlook アドインまたは Outlook 97 のインスペクタのコマンド バーを Outlook 2003 のカスタム フォームにカスタマイズした場合は、Outlook 2007 におけるそのコードの動作を理解する必要があります。既存のコードは引き続き機能します。ただし、インスペクタのコマンド バーのコードによって、リボンの [アドイン] タブにコマンド バーのカスタマイズ項目が追加されます。開発者によっては、これを受け入れる場合と、[アドイン] タブの機能がコマンドのユーザー インターフェイス (UI) にとって最適ではないと判断する場合があります。最適ではないと判断した場合、リボン拡張機能を使用するようにコードを更新することを検討する必要があります。
次の表に、Outlook 2007 におけるコマンド バーのカスタマイズ項目の動作を示します。
表 1. Outlook 2007 におけるコマンド バーのカスタマイズ項目
| エントリ ポイント | Outlook 2007 の動作 |
|---|---|
| Explorer.CommandBars | Outlook 2007 ではエクスプローラ ウィンドウでコマンド バーが使用されるため、既存のコードは、引き続き機能します。 |
| 組み込みメニューにカスタムの CommandBarControls を追加する Inspector.CommandBars | 既存のコードは引き続き機能しますが、[アドイン] タブの [メニュー コマンド] グループにカスタマイズ項目が表示されます。組み込みメニューをカスタマイズする、すべてのアドインのメニューのカスタマイズ項目が、[メニュー コマンド] グループに共に表示されます。 |
| 組み込みツール バーにカスタムの CommandBarControls を追加する Inspector.CommandBars | 既存のコードは引き続き機能しますが、[アドイン] タブの [ツール バー コマンド] グループにカスタマイズ項目が表示されます。組み込みツール バーをカスタマイズする、すべてのアドインのツール バーのカスタマイズ項目が、[ツール バー コマンド] グループに共に表示されます。 |
| カスタムのツール バーを追加する Inspector.CommandBars | 既存のコードは引き続き機能しますが、[アドイン] タブの [ユーザー設定のツール バー] グループにカスタマイズ項目が表示されます。すべてのアドインのカスタム ツール バーが [ユーザー設定のツール バー] グループに共に表示されます。 |
| Outlook 2000 の WordMail のカスタムのツール バーとコントロールを Outlook 2003 に追加する Word.CommandBars | 既存のコードは機能しなくなります。Outlook 2007 では WordMail は Word ではなく Outlook の下で動作するため、normal.dot または email.dot に保存されている Word のマクロは実行されなくなります。Outlook 2007 以前のバージョンでは、Word のマクロを実行して、カスタムのツール バーとコントロールを Word から追加していました。既存のコードを Outlook 2007 用に更新する必要があります。WordMail マクロの広範なライブラリがある場合は、既存のコードを Outlook のアドインで使用することを考慮してください。Inspector.WordEditor オブジェクトを使用して、現在のインスペクタに表示される Word Document オブジェクトを戻します。WordMail は、Outlook に統合されるため、予定、連絡先、仕事などのすべてのアイテム タイプで、Word の優れた編集環境がサポートされます。 |
インスペクタのコマンド バー
Outlook RibbonX Sample Add-In におけるインスペクタのコマンド バーのカスタマイズ例を示します。RibbonX Sample Add-In によって、Outlook の連絡先アイテムに [Color Widget] カスタム コマンド バーが追加されますが、これは連絡先にメーリング アドレスがある場合のみです。図 1 は、Outlook の連絡先インスペクタの [アドイン] タブの [Color] カスタムツール バーを示しています。[Color Widget] カスタム コマンド バーの名前は、[ユーザー設定のツール バー] グループには表示されないことに注意してください。
図 1. [アドイン] タブの [ユーザー設定のツール バー] グループに表示される [Color] カスタム ツール バー (クリックするとイメージが拡大されます)
紙面の関係上、カスタムの [Color Widget] ツール バーを作成するためのサンプル コードについては説明しません。Outlook RibbonX Sample Add-In の OutlookInspector クラスの CreateColorWidgets プロシージャおよび RemoveColorWidgets プロシージャについて説明します。カスタムの [Color Widgets] ツール バーは、次の表に示したイベントを使用して作成されます。
表 2. カスタムの [Color Widgets] ツール バーのイベント
| イベント | 説明 |
|---|---|
| Connect の Inspectors_NewInspector | m_Windows で Inspector が見つからない場合に、OutlookInspector の新しいインスタンスを作成し、そのインスタンスを m_Windows に追加します。 |
| OutlookInspector の ContactItem_Open | CreateColorWidgets プロシージャを使用してこのカスタム ツール バーを追加します。ContactItem に BusinessAddress、HomeAddress、または OtherAddress がある場合は、このカスタム ツール バーを表示状態にします。 |
| OutlookInspector の ContactItem_Close | RemoveColorWidgets プロシージャを使用してこのカスタム ツール バーを削除します。 |
返信オプション
Outlook 2007 では、メッセージの返信オプションが引き続きサポートされます。返信オプションは、メッセージの受信者に対する選択肢のリストの表示、および受信者の返信の確認に使用します。MailItem の VotingOptions プロパティの値のセミコロンで区切られたリストを設定することによって返信オプションをプログラムから作成する場合、これらの返信オプションは、Outlook の "開封" メモのリボンの [Respond] グループの [Vote] メニューに表示されます。開封メモは、受信者が受信した電子メール メッセージです。たとえば、次のコードによって、"作成" メモに返信オプションが作成されます。
C# の場合 :
private void OrderPizza_Click(object sender, EventArgs e)
{
Outlook.Application outlookApplication = new Outlook.Application();
Outlook.MailItem mail = (
Outlook.MailItem)outlookApplication.CreateItem(
Outlook.OlItemType.olMailItem);
mail.VotingOptions = "Cheese; Mushroom; Sausage; Combo; Veg Combo";
mail.Subject="Pizza Order";
mail.Display(false);
}
図 2 に示すように、ユーザーがこのピザ注文のメッセージをチームのメンバに送信すると、返信オプションが受信者に対して表示されます。元のピザ注文の送信者が返信を受信したときに、送信者の送信済みアイテム フォルダのメッセージの [確認] ページで受信者の選択が反映されます。
図 2. 受信したメッセージの [Respond] グループに表示される [Voting Options] メニュー
カスタムのアクション
カスタムのアクションもプログラムから作成することができ、[メッセージ] タブの [アクション] グループのリボンに表示されます。カスタムのアクションを、Outlook Forms Designer を使用してデザイン時に追加したり、フォーム領域マークアップに指定したり、Actions コレクション オブジェクトの Add メソッドを呼び出すことによってプログラムから作成したりできます。次のコードによって、[Reply with Voice Mail] というカスタムのアクションが、図 3 に示しているアクティブなインスペクタに追加されます。
C# の場合 :
private void ReplyWithVoiceMail_Click(object sender, EventArgs e)
{
Outlook.Application outlookApplication = new Outlook.Application();
Outlook.MailItem mail = (
Outlook.MailItem)outlookApplication.ActiveInspector().CurrentItem;
Outlook.Action action = mail.Actions.Add();
action.Name = "Reply with Voice Mail";
action.ReplyStyle = Outlook.OlActionReplyStyle.olUserPreference;
action.ResponseStyle = Outlook.OlActionResponseStyle.olOpen;
action.CopyLike = Outlook.OlActionCopyLike.olReply;
action.MessageClass = "IPM.Post.Voice Message";
mail.Save()
}
図 3. [アクション] グループに表示されるカスタムの [アクション] メニュー
RibbonX を使用するためのコードの変更
Outlook 2007 のリボンのカスタマイズでは、リボン拡張機能 (RibbonX) のアドイン モデルが使用されます。Outlook では、Word、Excel、または PowerPoint と同様のリボンのドキュメントレベルのカスタマイズはサポートされていません。ここでまず生じる疑問として、RibbonX を使用するように既存のコードを変更する必要があるかどうかということが挙げられます。既存のコードによって、インスペクタのコマンド バーにカスタムのコマンドを追加している場合は、RibbonX 用にコードを作り直すことを検討する必要があります。コードを変更せずにインスペクタのコマンド バーを変更すると、インスペクタ ウィンドウの [アドイン] タブのグローバル グループにカスタマイズ項目が表示されます。
これらのグループではコマンドのソースは識別されないため、ユーザーが混乱することになります。ユーザーへの影響のほか、Office コマンド バーのオブジェクト モデルと比較してリボンではより広範なコントロールを使用します。開発者は、リボン用のマークアップを記述することによって、ボタン、トグル ボタン、チェック ボックス、コンボ ボックス、ドロップ ダウン、またはギャラリーのコントロールを実装できます。リボンのコントロール パレットを使用するように既存のコードを更新することの検討を強くお勧めします。Outlook 2007 のみで実行するソリューションをデザインしている場合は、決断することは 1 つです。リボンを実装して、RibbonX の優れたプログラミング モデルを利用してください。
ここでは、サンプルの Outlook RibbonX アドインを使用して Outlook の連絡先アイテムのリボンをカスタマイズする方法を説明します。図 4 は、リボンのグループに変換された [Color Widgets] ツール バーを示しています。[アドイン] タブのコマンド バーのカスタマイズ項目の動作とは異なり、コントロールの上にポインタを移動すると、リボンにコントロールを追加したアドインが、ポップアップ ウィンドウによって識別されます。この場合、[Color Widgets] グループは、リボンのファーストクラス メンバとして参加します。次に、カラー ウィジェットの実装に必要なマークアップについて説明します。
図 4. 連絡先インスペクタ リボンの [Color Widgets] グループ (クリックするとイメージが拡大されます)
リボン用 XML の作成
リボンのカスタマイズの最初の手順では、カスタマイズにタブ、グループ、およびコントロールを指定する宣言型 XML マークアップを記述します。Outlook RibbonX Sample Add-In の場合、リボン用 XML はアドイン プロジェクトのリソースに含まれています。カラー ウィジェットは単純な例であるため、マークアップも単純です。次に、サンプルの customUI.xml リソースを示します。
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
onLoad="Ribbon_OnLoad">
<ribbon>
<tabs>
<tab idMso="TabContact">
<group id="ColorWidgetsGroup"
getVisible="ColorWidgetsGroup_GetVisible"
getLabel="ColorWidgetsGroup_GetLabel">
<button
id="ColorButton"
getLabel = "ColorButton_GetLabel"
getSupertip="ColorButton_GetSupertip"
onAction ="ColorButton_Action"
imageMso="MoreColors"
/>
<comboBox
id="ColorCombo"
onChange ="ColorCombo_OnChange"
getText="ColorCombo_GetText"
getItemCount ="ColorCombo_GetItemCount"
getItemLabel ="ColorCombo_GetItemLabel"
/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
このリボン用マークアップによって、[Color Widgets] グループに、ボタンとコンボ ボックスという 2 つのコントロールが指定されます。[Color Widgets] グループが [連絡先] タブに表示されます。このことは、TabContact の idMso 属性によって指定されます。このマークアップによって、連絡先アイテムを開いたときに実行される複数のコールバックが指定されます。これらのコールバックは、アクションの実行、コントロールのテキストの指定、イメージの指定、または [Color Widgets] グループの表示の制御に使用されます。サンプル コードをわかりやすくするために、このマークアップでは、[Color] ボタンの GetImage コールバックを使用してイメージを動的に読み込むのではなく、imageMso によって指定した組み込みのイメージを使用します。
上記の RibbonX に関する記事で、リボン用 XML のスキーマについて説明されているため、ここではリボン用 XML の作成について詳細には説明しません。Outlook のすべてのリボンの、組み込みコントロールのコントロール ID に関する詳細については、「2007 Office System のドキュメント : コントロール ID の一覧」(英語) を参照してください。Outlook のリボン用 XML の作成において重要なことは、アイテム タイプごとに個別の XML マークアップが必要な場合があるということです。たとえば、予定アイテムと連絡先アイテムをカスタマイズする必要がある場合、アドイン リソースに 2 つのマークアップ ドキュメントを追加することを検討する必要があります。これについては、IRibbonExtensibility.GetCustomUI プロシージャにリボン用マークアップを読み込む方法を示すときにさらに説明します。
IRibbonExtensibility インターフェイス
リボンをカスタマイズする Outlook アドインでは、次の 2 つのインターフェイスを実装する必要があります。
- Extensibility.IDTExtensibility2
- Office.IRibbonExtensibility
Visual C# アドインおよび Visual Basic .NET アドインでは、これらのインターフェイスを同一クラスに実装する必要があります。Outlook RibbonX Sample Add-In では、これらのインターフェイスは Connect クラスに実装されます。IRibbonExtensibility を実装した後で、IRibbonExtensibility.GetCustomUI プロシージャでリボン用マークアップを戻すためのコードを記述します。GetCustomUI のサンプル コードを確認する前に、Outlook 2007 で GetCustomUI が実際に呼び出されるしくみを理解しておく必要があります。次に示すように、GetCustomUI の動作は Outlook に固有です。
- GetCustomUI は、ユーザーまたはプログラム上のアクションによって Outlook インスペクタが開くまで呼び出されません。
- 閲覧ウィンドウでアイテムを選択することによって GetCustomUI が呼び出されることはありません。アイテムを Outlook インスペクタで開く必要があります。
- GetCustomUI は、リボンが所定の <リボン ID> に対して初めて読み込まれたときに、一度のみ呼び出されます。
- <リボン ID> は、インスペクタのタイプを識別する一意の文字列です。<リボン ID> は、アイテムのメッセージ クラスに関連付けられます。ただし、同じメッセージ クラスに複数の <リボン ID> を関連付けることができます。
- MailItem や PostItem の場合など、最初の作成メモが表示されたとき (<リボン ID> は "Microsoft.Outlook.Mail.Compose") と最初の開封メモが表示されたとき (<リボン ID> は "Microsoft.Outlook.Mail.Read") に、それぞれ 1 回ずつ GetCustomUI が呼び出されることもあります。
Outlook で使用される一意のリボン ID を次の表に示します。
表 3. Outlook で使用される一意のリボン ID
| リボン ID | メッセージ クラス |
|---|---|
| Microsoft.Outlook.Mail.Read | IPM.Note.* |
| Microsoft.Outlook.Mail.Compose | IPM.Note.* |
| Microsoft.Outlook.MeetingRequest.Read | IPM.Schedule.Meeting.Request または IPM.Schedule.Meeting.Canceled |
| Microsoft.Outlook.MeetingRequest.Send | IPM.Schedule.Meeting.Request |
| Microsoft.Outlook.Appointment | IPM.Appointment.* |
| Microsoft.Outlook.Contact | IPM.Contact.* |
| Microsoft.Outlook.Journal | IPM.Activity.* |
| Microsoft.Outlook.Task | IPM.Task.* および IPM.TaskRequest.* |
| Microsoft.Outlook.DistributionList | IPM.DistList.* |
| Microsoft.Outlook.Report | IPM.Report.* |
| Microsoft.Outlook.Resend | IPM.Resend.* |
| Microsoft.Outlook.Response.Read | IPM.Schedule.Meeting.Resp.* |
| Microsoft.Outlook.Response.Compose | IPM.Schedule.Meeting.Resp.* |
| Microsoft.Outlook.Response.CounterPropose | IPM.Schedule.Meeting.Resp.* |
| Microsoft.Outlook.RSS | IPM.Post.Rss |
| Microsoft.Outlook.Post.Read | IPM.Post.* |
| Microsoft.Outlook.Post.Compose | IPM.Post.* |
| Microsoft.Outlook.Sharing.Read | IPM.Sharing.* |
| Microsoft.Outlook.Sharing.Compose | IPM.Sharing.* |
注: 付箋ではリボンが実装されることはないため、IPM.StickyNote は、リボン ID とメッセージ クラスの表に含まれていません。
表ではほとんどの場合に、メッセージ クラスは IPM.Type.* と表されています。この注釈は、ベースのメッセージ クラス (たとえば、IPM.Contact) の最初のインスタンス、またはインスペクタに表示されるカスタムのメッセージ クラス (IPM.Contact.<カスタム名>) によって GetCustomUI の呼び出しが発生することを意味します。カスタムのメッセージ クラスのインスペクタのリボンをカスタマイズするだけの場合は、次の操作を行います。
- IPM.Contact.<カスタム名> などのカスタム メッセージ クラスのインスペクタ タイプを表すリボン ID の GetCustomUI でリボン用 XML を戻す必要があります。
- GetVisible コールバックを使用して、リボンのカスタムのタブ、グループ、およびコントロールの表示を制御する必要があります。このコールバックで渡される IRibbonControl.Context オブジェクトは、Outlook の Inspector オブジェクトを表します。コールバックで Inspector オブジェクトが渡されたら、Inspector.CurrentItem.MessageClass を使用して、GetVisible コールバックで true と false のいずれを戻すかを指定します。
すべてのまたは複数の Outlook メッセージ クラスでリボンをカスタマイズする必要がある場合は、別の一連の推奨事項が当てはまります。
- すべての Outlook インスペクタで当初の組み込みタブをカスタマイズする場合は、当初の組み込みタブの名前が、すべてのリボン ID にわたって同一ではないため、リボン ID ごとに個別のリボン用 XML を作成する必要があります。
- 複数の Outlook インスペクタでリボンをカスタマイズする場合は、タブ名に応じたリボン ID ごとの個別のリボン用 XML の作成が必要なことがあります。
この記事に付属するサンプル アドインの GetCustomUI について説明します。customUI は、アドイン プロジェクトにリソースとして保存されます。複数の RibbonID にリボン用マークアップを指定する必要がある場合は、リソースに適切に名前を付けて、GetCustomUI プロシージャで正しいリソースを戻す必要があります。次の例では、カラー ウィジェットのリボン用マークアップが戻されます。
Visual Bsic の場合 :
Function GetCustomUI(ByVal RibbonID As String) As String _ Implements Microsoft.Office.Core.IRibbonExtensibility.GetCustomUI Select Case RibbonID Case "Microsoft.Outlook.Contact" ' リソースとして保存される RibbonX マークアップを戻します。 Return My.Resources.customUI End Select Return String.Empty End Function
C# の場合 :
public string GetCustomUI(string ribbonID)
{
switch (ribbonID)
{
case "Microsoft.Outlook.Contact":
//リソースとして保存される RibbonX マークアップを戻します。
string xmlMarkup = Properties.Resources.customUI;
return xmlMarkup;
default:
return String.Empty;
}
}
エラーの検出
GetCustomUI の呼び出しで戻すリボン用マークアップには通常、インスペクタが表示される直前に実行されるコールバックが含まれます。リボン用マークアップの各コールバックについて、IRibbonExtensibility インターフェイスを実装するアドイン クラスにコールバックを追加する必要があります。これらのコールバックをパブリック プロシージャとして宣言する必要があります。なんらかの理由により、コールバックを使用しない、または正しくないコールバック シグネチャを使用した場合は、ソリューションをデバッグするときにエラーの検出をオンにしない限り、リボンのカスタマイズはサイレントで失敗します。
リボン用マークアップの読み込み時にエラー検出をオンにするには、次の手順に従って、図 5 に示している [詳細オプション] ダイアログ ボックスを表示する必要があります。
- Outlook エクスプローラ ウィンドウで [ツール] メニューをクリックし、[オプション] をクリックしてから、[その他] タブをクリックします。
- [詳細オプション] ボタンをクリックして、[すべての Office アプリケーションに対する設定] フレームの [アドイン ユーザー インターフェイスのエラーを表示する] をオンにします。
- [OK] をクリックして変更を保存します。
図 5. [詳細オプション] ダイアログ ボックスを使用した、リボン用マークアップのエラーの報告
注: [アドイン ユーザー インターフェイスのエラーを表示する] チェック ボックスをオンにすると、すべての Office アプリケーションについてのエラー報告がオンになります。
NewInspector イベント
GetCustomUI が呼び出されて、リボン用マークアップが戻されると、アドインでは、インスペクタ ウィンドウの状態をコードで確認できるように NewInspector イベントに接続する必要があります。サンプル アドインには、状態の確認の簡単な例が含まれています。[Color Widgets] グループには、ユーザーが色として [赤]、[緑]、または [青] を選択できるコンボ ボックス コントロールが含まれます。ユーザーが [Color] ボタン コントロールをクリックすると、メッセージ ボックスに現在選択されている色が表示されます。この例は非常に単純ですが、Outlook インスペクタでのリボンのコントロールの実装で生じる一般的な問題を示しています。Outlook では、複数のインスペクタを表示でき、ユーザーはこれらのウィンドウ間でコンテキストを切り替えることができます。たとえば、インスペクタ 1 では選択されている色が緑で、インスペクタ 2 では選択されている色が赤と仮定します。サンプル コードでは、NewInspector イベントを OutlookInspector というラッパー クラスと共に使用して、所定のインスペクタで選択されている色を判別できます。NewInspector イベントにコードを記述する方法を説明した後、OutlookInspector ラッパー クラスについて説明します。
Visual Basic のサンプル アドインでは、InitializeAddin プロシージャによって、WithEvents キーワードを使用して宣言された m_Inspectors オブジェクトがインスタンス化されます。Visual C# のサンプル アドインでは、m_Inspectors オブジェクトの NewInspector イベントに接続します。次に、IDTExtensibility2_OnConnection イベントから呼び出される InitializeAddin プロシージャを示します。
Visual Bsic の場合 :
Private Sub InitializeAddin() m_Inspectors = Application.Inspectors m_Windows = New Dictionary(Of IntPtr, OutlookInspector) End Sub
C# の場合 :
private void InitializeAddin()
{
// 変数を初期化します。
m_Inspectors = Application.Inspectors;
m_Windows = new Dictionary<IntPtr, OutlookInspector>();
// イベント ハンドラに接続します。
m_Inspectors.NewInspector +=
new Outlook.InspectorsEvents_NewInspectorEventHandler(
Inspectors_NewInspector);
}
InitializeAddin の NewInspector イベント ハンドラに接続するほか、OutlookInspector オブジェクトの汎用ディクショナリとして機能する m_Windows というインスタンス変数が作成されます。Dictionary クラスは、キーと値のコレクションを表します。この場合、m_Windows インスタンス変数のキーは IntPtr 構造であり、インスペクタ ウィンドウのウィンドウ ハンドルを表します。
次に、NewInspector イベント プロシージャについて説明します。ここでは、連絡先アイテムのインスペクタのみを扱っているため、コードではまず、Inspector.CurrentItem.Class が olContact と等しいかどうかが評価されます。連絡先アイテムがある場合は、FindOutlookInspector によって、m_Windows ディクショナリで所定のインスペクタ ウィンドウが検索されます。existingWindow が NULL の場合は、インスペクタに OutlookInspector の新しいインスタンスが作成され、このクラス インスタンスが m_Windows に追加されます。
注: Microsoft Office Outlook 2007 Beta 2 には不具合があるため、コードでは、インスペクタを識別する一意のキーのウィンドウ ハンドルが使用されます。リリースされるバージョンの Outlook 2007 では、GetWindowHandle プロシージャから IntPtr を戻さずにインスペクタを識別する機能が提供されます。
Visual Bsic の場合 :
Private Sub Inspectors_NewInspector(ByVal Inspector _ As Microsoft.Office.Interop.Outlook.Inspector) _ Handles m_Inspectors.NewInspector Dim olItem As New OutlookItem(Inspector.CurrentItem) ' これが連絡先アイテムであることを確認します。 If olItem.Class = Outlook.OlObjectClass.olContact Then ' これが、まだ確認していない新しいウィンドウかどうかチェックします。 Dim existingWindow As OutlookInspector = _ FindOutlookInspector(Inspector) If existingWindow Is Nothing Then Dim window As OutlookInspector = New OutlookInspector(Inspector) Listen to window.Close event AddHandler window.Close, AddressOf WrappedWindow_Close ' window.InvalidateControl イベントをリッスンします。 AddHandler window.InvalidateControl, _ AddressOf WrappedWindow_InvalidateControl Dim newWindowHandle As IntPtr = GetWindowHandle(Inspector) m_Windows.Add(newWindowHandle, window) End If End If End Sub
C# の場合 :
private void Inspectors_NewInspector(Outlook.Inspector Inspector)
{
try
{
OutlookItem olItem = new OutlookItem(Inspector.CurrentItem);
// これが連絡先アイテムであることを確認します。
if (olItem.Class == Outlook.OlObjectClass.olContact)
{
// これが、まだ確認していない新しいウィンドウかどうか
// チェックします。
OutlookInspector existingWindow =
FindOutlookInspector(Inspector);
if (existingWindow == null)
{
OutlookInspector window = new OutlookInspector(Inspector);
// window.Close イベントをリッスンします。
window.Close += new EventHandler(WrappedWindow_Close);
// window.InvalidateControl イベントをリッスンします。
window.InvalidateControl += new EventHandler<
OutlookInspector.InvalidateEventArgs>(
WrappedWindow_InvalidateControl);
IntPtr newWindowHandle = GetWindowHandle(Inspector);
m_Windows.Add(newWindowHandle, window);
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
OutlookInspector クラス
OutlookInspector クラスでは Inspector オブジェクトがラップされます。このクラスの各インスタンスを使用することによって、所定のインスペクタ ウィンドウの状態を確認できます。OutlookInspector クラスでは、次の機能が提供されます。
- Inspector オブジェクトの各インスタンスをラップします。
- ラップされた Inspector の CurrentItem (ここでは ContactItem) の Open イベント、Close イベント、および PropertyChange イベントを指定します。
- Connect クラスのコールバックで RibbonColor などのプロパティを設定または取得できるようにプロパティを公開します。
Outlook RibbonX Sample Add-In のビジネス ロジックについてもう少し説明します。[Color Widgets] グループの表示は、インスペクタに表示される ContactItem にメーリング アドレスが存在するかどうかによります。所定の連絡先に、会社、自宅、またはその他の住所がある場合、[Color Widgets] グループはリボンに表示されます。所定の連絡先に、会社、自宅、またはその他の住所がない場合、[Color Widgets] グループはリボンに表示されません。連絡先の状態が変更された場合 (たとえば、ユーザーが新しい連絡先に会社住所を追加した場合) PropertyChange イベントによって変更が検出され、リボン上のコントロールが無効になります。リボン上のコントロールが無効になったら、そのコントロールのコールバックが再度呼び出されます。
IRibbonUI オブジェクト
IRibbonUI オブジェクトは、アドインで定義されているリボンのコントロールすべてを表します。開発者は、リボン用マークアップにコールバックを指定します (「Authoring Custom XML」の タグの例を参照してください)。このコールバックでは、アドインで定義されているすべてのコントロールまたは名前によって指定した 1 つのコントロールを無効にするために使用できる IRibbonUI オブジェクトが指定されます。IRibbonUI は、使用しているアドインに限定されます。IRibbonUI のメソッドを呼び出すと、それらのメソッドは、Outlook 内の接続されているすべてのアドインではなく使用しているアドインにのみ適用されます。次に、サンプル アドインの Ribbon_OnLoad コールバックを示します。
Visual Bsic の場合 :
Public Sub Ribbon_OnLoad(ByVal ribbon As Office.IRibbonUI)
m_Ribbon = ribbon
End Sub
C# の場合 :
public void Ribbon_OnLoad(Office.IRibbonUI ribbon)
{
m_Ribbon = ribbon;
}
IRibbonUI では、次のメソッドが公開されます。
表 4. IRiboonUI によって公開されるメソッド
| メソッド | アクション | 説明 |
|---|---|---|
| Invalidate() | コールバック | アドインのすべてのカスタム コントロールを更新するために指定します。 |
| InvalidateControl(string controlID) | コールバック | アドインで controlID によって定義された特定のコントロールを更新するために指定します。 |
IRibbonUI オブジェクトを使用する場合は、パフォーマンスを考慮して、Invalidate ではなく InvalidateControl を呼び出すことがベスト プラクティスです。Invalidate を呼び出すと、アドインで定義されているリボンのコントロールがすべて無効になり、開いているインスペクタでコールバックが発生します。IRibbonUI を表すインスタンス変数は m_Ribbon です。このインスタンス変数は Connect クラスで定義されます。アドレスに変更があったために ColorWidgetsGroup の無効化が必要であることが PropertyChange イベントによって検出された場合に OutlookInspector クラスから m_Ribbon.InvalidateControl を呼び出すために、OutlookInspector で RaiseInvalidateControl プロシージャが呼び出されます。このプロシージャによって、OutlookInspector クラスの InvalidateControl イベントが開始します。これは、Connect クラスの WrappedWindow_InvalidateControl イベント プロシージャによって処理されます。
Visual Bsic の場合 :
Private Sub WrappedWindow_InvalidateControl( _
ByVal sender As Object, _
ByVal e As OutlookInspector.InvalidateEventArgs)
If Not (m_Ribbon Is Nothing) Then
m_Ribbon.InvalidateControl(e.ControlID)
End If
End Sub
C# の場合 :
void WrappedWindow_InvalidateControl(object sender,
OutlookInspector.InvalidateEventArgs e)
{
if (m_Ribbon != null)
{
m_Ribbon.InvalidateControl(e.ControlID)
}
}
IRibbonControl オブジェクト
IRibbonControl オブジェクトは、リボンのコントロールで使用可能なコールバックのほとんどで渡されます。このオブジェクトでは、Outlook で次に表示される Inspector オブジェクトを表す Context オブジェクトが指定されるため、Outlook 開発者にとって特に有用です。
IRibbonControl によって、次のプロパティが公開されます。
表 5. IRibbonControl によって公開されるプロパティ
| プロパティ | 型 | 説明 |
|---|---|---|
| Context | Object | 読み取り専用。次にリボンが表示されるウィンドウを表すオブジェクトを戻します。 |
| Id | 文字列 | 読み取り専用。コントロールの id 属性を表す文字列を戻します。 |
| Tag | 文字列 | 読み取り専用。コントロールの tag 属性を表す文字列を戻します。 |
Context オブジェクトを使用する方法とこのオブジェクトを Outlook インスペクタにキャストする方法を理解するために、次のコード例を示します。まず、Connect クラスの ColorWidgetsGroup_GetVisible コールバックについて説明します。連絡先インスペクタ ウィンドウが作成されるか、既存のインスペクタ ウィンドウがアクティブになったときは常に、このコールバックが開始します。Control.Context が FindOutlookWindow プロシージャに渡され、対象の ContactItem の状態がコードによって確認されます。簡単なビジネス ロジックを使用することによって、アイテムにアドレスがある場合、コールバックは true を戻し、アイテムにアドレスがない場合は false を戻します。ture を戻すと ColorWidgetsGroup コントロールは表示になり、false を戻すと非表示になります。
Visual Bsic の場合 :
Public Function ColorWidgetsGroup_GetVisible( _ ByVal control As Office.IRibbonControl) As Boolean Dim window As OutlookInspector = _ FindOutlookInspector(control.Context) If Not window Is Nothing Then 'window.Ribbon = m_Ribbon Dim contact As Outlook.ContactItem = window.CurrentItem 'アドレスが存在する場合にのみグループが表示されます。 If String.IsNullOrEmpty(contact.BusinessAddress) _ And String.IsNullOrEmpty(contact.HomeAddress) _ And String.IsNullOrEmpty(contact.OtherAddress) Then Return False Else Return True End If End If Return False End Function
C# の場合 :
public bool ColorWidgetsGroup_GetVisible(Office.IRibbonControl control)
{
OutlookInspector window = FindOutlookInspector(control.Context);
if (window != null)
{
Outlook.ContactItem contact = window.CurrentItem;
//アドレスが存在する場合にのみグループが表示されます。
if (String.IsNullOrEmpty(contact.BusinessAddress) &
String.IsNullOrEmpty(contact.HomeAddress) &
String.IsNullOrEmpty(contact.OtherAddress))
{
return false;
}
else
{
return true;
}
}
return false;
}
[Color Widgets] グループの [Color] ボタンをクリックすると、ColorButton コントロールに定義されている ColorButton_Action コールバックが呼び出されます。このコールバックで IRibbonControl.Context オブジェクトが使用されるしくみを理解することも役立ちます。このコールバックでは、[Color] ボタンがクリックされたインスペクタが FindOutlookWindow プロシージャから戻されます。ColorButton_Action プロシージャでは、対象のインスペクタで現在選択されている色が Window.RibbonColor から戻され、現在選択されている色がメッセージ ボックスに表示されます。OutlookInspector クラスの RibbonColor プロパティが、カラー ウィジェットの、選択されている正しい色を認知する方法は次のとおりです。ColorCombo_OnChange コールバックが呼び出されると、OutlookInspector の特定のインスタンスに Window.RibbonColor が設定されます。
Visual Bsic の場合 :
Public Sub ColorButton_Action(ByVal control As Office.IRibbonControl)
Try
Dim window As OutlookInspector = _
FindOutlookInspector(control.Context)
If Not window Is Nothing Then
MessageBox.Show(My.Resources.AlertMessage _
& window.RibbonColor, _
My.Resources.Ribbon_ColorWidgetsGroup, _
MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
Catch ex As Exception
Debug.WriteLine(ex.Message)
End Try
End Sub
C# の場合 :
public void ColorButton_Action(Office.IRibbonControl control)
{
try
{
OutlookInspector window = FindOutlookInspector(control.Context);
if (window != null)
{
MessageBox.Show(Properties.Resources.AlertMessage +
window.RibbonColor,
Properties.Resources.Ribbon_ColorWidgetsGroup,
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
結論
リボンは、Outlook 2007 インスペクタ ウィンドウ用の魅力的な新しいユーザー インターフェイスを提供します。既存の Outlook ソリューションで、インスペクタのコマンド バーのカスタマイズ項目を使用している場合は、リボンの、強化されたコントロールをサポートするようにコードを変更することを検討する必要があります。Outlook のリボン拡張機能は、アドインを使用することによってリボンを拡張する他の Office アプリケーションとは異なります。サンプルの Outlook RibbonX アドインで示されている技法を使用することによって、Outlook のアイテムに生じた状態の変更がリボンのコントロールに反映されるように、リボンを実装することができます。
その他の参考資料
Office 2007 ユーザー インターフェイスのカスタマイズの詳細については、次の参考資料を参照してください。
![[アドイン] タブの [ユーザー設定のツール バー] グループに表示される [Color] カスタム ツール バー (クリックするとイメージが拡大されます) [アドイン] タブの [ユーザー設定のツール バー] グループに表示される [Color] カスタム ツール バー (クリックするとイメージが拡大されます)](http://i.msdn.microsoft.com/dynimg/IC89288.gif)
![連絡先インスペクタ リボンの [Color Widgets] グループ (クリックするとイメージが拡大されます) 連絡先インスペクタ リボンの [Color Widgets] グループ (クリックするとイメージが拡大されます)](http://i.msdn.microsoft.com/dynimg/IC114520.gif)