OrangeMaker

OrangeMaker

PR

×

Keyword Search

▼キーワード検索

Profile

OrangeMaker

OrangeMaker

Calendar

Comments

オールフリーソフトのひろ@ Re:Kokomite Ver.1-0-1-103 リリース(06/10) Kokomiteについて教えてください。 初め…
http://buycialisky.com/@ Re:vs2011 にアップグレード(09/18) cialis split pillcialis comparison difl…
http://buycialisky.com/@ Re:BreathOfWindow Ver.1-0-116 Vectorにて公開(09/05) best price cialiscialis vs viagra pharm…
http://buycialisky.com/@ Re:RieNマルチ化(04/29) cialis preis apothekecialis online ohne…
http://buycialisky.com/@ Re:EatherOverSkypeについて(08/01) side effects of viagra and cialiscialis…

Freepage List

2009.10.08
XML
カテゴリ: カテゴリ未分類

ここ数日、エアロのフレーム拡張でハマッテいました。

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しておこうと思います。






お気に入りの記事を「いいね!」で応援しよう

Last updated  2009.10.09 00:50:05
コメント(3) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Mobilize your Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: