二つのデータウィンドウを同時に 拡大/縮小 させる方法

皆さま、こんにちは。サポート部の めんたいにし です。
先日、このようなお問合せがありましたので、ご紹介します。
「複数のデータウィンドウを Ctrl キー+マウスホイール操作で同時に拡大/縮小したい。」
なるほどなるほど。
しかし残念ながら、PowerBuilder にはデータウィンドウの Zoom 変更時に発生するイベントは用意されておりません。
代替案としてOther イベントによって「Ctrl を押下しながらホイールスクロールされた」ことを検知して処理を行う方法がございます・・・!!
※Other イベントには注意点がございます。ぜひ最後までご覧ください。※

Other イベントによって「Ctrl を押下しながらホイールスクロールされた」ことを検知して処理を行う方法をご紹介します。
Other イベントはデータウィンドウなどのコントロールに対し、何らかのメッセージが送信された際に発生するイベントです。
PowerBuilder のイベントではない Windows メッセージが発生するときに発生します。
このイベント内で Message オブジェクトの内容や押下されているキーをチェックし、Ctrl + マウスホイール操作を検知して Zoom の値を取得することで、複数のデータウィンドウの拡大率を同期させることができます。
なお、Other イベント内では拡大率 (Zoom プロパティ) が変更される前の値を取得しますので、Zoom の同期処理を関数化して POST 呼び出しする必要があります。
下記はウィンドウ上に配置された 2 つのデータウィンドウ (dw_1、dw_2) の拡大率を同期させる処理の一例です。
【例】
[sync_zoom (ユーザー定義関数)]
引数1: datawindow adw_zoomed (拡大率を変更されたデータウィンドウ)
引数2: datawindow adw_target (同期先のデータウィンドウ)
————————–
// 拡大率を同期
adw_target.object.datawindow.zoom = adw_zoomed.object.datawindow.zoom
[dw_1 の Other イベント]
CONSTANT unit WM_MOUSEWHEEL = 522 // マウスホイール操作
// Ctrl + マウスホイール操作時
IF message.number = WM_MOUSEWHEEL AND KeyDown(keyControl!) THEN
POST sync_zoom(this, dw_2)
END IF
[dw_2 の Other イベント]
CONSTANT unit WM_MOUSEWHEEL = 522 // マウスホイール操作
// Ctrl + マウスホイール操作時
IF message.number = WM_MOUSEWHEEL AND KeyDown(keyControl!) THEN
POST sync_zoom(this, dw_1)
END IF
上記はあくまでサンプルとなりますので、実際のアプリケーションの構成に合わせて適宜変更していただきますようお願いいたします。
※注意点※
Other イベントは色々な操作をハンドリングできますが、開発者はユーザイベントを自由に定義できるため、有効な手段とは言えない場合もあります。
Other イベントはすべての Windows メッセージを調べるため、ここに処理を書くとあらゆる操作をするたびに処理が走ります。。。
そのため、パフォーマンスの低下に繋がらないように注意が必要です。
場合によっては Other イベントに書いた処理が Other イベントを呼び出してしまい無限ループなど(震え声)
・・・という少々、上級者向けのイベントです。
とはいえ、使い方次第では非常に便利なイベントですので、ご参考になれば幸いです。