読者です 読者をやめる 読者になる 読者になる

空談録

http://artfulplace.net/blogs/ からひっこしつつ

VSTOアドインでPowerPointにオレオレズームを追加する

デバッグ回数3回だしそもそも誰もいらなそうだし公開はしませんが

PowerPointのズームがなんだか変な倍率で決め打ち?なのかわかりませんが、もっと細かくズームしたい!と思ってもなんだか微妙です
だからといってズームのダイアログ開いていちいち数値入力してっていうのもうーん

というわけでもっと細かくズームできる仕組みを作ろう!というお話です
ただし私は頭がよくないのでWindowsのイベントをフックしてPowerPointへのイベントを強奪するような仕組みを作らないで手抜き実装です

(最良なのはPowerPointへのCtrl+ホイールのイベントをこっちで拾ってPowerPointに渡さないでズームすることなんでしょうがそんなん知らないという)

とりあえずやっていきましょう

PowerPointのズームの変更

これは次のコードで実現できます

private static void zoomChange(int val)
{
    if (isAvailableZoom(val))
    {
        Globals.ThisAddIn.Application.ActiveWindow.View.Zoom = val;
    }
}

private static bool isAvailableZoom(int val)
{
    return val >= 10 && val <= 400;
}

やる気がないコード

とりあえずズームの有効範囲は10 ~ 400なのでそれに合わせたintを設定するだけです
適当に呼ぶと例外間違いなしなのでタイミングだけは間違えないようにしましょう

ただまあいちいちこんな感じで設定する数値指定したくないので次のようなメソッドで今回は対応します

internal static void ZoomIncrement(int val)
{
    if (isAvailableZoom(Globals.ThisAddIn.Application.ActiveWindow.View.Zoom + val))
    {
        Globals.ThisAddIn.Application.ActiveWindow.View.Zoom += val;
    }
    else
    {
        if (Globals.ThisAddIn.Application.ActiveWindow.View.Zoom != 400)
        {
            Globals.ThisAddIn.Application.ActiveWindow.View.Zoom = 400;
        }
    }
    
}
internal static void ZoomDecrement(int val)
{
    if (isAvailableZoom(Globals.ThisAddIn.Application.ActiveWindow.View.Zoom - val))
    {
        Globals.ThisAddIn.Application.ActiveWindow.View.Zoom -= val;
    }
    else
    {
        if (Globals.ThisAddIn.Application.ActiveWindow.View.Zoom != 10)
        {
            Globals.ThisAddIn.Application.ActiveWindow.View.Zoom = 10;
        }
    }
}

現在のズームの値に足す、引くで対応していくほうがホイール操作という点から見ると楽かなという感じです
とりあえずこれでPowerPointのズーム処理は完成です。あとは呼び出し部分を作るだけ

マウスのホイールの検知その他

ここは古き良きWinForms先生に頑張ってもらいます
まあ別にどっちでもいいんですけどどうせ見えないし……

適当にフォームを作ります。そこにTextBoxあたりをDock = Fillで設置しましょう
フォームのStartingPositionをCenterParentにして終了

マウスのホイールは Control.MouseWheel イベント (System.Windows.Forms) を使っていきましょう。
コントロールじゃないと取れないっぽいのでTextBoxのイベントを利用します。
MouseEventArgs.Deltaに変化した値がはいっているのでそれの+-だけを利用していきましょう

こんな感じでホイールの変化をとってみます

private void TextBox1_MouseWheel(object sender, MouseEventArgs e)
{
    var res = e.Delta;
    if (res < 0)
    {
        // ThisAddin.ZoomDecrement(2);
    }
    else
    {
        // ThisAddin.ZoomIncrement(2);
    }
}

ただ、MouseWheelイベントは"コントロールにフォーカスがあり"、さらに"マウスポインターがコントロール上にある"ことが条件なのでForm_LoadでWindowsStateをMaximumにしてあげた後にTextBoxをフォーカスしときます
フォーカスはいらないのかな…? まあどっちでもいいですが… 

とはいえ普通に最大化するとPowerPointが見えないのでFormのOpacityを1%にします。0%にするとイベントが取れなくなるので1%以上で指定。

これでフォームを表示している間はズームが変更できる機能となります。クリックで閉じるようにしとけば完璧(見えないので閉じるの面倒)
リボンからフォームを呼び出すボタンを追加してクイックアクセスツールバーに足しとけば便利かなぁという


ということでただのズームが不便だから別にズームできるようにしたというだけの記事
最近画像編集をPowerPointでやってるので標準のズーム機能が超不便…
少しはましになったと思いたいけどちゃんと使ってないので何とも

最近ブログを書いていないのでもうちょっと頑張りたい

この辺で