SWTで縦横比を確保したままのウィンドウサイズ変更

SWTを使ってGUIを構成するスタンドアロンのJavaのローカルアプリケーションを作成していて気になったのが「縦横比を確保したままウィンドウサイズの変更」ができるかどうか。

SWTでは基本的にウィンドウサイズのリサイズはaddControlListener(ControlAdapter)とcontrolResized(ControlEvent)によって可能である。

この方法では、ウィンドウの端っこをマウスカーソルが矢印に変化したときにドラッグすると、ウィンドウサイズの変更ができるが、ドラッグが終了しないとアプリケーションの処理が入らない。つまりウィンドウサイズの変更をしようとしているその瞬間にアプリケーションの制御がかけられない。よってドラッグ中に縦横比の制御がかけられない。

win32apiの方面から調べてみたが、ウィンドウサイズ変更後の動きはWM_SIZEが関係していて、ウィンドウサイズ変更中の動きはWM_SIZINGが関係しているらしいことまでは分かった(縦横の比率を一定にしてサイズ変更)。

SWTのソースコードに対してWM_SIZEでgrep検索かけると出てくる。が、WM_SIZINGでgrep検索をかけても出てこない。つまり、SWTではWM_SIZINGの制御は行っていない。自分でWM_SIZINGを書くしかない。

SWTに対してWM_SIZINGを組み込むことを考慮してWM_SIZEがどのようなロジックで動作しているのか見てみた。

org/eclipse/swt/widgets/Control.java
int windowProc (int hwnd, int msg, int wParam, int lParam) 中の
switch (msg) {
case OS.WM_SIZE: result = WM_SIZE (wParam, lParam); break;
}

によってwindowProcを返す。


org/eclipse/swt/widgets/Control.java
LRESULT WM_SIZE (int wParam, int lParam) {
sendEvent (SWT.Resize);
// widget could be disposed at this point
return null;
}

でWM_SIZEのイベント(SWT.RESIZE)を送る。


org/eclipse/swt/internal/win32/OS.java
public static final int WM_SIZE = 0x5;

で、OS依存のコードであるWM_SIZEを定義するというところまではつかんだ。

後はWM_SIZINGのコードを書くだけだが…面倒だ…orz

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>