半透明に透けて下のコントロールが見えるパネルのコンポーネントを
どなたかご存知ないでしょうか?
下のコントロールが動いて見える際(例えば、メモが自動的にスクロール
しているなど)は、その動きも透けて見えるものが欲しいのですが・・・
ttp://forum.nifty.com/fdelphi/samples/01026.html
とかはどうでしょう?実際の動作は何も確認してないので紹介だけ・・・
URL先のソースでユニット作成して動作確認してみました。
透明パネルは作成できました。
ただURL先の説明文にあるように,パネル下のコントロールは触れません。
ありがとうございます。
早速試してみましたが、これは完全に透明になるようです。
パネル下のコントロールは触れなくてもいいんですが、半透明にしたいんです。
半透明は無理なのですかねぇ・・・(探しても無い;;)
例えばゲームなどで、吹き出しの背景が半透明なのがありますよねぇ。
あんなのを実現したいんですけど・・・
半透明だったんですね。よく読んでませんでした・・・
探してみる限り今のところ見つかっていません。
ttp://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=5#0289.txt
ここらへん何かヒントないかなぁと見ているんですが,
スキル不足で何してるか・・・
他に情報持ってる人及び解決策持ってる人いないでしょうか?
アルファブレンディング機能
ttp://homepage1.nifty.com/ht_deko/tech001.html#tech017
ちわっす。
ちゃんと調べて無いから絶対とはいえませんが、フォーム下に支配されてるコントロールはXPの半透明化はできないと思います。
また、コントロールを貼り付けるとその下のオブジェクトの再描画はされないはずです。
というわけで、パネルっぽく見えるTFormを貼り付けるという手はどうでしょうか?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, AppEvnts;
type
TForm1 = class(TForm)
Button1: TButton;
ApplicationEvents1: TApplicationEvents;
procedure Button1Click(Sender: TObject);
procedure ApplicationEvents1Deactivate(Sender: TObject);
procedure ApplicationEvents1Activate(Sender: TObject);
private
{ Private 宣言 }
steadyFocus:Boolean;
procedure WMMove(var Msg:TMessage);message WM_MOVE;
procedure WMNCActivate(var Msg: TWMNCActivate); message WM_NCACTIVATE;
//test:TForm1;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.BorderStyle:=bsNone;
Form2.AlphaBlend:=True;
Form2.AlphaBlendValue:=100;
Form2.Color:=clRed;
Form2.FormStyle:=fsStayOnTop;
Form2.Show;
end;
procedure TForm1.WMMove(var Msg: TMessage);
var pos:TPoint;
begin
if Form2<>nil then
begin
pos:=ClientToScreen(Point(0,0));
Form2.Left:=pos.X;
Form2.Top :=pos.Y;
end;
end;
procedure TForm1.WMNCActivate(var Msg: TWMNCActivate);
begin
Msg.Active := steadyFocus;
inherited;
end;
procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
steadyFocus:=False;
SendMessage(Handle,WM_NCACTIVATE,0,0);
end;
procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
begin
steadyFocus:=True;
SendMessage(Handle,WM_NCACTIVATE,0,0);
end;
end.
ママん さん、ありがとうございます。
書き忘れたのですが、D5ですのでそのままコードを試せないのですが、
見た感じ、半透明になって、Form1の描画変更も見れそうです。
ですが、Form1とForm2の間に他のアプリのウィンドウが入り込むと
まずいとか、2つのフォームにしてしまうための不具合が何かと
出てきそうですね・・・
でも、やはりこういう方法しかないのでしょうかねぇ。
OSの標準機能としてこれくらいあってもいいと思うのは私だけ?
>Form1とForm2の間に他のアプリのウィンドウが入り込むとまずいとか、
他のアプリの動きを監視して、Z オーダーを変更する・・
# 無理やりやなぁ(笑
> ですが、Form1とForm2の間に他のアプリのウィンドウが入り込むと
> まずいとか、2つのフォームにしてしまうための不具合が何かと
> 出てきそうですね・・・
Form2.Parent := Form1
で、いいんじゃないんですか?
今でこそTFrameがありますけど、ソレを知らなかった頃、これでフォームを
合体させたことがあります。
今でも運用で使っているので、別に問題はないかと。
ん?さん、
D5ですけど、Form2.Parent := Form1 をやったとたん、
Form2の透明状態が解除されるのです;;
Frameがありましたね・・・ちょっと試して見ます。
Frameは透明になりませんねぇ・・・
> D5ですけど、Form2.Parent := Form1 をやったとたん、
> Form2の透明状態が解除されるのです;;
あらま、それは失礼しました。
ヒントだけですが。
まず、コンポーネントにしないとかなり無理があります。
TPanelなどから派生したコンポーネント(例えばボタン等)に画像を
表示するには、Paintメソッド(またはWM_PAINT)を実装し、そこに
画像(イメージ)を描画します。これはビットマップです。
このビットマップを描画する時にアルファブレンドという手法を用いる
と透明度を変化させることができます。
(既にレスがありますが...)
ネット上をいろいろ検索してみて下さい。
手前味噌ですが、私のサイトのリンクのページにもいろいろ参考になる
サイトへのリンクがあります。
TPanelにこだわらなければTLabelの方がコーディングが少しは楽にな
る可能性があります(透明化が少しは簡単)。
http://homepage2.nifty.com/Mr_XRAY/Others/AlphaBlend.htm
例えばこんなのができるかも知れません。
>パネルのコンポーネントをどなたかご存知ないでしょうか?
ということは、既にDelphian Worldは探したと思いますが、私の記憶では
そんな感じのコンポーネントがあったのでは...
(探す気力はありませんので、あしからず)
子ウィンドウでは、下のコンポの更新が見えるようにすることには無理があると思いますが。
Mr.XRAYさん、ありがとうございます。
探したのですが、透明なパネルや、半透明なラベルなどならあったのですが、
半透明なパネルは見つかりませんでした。
「アルファブレンディング機能」さんのリンク先のコードでは、フォームは
半透明にできますが、パネルはできません。詳しいことはさっぱり分かって
ないのですが、ハンドルを持つウィンドウに対しては、みんな同じように
半透明に出来るようにすればいいのに(>MS)と、思うのですが、
何故なんでしょうかねぇ?
> 詳しいことはさっぱり分かって
> ないのですが、ハンドルを持つウィンドウに対しては、みんな同じように
> 半透明に出来るようにすればいいのに(>MS)と、思うのですが、
> 何故なんでしょうかねぇ?
パネルは、VCL内部で枠(凹凸)やCaptionを描画しているからです。
Paintメソッドをoverrideして、ごしごし書いているんです。
Delphian Worldの半透明ラベル等を参考に、半透明パネルでもつくるしかないでしょうね。
難しそうです。
これが参考になるかもしれません。
[ビットマップを半透明で描画する]
http://forum.nifty.com/fdelphi/samples/00827.html
これに背景画像とフキダシ画像を渡すことで
ゲームのフキダシみたいのができました。
ただ背景に動きがあった場合、再描画する必要がありますが。
>ということは、既にDelphian Worldは探したと思いますが、私の記憶では
確かフォーム上にフォームを表示できるようにするコンポーネントがあったような気がするのですが,それを使って子フォームのalphaプロパティを下げればできるのかな?試してないっすけど・・・
ツイート | ![]() |