以前HTAコネタで起動時に位置とサイズを設定するTIPS(てほどでもないが)を紹介したが、それにちょっとひねりを加えて、自動的に位置とサイズを記憶、次回自動時にそれを再現するサンプルを書いてみる。なんとなく、デスクトップアプリっぽいしょ?
なお、サンプルでは、矩形情報の読み込み・保存にjson.orgのJSONライブラリを利用しているが、単純なシリアライズ・デシリアライズなので自前でメソッドを用意できるなら特にjson.jsは必要ない。
まず、前のエントリでも書いたが、ウィンドウの位置とサイズを設定するタイミングは、HTA:APPLICATIONタグの出現前にしないと気になるちらつきが発生する。なので、json.jsをロード(または同等の機能の定義・ロード)してからhta:applicationが出現するまでに
また、最終的な矩形情報の保存のタイミングだが、後述の通りdocument.bodyのプロパティを参照するので、window.onbeforeunloadにする。onunloadではdocument.bodyへアクセスできないためエラーになる。
一番面倒なのは、ウィンドウの位置とサイズの正確な取得方法だ。
まず位置情報。IEにはwindow.screenLeft/screenTopというプロパティがあるが、これはウィンドウボーダーとタイトルバーのサイズを除いた情報しか取得できない。
また、サイズについてはdocument.bodyのoffsetWidth/offsetHeightが取得可能なもっとも外側のサイズのようで、これまたタイトルバーやらとの差がある。
で、どうするかというと
// offsetRectはleft/top/width/heightの // プロパティに、測定サイズと実サイズの差を格納する。 // initialRectはwindow.resizeTo/moveToに使用した値を // 格納している。 with( offsetRect ) { left = initialRect.left - window.screenLeft; top = initialRect.top - window.screenTop; width = initialRect.width - document.body.offsetWidth; height = initialRect.height - document.body.offsetHeight; }としてオフセット情報を取得し、window.onbeforeunload時に
// savePrefは指定オブジェクトのJSONデータを保存する関数。 // window.screenLeft/Topとdocument.body.offsetWidht/Heightに // offsetRectの補正値を加える。 savePref( { left : window.screenLeft + offsetRect.left, top : window.screenTop + offsetRect.top, width : document.body.offsetWidth + offsetRect.width, height: document.body.offsetHeight + offsetRect.height } );の要領で補正した矩形情報を保存する。
実際に位置とサイズを自動保存するHTAのサンプルコードは以下のとおり。
セコメントをする