OrangeMaker_logo
memo アイコン SDK-MFC 備忘録

Windows SDKやMFCに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)

DWM Thumbnailの落とし穴

2009/10/22 作成

DWMのThumbnail機能は簡単でとても便利ですが、ひとつ穴ぼこがあります。

自分でも忘れそうなので、メモ替わりに記載しておきます。

DWMのThumbnailを使うには、DWMRegisterThumbnail()で転送元のウィンドウと転送先の2つのウインドウを結びつけたあと、DWMUpdateThumbnailProperties()でパラメータの設定を行います。

このとき、転送先の矩形と転送元の矩形を設定できます。転送先はクライアント座標なのであまり間違うことはないですが、問題は転送元の矩形座標です。

転送元矩形を省略すれば勝手にウィンドウ全体となるのでこれも間違いようがありません。

問題の転送元の矩形座標は、ウィンドウ全体を対象とした場合はウィンドウ原点を(0,0)とする座標系です。(つまりリージョンの指定と同じ)、
転送をクライアント領域だけにした場合はクライアント座標になるようです。

問題のポイントは、DWMでフレーム拡張している場合はウィンドウ原点は表示しているウィンドウの少し内側になる点です。

ということは、

フレーム拡張しているウィンドウの場合、転送元の矩形の指定は
TOP=-TOP方向のフレーム拡張分
LEFT=-LEFT方法のフレーム拡張分
RIGHT=LEFT + DwmGetWindowAttribute(DWMWA_EXTENDED_FRAME_BOUNDS・・・)で取得したウィンドウ幅
BOTTOM=TOP+DwmGetWindowAttribute(DWMWA_EXTENDED_FRAME_BOUNDS・・・)で取得したウィンドウ高さ

のような指定をしなければならない点です。

TOP,LEFTにマイナスを指定可能なことにしばらく気がつきませんでした。。(汗。。)

このようなことが発生するのは、サイズ変更枠を持たないウィンドウ(つまり固定サイズのウィンドウ)です。