0

WS_EX_TRANSPARENTスタイルの別のウィンドウの下で1つのウィンドウが更新されると、重なり合う子ウィンドウが正しく描画されないという問題があります。

親ウィンドウには、W1とW2の2つの子があり、ZオーダーでW1がW2より上にあるのと重なっています。W1には拡張スタイルWS_EX_TRANSPARENTがあります。問題は、W2がクライアント領域でペイントする場合(私はW2を無効にしてこれをテストしています)、W2がW1のオーバーラップ部分を完全にペイントすることです。親が再描画されると、重なり合う両方の子が正しい順序で描画されます。

WS_CLIPSIBLINGSがW2に設定され、WS_EX_TRANSPARENTがW1から削除されている場合、子ウィンドウは正しく描画されます。この状況でW2のクライアント領域が無効になると、W1によって隠された部分はペイントされますが、描画されません。

WS_EX_TRANSPARENTが使用されているのは、最初の子ウィンドウが2番目の子ウィンドウのオーバーレイとして使用されているためです。オーバーレイによってマウスクリックがブロックされないようにしたいと思います。

オーバーラップするウィンドウをWS_EX_TRANSPARENTスタイルで正しく描画する方法はありますか、または何らかの回避策を使用して同じ動作を得ることができますか?

4

1 に答える 1

0

WS_EX_TRANSPARENTは不安定です。KBの記事には、「実際には透明なウィンドウはサポートされていません」というコップアウトがあります。しかし、操作を説明するものでも、SDKでも、 RaymondChenでもありません。一度噛まれすぎたのでもう使わないでください。

ただし、背景のピクセルが確実に設定されるように上部のウィンドウをペイントする必要がある場合は、オーバーレイされたウィンドウを最初にペイントするというルールがありますしたがって、W1を無効にするとW2も無効になり、通常のZオーダーペイントが処理を行います。避けられないちらつきの問題を無視します。ただし、その逆ではありません。オーバーレイされたウィンドウを無効にしても、上部のウィンドウは強制的に再描画されません。あなたの場合、ちょっとしたハングアップ。

私の推測に関係なく、うまくいくはずのあなたの場合の修正は、W2を無効にするときにW1も無効にすることです。または、W1がW2と完全に重なっている場合は、W1を無効にします。それがうまくいくことを願っています、それで頑張ってください。

于 2013-01-16T21:37:55.253 に答える