私は完全に透明なフォームを作成するために使用しますが、png と 32 ビット画像はフォームにブレンドされず、画像はその透過性を適切に表示しません。ここでコンセプトはわかりますが、ボタンを付けることができません。画像の背景を除いて、すべてのオブジェクトは見えません。ちなみに私のコンパイラはdelphi7とD2009です
2 に答える
Andreas Hausladen は同様の問題に出くわし、すでに解決策を実装しているようです。彼は JVCL ライブラリの TJvTransparentForm を書き直しました。
そのコンポーネントを直接使用しない場合でも、ソースを調べることである程度の洞察を得ることができます。
Andreas の記事へのリンクは次のとおりです。
PNGを使用して透明度を制御する場合は、「レイヤードウィンドウ」を調べることをお勧めします。
- SetWindowLong(Handle、GWL_EXSTYLE、GetWindowLong(Handle、GWL_EXSTYLE)またはWS_EX_LAYERED);
- UpdateLayeredWindow
これにより、PNGで許可されているように、ウィンドウ全体でさまざまな透明度を設定できます。問題は、階層化されたウィンドウのコントロールが実際には機能しないことです。これはWindowsの問題だと思います。私の解決策は、実際には大きなウィンドウを複数の小さなウィンドウに分割し、すべてのコントロールを非レイヤーウィンドウに設定することでした。これにより、さらに別の問題が発生します。これは、複数のウィンドウがあり、それらを単一のウィンドウのように移動させたいためです。解決策:ウィンドウを画面上で移動するための独自のアルゴリズムを実装し、以下を使用します。
- BeginDeferWindowPos
- DeferWindowPos
- EndDeferWindowPos
...すべてのウィンドウを一度に移動するため、ユーザーは複数のウィンドウを見ていることに気づきません。最後に、凝ったものにしたい場合は、SetWindowRgnを調べることをお勧めします。これにより、長方形ではない形状のウィンドウを作成できます。
PS:Uwe RaabeからAndreaのリンクを読んで、彼は同じテクニックを使用していますが、彼だけがそれをアクションの準備ができてパッケージ化しました!