アイデア
まず、アイデアを説明しようとします。 あなたはコードを持っていますか、これを言ってみましょう[ 1 ]:
public static T DeepCopy<T>( this IPrototype<T> obj)<br/>
{<br/>
T copy;<br/>
using (MemoryStream stream = new MemoryStream())<br/>
{<br/>
BinaryFormatter formatter = new BinaryFormatter();<br/>
formatter.Serialize(stream, obj);<br/>
stream.Seek(0, SeekOrigin.Begin);<br/>
copy = (T)formatter.Deserialize(stream);<br/>
stream.Close();<br/>
}<br/>
return copy;<br/>
}<br/>
スライドの一部でこのコードを説明します。 たとえば、最初にこれを表示できます。
//
public static T DeepCopy<T>( this IPrototype<T> obj)<br/>
{<br/>
そして、これは:
//
public static T DeepCopy<T>( this IPrototype<T> obj)<br/>
{<br/>
//
T copy;<br/>
などなど。 組み込みのアニメーション[ 2 ]を使用できるように見えますが、これは柔軟性がありません。たとえば、コードの一部を非表示にしても、その場所はまだ割り当てられるため、良くありません。 しかし、段落や行ではなく、数文字(キーワードなど)だけを非表示にする必要がある場合はどうでしょうか。 それはこれらの目的のためだけであり、PowerPoint用の2つ目の[ 3 ]アドインを作成することにしました。
インターフェース
Officeアドオンは非常に簡単に記述できます。このためには、VSTO(Visual Studio Tools for Office)アドオンを使用する必要があります。 対応するタイプのプロジェクトがスタジオに表示され、PowerPoint 2007アドインを選択しました。

非常に楽しいのは、生成されたプロジェクトがすでに使用できる状態にあるという事実です。 F5デバッグで動作します。スタジオにいなくても、アドインはPowerPointのままなので、「自由な時間に自分のドッグフードを食べる」ことができます。[ 4 ]
オフィスではリボンコントロール(リボン)を使用しているため、スタジオはこれらのコントロールの操作をサポートしています。 リボン要素を作成するための特別なデザイナーもいます。

インターフェースに必要なボタンは1つだけで、タスクが大幅に簡素化されました(更新:すでに3つあります)。

モーダルインターフェイス
スタジオには、スタジオまたはオフィスの拡張機能であっても、WPFウィンドウを拡張機能プロジェクトに追加できないという問題があります(おそらく2010年に決定されました)。 通常、別のアセンブリを使用してこの問題を解決しますが、この場合、WinFormsをおしっこしようとし、インターフェイスには無料の(そしてかなりきれいな)Kryptonコントロールを選択しました。 完成したバージョンでは、このケースは次のようになります。

悪くないですか? これらはすべて無料で、 こちらから入手できます 。 しかし、アドインからウィンドウがどのように開くかは説明する価値があります。 リボンを覚えていますか? そのため、アドインクラス自体では、どこにも登録されていません! リボンは自動的に作成されます! そして、すべてがシンプルです-イベントがボタンに結び付けられ、実際に
ShowDialog()
予測可能な呼び出しを
ShowDialog()
ます。
スライドを操作する
アドインの内部ロジックはかなり退屈なので、プレゼンテーションでスライドをプログラムで作成する方法を説明します。 まず、PowerPoint自体へのリンクを保持する場所が必要です。 これを行うには、静的変数を作成し、アドインの初期化時に受け取った値をキャッシュしました。
public static Application App;<br/>
<br/>
private void OnStartup( object sender, EventArgs e)<br/>
{<br/>
App = Application;<br/>
if (ApplicationStartedEvent != null )<br/>
ApplicationStartedEvent( this , null );<br/>
}<br/>
これで、ボタンハンドラー(リボンのボタンハンドラー)が同じリンクを取得し、そこからユーザーの「アクティブな」プレゼンテーション(つまり、ユーザーが操作しているもの)を取得できます。
var app = ThisAddIn.App;<br/>
var p = app.ActivePresentation;<br/>
新しいスライドをプレゼンテーションに追加するのは簡単です。 スライドに選択できるレイアウトの種類を覚えていますか? したがって、ここでは列挙型であるため、すべてが非常に単純です。
Slide s = p.Slides.Add(<br/>
1+p.Slides.Count, //
PpSlideLayout.ppLayoutText //
);<br/>
さらに-さらに簡単。
ppLayoutText
レイアウトを使用したスライドには、タイトルとメインテキストフィールドがあります。 これらのオブジェクトは、スライドの
Shapes
コレクションで使用できます(コレクションは最初からではなく、1つからインデックス付けされることに注意してください)。 タイトルテキストの設定方法の例を次に示します。
var title = s.Shapes[1];<br/>
title.TextFrame2.TextRange.Text = cff.ApplicationSettings.SlideTitle;<br/>
ところで、
var
キーワードを使用すると、開発中に非常に役立つことに注意してください。 まだ注目に値するのは、アドイン全体を作成するときに、
missing
値を使用する必要がなかったことです。これは、Office拡張機能を使用する場合の主な欠点の1つです。 C#4では、もちろんそのような問題はありません。
テキストフレームのプロパティを操作する方法の例を次に示します。 私の場合、ユーザー定義のフォントを設定し、デフォルトのフィールドと「シュートアウト」も削除します。
var code = s.Shapes[2].TextFrame2.TextRange;<br/>
code.ParagraphFormat.FirstLineIndent = 0;<br/>
code.ParagraphFormat.Bullet.Visible = MsoTriState.msoFalse;<br/>
code.Font.CopyFrom(cff.ApplicationSettings.CodeFont);<br/>
code.ParagraphFormat.RightIndent = 0;<br/>
code.ParagraphFormat.LeftIndent = 0;<br/>
code.ParagraphFormat.SpaceBefore = 0;<br/>
フォントは拡張メソッドを使用することに注意してください。 問題は、Officeがそのタイプ
Font2
使用し、
System.Drawing.Font
からの変換
System.Drawing.Font
もちろん定義されていないことです。 また、オフィスでは、タイプ
true
および
false
は列挙型であるため、値をyes、no、およびnot setに設定できます。 繰り返し
MsoTriState
、
bool
からoffice
MsoTriState
への変換を決定することは難しくありません。
テキストを操作する
ご
TextFrame2
、テキストは
TextFrame2
型のオブジェクトに配置されます。 フレームにテキストを追加すると、追加したコードへのリンクが表示されます。
var range = textarea.TextFrame2.TextRange.InsertAfter(finalText);<br/>
フォントや色など、このテキストの味を変更できるようになりました。
range.Font.Fill.ForeColor.RGB = settings.EmphasisColor.ToRgb();<br/>
range.Font.CopyFrom(settings.EmphasisFont ?? settings.CodeFont);<br/>
フォントのコピーについてはすでに説明しましたが、色についても同じ問題があります。 すでに組み込まれている
ToArgb()
関数を使用すると、色が裏返しになります。 変換を手動で実装する必要がありました。
public static int ToRgb( this Color color)<br/>
{<br/>
return (color.A << 24) + (color.B << 16) + (color.G << 8) + color.R;<br/>
}<br/>
ここですでに終了しますが、1つの警告を作成します。特定の色の段落を作成した場合、次の段落またはコードは同じになります。 したがって、コンポーネントからテキストを作成する場合、最初にデフォルト値をキャッシュし、追加する各セグメントにそれらを適用します。
おわりに
VSTOインフラストラクチャの操作は非常に簡単であることが判明し、アドインを使用した結果はSpbalt.net 、 Ineta 、 ActiveMesaなどの組織でのプレゼンテーションですぐに見ることができます。 そして、突然プロジェクトに興味を持つようになった場合は、アドインの結果とソースコードをここからダウンロードできます 。
注釈
- ↑ところで、このコードは、アドインでプロトタイプパターンを実装するために使用されました。 今ではこれはバストであるように思えます
MemberwiseClone()
も使用できます。 - ↑実際に-いいえ、できません。 私見、プレゼンテーションはPDFにアップロードする必要があり、PDFのみにアップロードする必要があります(またはLinuxユーザーはプログラミングに興味がないと思いますか?)。また、PDFに変換すると、PPアニメーションが失われます。 したがって、ここに示すアプローチは、レポートがPDFのみで展示されているSpbalt.netなどのグループに最適です。
- ↑私が書いた最初のPP拡張は、ニューラルネットワークの視覚化でした。 2003年のオフィスに戻ったのは3年前です。
- ↑このフレーズ( 当社独自のドッグフードを食べる )は、Microsoftの従業員が独自の開発インフラストラクチャを使用すると言うときに使用されます。