JVCLの中のJvPageListの背景色を透明にするにはどのようにしたらよろしいのでしょうか。
理由は、グラデーションをかけたコンポの上におくと統一感がなくなるからです。
えと、質問が分かりにくいので書き直します。
フォーム上にパネルが2つ重なっており、そのパネル1にボタンがあり、パネル2にメモがあります。
フォームの見た目は青のグラデーションです。
何かしらのイベント時にパネルの表示を1,2と変えているのですが、
フォームの色が青のグラデーションなので、できればパネルを透過したいと思います。
どのような方法が考えられますか。
こういうことでしょうか?
http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=16#0139.txt
返信ありがとうございます。
パネルではできそうですね。
しかしながら、JvPageListがパネルなのかも分からないので苦戦しています。
情報ありがとうございました。
JVCLとかJvPageListってなんでしょう?
ネットに公開されているコンポーネント?
リンクを張ると回答しやすいです。
たぶんhttp://cvs.jvcl.sourceforge.net/viewcvs.py/jvcl/dev/JVCL3/run/JvPageList.pas?view=markup
これだと思うけど...
本当にこのリンクのソースが元のコンポーネントなら、ふぐちゃんさんが
リンクされてるところに書いてあるのを参考にすればすぐ出来ると
思いますけど?
返信ありがとうございます。
まさにそのコンポです。
http://sourceforge.net/project/showfiles.php?group_id=45786
てっきりJVCL3って書いていたので正式名称かと勘違いしました。
すみません。
本題ですが、ふぐちゃんさんが示したリンクを参照してコンポを派生しました。
結果は見事透明になりました。
ただ、ページを作ると(TJvStandardPage)、そこは透明になりません。
どのように書けばよいのでしょうか。
JVCLとかJCLって結構有名なのね。知らなかった--;
TJvPageControlの透明化を行いましたので、ふぐちゃんさんのリンクと
見比べてください。
---
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, JvComCtrls;
type
// 透明で 背景消去を行わない コンテナウィンドウコントロール
TJvPageControlEx = class(TJvPageControl)
private
procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd);
message WM_ERASEBKGND;
protected
procedure CreateParams(var Params: TCreateParams); override;
public
constructor Create(AOwner: TComponent); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('MyTestCtrls', [TJvPageControlEx]);
end;
{ TJvPageControlEx }
constructor TJvPageControlEx.Create(AOwner: TComponent);
begin
inherited;
Width := 100; Height := 100;
// 上にコントロールが貼りつけられるようにする
ControlStyle := ControlStyle + [csAcceptsControls];
end;
procedure TJvPageControlEx.CreateParams(var Params: TCreateParams);
begin
inherited;
// 実行時は「透明」なウィンドウ
if not (csDesigning in ComponentState) then
Params.ExStyle := Params.Exstyle + WS_EX_TRANSPARENT;
end;
procedure TJvPageControlEx.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
// 実行時は背景消去をしない
if csDesigning in ComponentState then inherited;
end;
end.
bobさん、返信ありがとうございます。
JvPageListも同じようにしてコード書きました。
結果は、JvPageList事態は透明になったのですが、TJvStandardPageを作ると
(ページを作成すると)、そのページだけが表示されてしまいます。
ちなみに、当方の環境WinXP SP2+D6PだとTJvPageControlの透明化はなぜかできませんでした。
> JvPageListも同じようにしてコード書きました。
> 結果は、JvPageList事態は透明になったのですが、TJvStandardPageを作ると
> (ページを作成すると)、そのページだけが表示されてしまいます。
それはそうでしょう。
TJvStandardPageも透明化させる必要があるからです。
> WinXP SP2+D6PだとTJvPageControlの透明化はなぜかできませんでした
WinXP SP1+D7Eですが、透明化できましたよ。
bobさん、返信有り難うございます。
>TJvStandardPageも透明化させる必要があるからです。
TJvStandardPageを透明化させるには、TJvPageListを派生したユニット内に
書けばいいのでしょうか。
TJvStandardPageを派生させようとしても、一覧に表示されないため現在出来ない状態です。
>WinXP SP1+D7Eですが、透明化できましたよ。
私の書き方がおかしかったのでしょうか。
もう一度試してみます。
> TJvStandardPageを派生させようとしても、一覧に表示されないため現在出来ない状態です。
一覧ってパレットのことですよね?
別にパレットに無くても、ちゃんとusesで定義されているユニットを宣言しておけば、
出来ます。(TJvStandardPageはJvPageList.pas内で定義されています。タブン)
JvPageListを継承したJvPageListClearのコードの中にTJvStandardPageを透明化するコード(ふぐちゃんさんが示したコードそのまま)を書いたのですが、どうしてもうまくいきません。
> JvPageListを継承したJvPageListClearのコードの中にTJvStandardPageを透明化するコード
どの様に試したのか、書いてみてくださいな。
亀レスですみません。
省略。。。
TJvPageListClear = class(TJvPageList)
private
procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd);
message WM_ERASEBKGND;
protected
procedure CreateParams(var Params: TCreateParams); override;
public
constructor Create(AOwner: TComponent); override;
end;
TJvStandardPageClear = class(TJvStandardPage)
private
procedure WMEraseBkGnd(var Msg: TWMEraseBkGnd);
message WM_ERASEBKGND;
protected
procedure CreateParams(var Params: TCreateParams); override;
public
constructor Create(AOwner: TComponent); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(User, [JvPageListClear]);
end;
{ JvPageListClear}
constructor TJvPageListClear.Create(AOwner: TComponent);
begin
inherited;
// 上にコントロールが貼りつけられるようにする
ControlStyle := ControlStyle + [csAcceptsControls];
end;
procedure TJvPageListClear.CreateParams(var Params: TCreateParams);
begin
inherited;
// 実行時は「透明」なウィンドウ
if not (csDesigning in ComponentState) then
Params.ExStyle := Params.Exstyle + WS_EX_TRANSPARENT;
end;
procedure TJvPageListClear.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
// 実行時は背景消去をしない
if csDesigning in ComponentState then
inherited;
end;
//--------------------------------------------------
constructor TJvStandardPageClear.Create(AOwner: TComponent);
begin
inherited;
// 上にコントロールが貼りつけられるようにする
ControlStyle := ControlStyle + [csAcceptsControls];
end;
procedure TJvStandardPageClear.CreateParams(var Params: TCreateParams);
begin
inherited;
// 実行時は「透明」なウィンドウ
if not (csDesigning in ComponentState) then
Params.ExStyle := Params.Exstyle + WS_EX_TRANSPARENT;
end;
procedure TJvStandardPageClear.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
// 実行時は背景消去をしない
if csDesigning in ComponentState then
inherited;
end;
end.
っと、書きました。
そして、TJvPageListClearを貼り付けてNewPageを行っても、
TJvStandardPageが作成されてしまいます。
エディタで直接TJvStandardPageClearにしても、ありませんという警告がなされます。
遅くなりました。
時間がまだあまり取れないので、概要だけ。
JvPageListClear(TJvCustomPageList)のPagesプロパティとかをoverrideして、
TJvStandardPageを生成するようにすればいいと思います。
ツイート | ![]() |