UpdateLayeredWindowを2回呼ぶとクリップされる

[戻る]
KJ 2009/04/29(水) 16:27:32
お世話になっております。

サイズ100×100でUpdateLayeredWindowします。
Windowを右端に持って行き、少し消えるくらいにします。
サイズ200×200でもう一度UpdateLayeredWindowします。
すると、サイズ100×100のWindowになってしまいます。

たまにならない時もあります。
一度何かをクリアしないといけないのでしょうか?

以下のドキュメントをみてWS_EX_LAYEREDをクリアしてRedrawWindow()もやってみたので
すが、効果ありませんでした。

・Using Layered Windows
http://msdn.microsoft.com/en-us/library/ms632598(VS.85).aspx#layered_win


// コード
HDC destDC = ::GetDC(NULL);
HDC srcDC = ::CreateCompatibleDC(destDC);
::SelectObject(srcDC, hBitmap);

BLENDFUNCTION bf = {0};
bf.BlendOp = AC_SRC_OVER;
bf.SourceConstantAlpha = 255;
bf.AlphaFormat = AC_SRC_ALPHA;
POINT srcPt = {0, 0};

// size は1回目100, 100。2回目は200, 200
::UpdateLayeredWindow(m_hWnd, destDC, NULL, &size, srcDC, &srcPt, 0, &bf,
ULW_ALPHA);


・環境
XP SP3
Visual Studio 2008 SP1

gak 2009/04/30(木) 17:12:08
> サイズ200×200でもう一度UpdateLayeredWindowします。
> すると、サイズ100×100のWindowになってしまいます。
KJ さんと同環境で確認したワケで無いので断言できないが、UpdateLayeredWindow 後に

SetWindowPos(m_hWnd, NULL, 0, 0, 0, 0,
    SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_FRAMECHANGED);

とでもして Window 領域の再計算を強制してやればどうだろう。

KJ 2009/05/12(火) 23:29:48
[[解決]]
すみません、GW突入で返信が遅くなってしまいました。

UpdateLayeredWindowの前か後に、
MoveWindowかSetWindowPosで解決しました。

ありがとうございました。

古いスレッドには追加発言できません。