透けるパネル


deldel  2006-06-08 23:32:51  No: 22119

半透明に透けて下のコントロールが見えるパネルのコンポーネントを
どなたかご存知ないでしょうか?
下のコントロールが動いて見える際(例えば、メモが自動的にスクロール
しているなど)は、その動きも透けて見えるものが欲しいのですが・・・


動作未確認  2006-06-09 20:00:21  No: 22120

ttp://forum.nifty.com/fdelphi/samples/01026.html

とかはどうでしょう?実際の動作は何も確認してないので紹介だけ・・・


動作確認へ  2006-06-09 21:54:36  No: 22121

URL先のソースでユニット作成して動作確認してみました。

透明パネルは作成できました。

ただURL先の説明文にあるように,パネル下のコントロールは触れません。


deldel  2006-06-09 22:03:58  No: 22122

ありがとうございます。
早速試してみましたが、これは完全に透明になるようです。
パネル下のコントロールは触れなくてもいいんですが、半透明にしたいんです。

半透明は無理なのですかねぇ・・・(探しても無い;;)
例えばゲームなどで、吹き出しの背景が半透明なのがありますよねぇ。
あんなのを実現したいんですけど・・・


あー・・・  2006-06-10 00:40:18  No: 22123

半透明だったんですね。よく読んでませんでした・・・

探してみる限り今のところ見つかっていません。

ttp://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=5#0289.txt

ここらへん何かヒントないかなぁと見ているんですが,

スキル不足で何してるか・・・

他に情報持ってる人及び解決策持ってる人いないでしょうか?


アルファブレンディング機能  2006-06-10 04:06:56  No: 22124

アルファブレンディング機能
ttp://homepage1.nifty.com/ht_deko/tech001.html#tech017


ママん  2006-06-10 05:31:24  No: 22125

ちわっす。
ちゃんと調べて無いから絶対とはいえませんが、フォーム下に支配されてるコントロールは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.


deldel  2006-06-12 18:21:20  No: 22126

ママん さん、ありがとうございます。
書き忘れたのですが、D5ですのでそのままコードを試せないのですが、
見た感じ、半透明になって、Form1の描画変更も見れそうです。
ですが、Form1とForm2の間に他のアプリのウィンドウが入り込むと
まずいとか、2つのフォームにしてしまうための不具合が何かと
出てきそうですね・・・
でも、やはりこういう方法しかないのでしょうかねぇ。
OSの標準機能としてこれくらいあってもいいと思うのは私だけ?


ジャイやん  2006-06-12 19:35:04  No: 22127

>Form1とForm2の間に他のアプリのウィンドウが入り込むとまずいとか、
他のアプリの動きを監視して、Z オーダーを変更する・・

# 無理やりやなぁ(笑


ん?  2006-06-12 19:55:59  No: 22128

> ですが、Form1とForm2の間に他のアプリのウィンドウが入り込むと
> まずいとか、2つのフォームにしてしまうための不具合が何かと
> 出てきそうですね・・・
Form2.Parent := Form1
で、いいんじゃないんですか?

今でこそTFrameがありますけど、ソレを知らなかった頃、これでフォームを
合体させたことがあります。
今でも運用で使っているので、別に問題はないかと。


deldel  2006-06-12 20:13:31  No: 22129

ん?さん、
D5ですけど、Form2.Parent := Form1 をやったとたん、
Form2の透明状態が解除されるのです;;
Frameがありましたね・・・ちょっと試して見ます。


deldel  2006-06-12 20:24:05  No: 22130

Frameは透明になりませんねぇ・・・


ん?  2006-06-12 22:01:11  No: 22131

> D5ですけど、Form2.Parent := Form1 をやったとたん、
> Form2の透明状態が解除されるのです;;
あらま、それは失礼しました。


Mr.XRAY  URL  2006-06-13 06:23:48  No: 22132

ヒントだけですが。
まず、コンポーネントにしないとかなり無理があります。

TPanelなどから派生したコンポーネント(例えばボタン等)に画像を
表示するには、Paintメソッド(またはWM_PAINT)を実装し、そこに
画像(イメージ)を描画します。これはビットマップです。

このビットマップを描画する時にアルファブレンドという手法を用いる
と透明度を変化させることができます。
(既にレスがありますが...)

ネット上をいろいろ検索してみて下さい。
手前味噌ですが、私のサイトのリンクのページにもいろいろ参考になる
サイトへのリンクがあります。
TPanelにこだわらなければTLabelの方がコーディングが少しは楽にな
る可能性があります(透明化が少しは簡単)。

http://homepage2.nifty.com/Mr_XRAY/Others/AlphaBlend.htm
例えばこんなのができるかも知れません。


Mr.XRAY  URL  2006-06-13 06:41:08  No: 22133

>パネルのコンポーネントをどなたかご存知ないでしょうか?

ということは、既にDelphian Worldは探したと思いますが、私の記憶では
そんな感じのコンポーネントがあったのでは...
(探す気力はありませんので、あしからず)


えーと  2006-06-13 09:24:54  No: 22134

子ウィンドウでは、下のコンポの更新が見えるようにすることには無理があると思いますが。


deldel  2006-06-15 01:51:11  No: 22135

Mr.XRAYさん、ありがとうございます。
探したのですが、透明なパネルや、半透明なラベルなどならあったのですが、
半透明なパネルは見つかりませんでした。

「アルファブレンディング機能」さんのリンク先のコードでは、フォームは
半透明にできますが、パネルはできません。詳しいことはさっぱり分かって
ないのですが、ハンドルを持つウィンドウに対しては、みんな同じように
半透明に出来るようにすればいいのに(>MS)と、思うのですが、
何故なんでしょうかねぇ?


ふんだりけったり  2006-06-15 02:16:09  No: 22136

> 詳しいことはさっぱり分かって
> ないのですが、ハンドルを持つウィンドウに対しては、みんな同じように
> 半透明に出来るようにすればいいのに(>MS)と、思うのですが、
> 何故なんでしょうかねぇ?

パネルは、VCL内部で枠(凹凸)やCaptionを描画しているからです。
Paintメソッドをoverrideして、ごしごし書いているんです。

Delphian Worldの半透明ラベル等を参考に、半透明パネルでもつくるしかないでしょうね。

難しそうです。


きゃら  2006-06-19 05:24:29  No: 22137

これが参考になるかもしれません。

[ビットマップを半透明で描画する]
http://forum.nifty.com/fdelphi/samples/00827.html

これに背景画像とフキダシ画像を渡すことで
ゲームのフキダシみたいのができました。
ただ背景に動きがあった場合、再描画する必要がありますが。


ちらつき防止隊員  2006-07-25 01:41:29  No: 22138

>ということは、既にDelphian Worldは探したと思いますが、私の記憶では

確かフォーム上にフォームを表示できるようにするコンポーネントがあったような気がするのですが,それを使って子フォームのalphaプロパティを下げればできるのかな?試してないっすけど・・・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加