PR
Keyword Search
Calendar
New!
ホームズ探偵さんComments
Freepage List
ここ数日、エアロのフレーム拡張でハマッテいました。
VISTAのエアロを使ったときは、通常のウィンドウマネージャとDWMの2階建の構成になるようです。
通常ウインドウサイズを取得するにはGetWindowRect()でウインドウ矩形を取得します。しかしながら、エアロを使用していると見た目のウィンドウサイズの内側5pxのサイズが取得することになります。(正確には内側5pxを取得することがあります。)
これが必ず内側5pxならまだいいのですが、どうもサイズ変更枠のウィンドウは見た目と同じサイズとなるようです。
ちなみに、フレーム拡張されたウィンドウのサイズを取得するにはDWM系の関数である
DwmGetWindowAttribute()を使用すれば取得できます。
こんな感じのコードになります。
RECT r;
if(SUCCEEDED(hr)){
}
hWndは取得したいウィンドウのハンドルです。
ただこの関数は、VISTA以降でないと使用できません。(当たり前ですが。。)
まあ、通常はウィンドウの外周の正確な位置というのはあまり必要ないのですが、今回の窓の付箋PLUSの検索パネルのようにウィンドウ同士をぴたりとくっつけたいときは必要になります。
さらに、この外周を意識しながらもウィンドウを操作するのはウィンドウマネージャ系の座標なので結構面倒です。
なので、XP,VISTAエアロON,エアロOFFで互換性を意識したプログラムは結構面倒です。
今回は、ウィンドウの見た目の矩形とウィンドウ操作系の矩形を両方取得する関数を作成しました。つまりエアロが有効な場合は表示矩形はDwmGetWindowAttribute()で矩形を取得し、有効でない場合はGetWindowRect()で表示矩形を取得します。
さらに、XPでも動くようにDwmGetWindowAttribute()の呼び出しはLoadLibraryでダイナミックにDLLを呼び出すようにしています。
このあたりは整理して研究所にドキュメントとしてUPしておこうと思います。