使ってみよう! Windows Live SDK/API

第54回 作ってみようSkyDrive連携PowerPointアドイン(後篇)

この記事を読むのに必要な時間:およそ 9.5 分

マーカーの追加

それでは,アドインのメインとなる処理を書いていきましょう。まずは,マーカーの追加ボタンをクリックしたときの処理です。前回の内容では,ThisAddInクラスにAddMarkerメソッドを用意するところまで完了しています。

作成するアドインでは,オートシェイプの図形をスライドに貼り付け,スライドショー中にSkyDriveから写真をダウンロードし,オートシェイプの位置に表示するようにします。このマーカーとなるオートシェイプの追加処理を行います。

現在のスライドへ四角形のオートシェイプの追加は次のように記述できます。追加する位置と大きさは決め打ちにしています。

Dim w = Application.ActiveWindow
Dim slide = DirectCast(w.View.Slide, PowerPoint.Slide)
Dim shape = w.Presentation.Slides(slide.SlideIndex).Shapes.AddShape(Microsoft.Office.Core.MsoAutoShapeType.msoShapeRectangle, 0, 0, 100, 100)

アドイン側で,マーカーとして追加したオートシェイプをほかのオートシェイプと区別できるようTagsプロパティを使って区別しておきます。また,今回作るアドインでは,最新の写真1枚のダウンロードにしか対応しませんので,既にマーカーが追加されていた場合は,削除して新たなマーカーを追加することにします。AddMarkerメソッドの全体のコードは次のようになります。

Private Const TagName As String = "SampleAddInObject"

Sub AddMarker()
    Try
        Dim w = Application.ActiveWindow
        Dim slide = DirectCast(w.View.Slide, PowerPoint.Slide)

        ' 既にあるマーカーを削除
        For i = slide.Shapes.Count To 1 Step -1
            Dim s = slide.Shapes(i)
            If s.Tags.Item(TagName) = "Marker" Then
                s.Delete()
            End If
        Next

        Dim shape = w.Presentation.Slides(slide.SlideIndex).Shapes.AddShape(Microsoft.Office.Core.MsoAutoShapeType.msoShapeRectangle, 0, 0, 100, 100)
        shape.Tags.Add(TagName, "Marker")
    Catch ex As Exception
        ' (例外は無視)
    End Try
End Sub

マーカーの追加ボタンがクリックされたとき,必ず編集できるスライドがあるとは限りませんので,その場合は例外が発生します。上記のコードでは,単純にすべての例外を無視するようにしています。

ここまでを実行してみましょう図2⁠。マーカーの追加ボタンをクリックすると,オートシェイプが追加されましたか? このオートシェイプを移動や大きさを変えて写真を表示する位置を指定します。

図2 マーカーの追加

図2 マーカーの追加

スライドショー時の処理

次は,スライドショー中にスライドを切り替えた時の処理を記述します。Application.SlideShowNextSlideイベントで,スライドが表示されたときに処理を行います。

作成するアドインでは,プレゼン中にマーカーのあるスライドの直前まで表示したときに,SkyDriveから写真をダウンロードするようにします。

現在表示されているスライドの次のスライドにマーカーがあるかを確認し,ある場合に,SkyDriveから写真をダウンロードして次のスライドに追加します。コードは次のようになります。

写真のダウンロードと表示は,別途AddPictureメソッドを定義して,その中で処理します。

Private Sub Application_SlideShowNextSlide(Wn As Microsoft.Office.Interop.PowerPoint.SlideShowWindow) Handles Application.SlideShowNextSlide
    If Wn.View.Slide.SlideIndex >= Wn.Presentation.Slides.Count Then
        Exit Sub
    End If

    ' 次のスライド
    Dim slide = Wn.Presentation.Slides(Wn.View.Slide.SlideIndex + 1)

    ' スライドにマーカーがあるかチェック
    Dim shape As PowerPoint.Shape = Nothing
    For Each s As PowerPoint.Shape In slide.Shapes
        If s.Tags.Item(TagName) = "Marker" Then
            shape = s
            Exit For
        End If
    Next
    If shape Is Nothing Then
        Exit Sub
    End If

    ' マーカーがある場合,AddPicture メソッドをスレッドで処理する
    Dim t = New Threading.Thread(AddressOf AddPicture)
    t.SetApartmentState(Threading.ApartmentState.STA)
    t.Start(New Tuple(Of PowerPoint.Slide, PowerPoint.Shape)(slide, shape))
End Sub

ただし,上記コードでは,少し不十分です。既にアドインによってダウンロードした写真がスライド上にある場合は,削除をここで行います。また,サインインしていない状態であれば,ダウンロードできませんので処理を抜けるようにします。サインイン処理は,SignInとGetUserInfoメソッドで記述していました。サインイン時に生成したLiveConnectClientオブジェクトを使ってサインイン状態か判断します。すべて処理を記述したコードは,次のようになります。

Private Sub Application_SlideShowNextSlide(Wn As Microsoft.Office.Interop.PowerPoint.SlideShowWindow) Handles Application.SlideShowNextSlide
    If Wn.View.Slide.SlideIndex >= Wn.Presentation.Slides.Count Then
        Exit Sub
    End If

    ' 次のスライド
    Dim slide = Wn.Presentation.Slides(Wn.View.Slide.SlideIndex + 1)

    ' 以前にアドインで追加された写真を削除
    For i = slide.Shapes.Count To 1 Step -1
        Dim s = slide.Shapes(i)
        If s.Tags.Item(TagName) = "InsertedPicture" Then
            s.Delete()
        End If
    Next

    If Me.LiveConnectClient Is Nothing Then
        Exit Sub
    End If

    ' スライドにマーカーがあるかチェック
    Dim shape As PowerPoint.Shape = Nothing
    For Each s As PowerPoint.Shape In slide.Shapes
        If s.Tags.Item(TagName) = "Marker" Then
            shape = s
            Exit For
        End If
    Next
    If shape Is Nothing Then
        Exit Sub
    End If

    ' マーカーがある場合,AddPicture メソッドをスレッドで処理する
    Dim t = New Threading.Thread(AddressOf AddPicture)
    t.SetApartmentState(Threading.ApartmentState.STA)
    t.Start(New Tuple(Of PowerPoint.Slide, PowerPoint.Shape)(slide, shape))
End Sub

今回のアドインでは,1枚目のスライドにマーカーがある場合や,非表示のスライドがある場合は,考慮していません。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp