2009-08-28 3 views
12

TPinkControlでTLinkLabelを使用しようとしていますが、親の背景を使用する方法が見つかりません。TPinkControlのTLinkLabelの背景

// Image removed because the website doesn't exist any more 
// and I can't find it anywhere... Sorry. 

ご覧のとおり、親タブシートの美しいグラデーションはリンクテキストの後ろには保存されません。

フローティングブロック(TLinkLabelが提供する機能)に複数のリンクを設定する機能をご希望の場合は、のテキストの背後に親の背景が表示されます。

TLinkLabelにはParentBackgroundプロパティがありません。私は無用にコントロールスタイルにcsParentBackgroundを追加する派生クラスを作成しようとしました:

誰でもアイデアはありますか?私は考えることができる

+0

テキストを静的にするのか、それともコンパイル時に変更するのでしょうか? – skamradt

+0

イメージのURLが壊れています。 –

+0

@アンドレアス私に教えてくれてありがとう...ありがとう、私はイメージを見つけることができたら、私はそれをもっと永久的にアップロードするだろう。 – Nat

答えて

7

Nat、TLinkLabelControlStyleに変更があります。さらに、標準のWindows静的コントロール(つまり、TLinkLabelの親)がWM_CTLCOLORSTATICメッセージを正しく処理することを確認する必要があります。

VCLは、親ウィンドウに通知として送信されるメッセージをコントロールが制御できるようにする、すばやいリダイレクトメカニズムを備えています。

type 
    TTransparentLinkLabel = class(TLinkLabel) 
    private 
    procedure CNCtlColorStatic(var AMsg: TWMCtlColorStatic); 
     message CN_CTLCOLORSTATIC; 
    public 
    constructor Create(AOwner: TComponent); override; 
    end; 

constructor TTransparentLinkLabel.Create(AOwner: TComponent); 
begin 
    inherited; 
    ControlStyle := ControlStyle - [csOpaque] + [csParentBackground]; 
end; 

procedure TTransparentLinkLabel.CNCtlColorStatic(var AMsg: TWMCtlColorStatic); 
begin 
    SetBkMode(AMsg.ChildDC, TRANSPARENT); 
    AMsg.Result := GetStockObject(NULL_BRUSH); 
end; 
+0

+1は素晴らしいソリューションのように見えますが、問題はありませんが、私が旅行しているマシンにD2006しかないのでテストできません。 RAD2009または2010でこれをテストしましたか?ナットと比較するためのスクリーンショット? – Argalatyr

+0

http://img340.imageshack.us/img340/5849/tranparentlinklabel2.png - Delphi 2009でスクリーンショット(Windows XP、オリーブのカラースキーム)を試してみましょう - イラストレーションでは、2番目ごとのラベルだけが 'TTransparentLinkLabel'です。 – mghie

+0

それは答えです! :)私は金曜日に約80%を取得することができた(Rob Kennedyの「研究」に言及した記事へのコメントを参照)。ありがとうございました! – Nat

1

一つの方法は、私はこの作品の希望を

procedure AfterConstruction; override; 

procedure Form_A.AfterConstruction; 
begin 
    inherited; 
    LinkLabel1.Add(Self.Color, 'Hello World'); 
end; 

公共

を作成し、次に実装

type 
    TLinkLabelHelper = class helper for TLinkLabel 
    public 
    procedure Add(const aBGColor: TColor; const S: string); 
    end; 

procedure TLinkLabelHelper.Add(const aBGColor: TColor; const S: string); 
begin 
    Color := aBGColor; 
    Caption := S; 
end; 

下ヘルパークラスを作成することです。

+2

いいえ、テーマの背景が1つの色で塗りつぶされた領域とは異なるものになる可能性があるため、機能しません。たとえば質問のページコントロールにグラデーションの背景があります。正しい解決方法では、リンクラベルが自分自身の背景をペイントしないようにする/透過させる必要があり、親の背景が輝きます。 – mghie

+0

mghieが正しいです。背景*色*を変更したくない場合は、親コントロールの背景*テーマをラベルテキストの背後に置いてください。 – Nat

0

私の助言:簡単なTLabelを使用してください。 TLabelにはTransparentという名前のプロパティがあります。これは必要なものです。 TLabelsカーソルをcrHandPoint(AFAIRはリンクカーソル)に設定し、フォントを青い下線に設定し、Webブラウザを開いて指定されたURLにナビゲートするOnClickイベントハンドラを作成します。 デフォルトイベントハンドラを1つでも持つことができます。

procedure OnClickOnMyLinkTLabels(Sender : TObject); 
var 
    Address : string; 
begin 
    if NOT (Sender is TLabel) then Exit; 
    Address := (Sender as TLabel).Caption; 
    ShellExecute(self.WindowHandle,'open',PChar(Address),nil,nil, SW_SHOWNORMAL); 
end; 

編集

あなたのキャプション内のアドレスを持ってしたくない場合は、あなたが好きにアドレスとキャプションを取得するために、Tagプロパティを使用することができます。

procedure OnClickOnMyLinkTLabels(Sender : TObject); 
var 
    Address : string; 
begin 
    if NOT (Sender is TLabel) then Exit; 
    Address := GetAddresByTag((Sender as TLabel).Tag); 
    ShellExecute(self.WindowHandle,'open',PChar(Address),nil,nil, SW_SHOWNORMAL); 
end; 

どのようにGetAddresByTagを実装するかはあなたの選択です。最も簡単なものは、文字列の配列を使用している:人々は答えとして、サードパーティのコンポーネントを提供する際

//in your form defintion 
    private 
    FAddresses : array of string; 

function GetAddresByTag(id : integer): string; 
begin 
    if (i<Low(FAddresses)) OR (I> High(FAddresses)) then 
    raise EXception.Create('wrong id sent!'); 
    Result:= FAddresses[id]; 
end; 
+0

:)素晴らしいアイデア。しかし、私はテキストの真ん中にリンクを持っていたいと思います。私の例を少し明確にして、私が意味することを示すでしょう。 – Nat

+0

@Nat:answer extended – smok1

+0

@ smok1:ummm ...デザイン時にテキストの中にラベルを手動で配置することを提案していますか?私は実行時にテキストを設定していて、それらのリンクを持つ異なる文字列の真偽である可能性があります(Webアドレスではなく、重要です)。 – Nat

4

は、通常、私はそれを嫌い、私はあなたがしたい何のための代替としてTMS THTMLabelに言及します行う。これにはTLabelのTransparentプロパティがあり、キャプションとしてHTMLを使用できるため、例に応じて複数のリンクを行うことができます。

+0

ありがとうございました。前にそのコンポーネントを見たことがありましたが、現時点では何もドルを使っていませんでした。 :) – Nat

3

csParentBackgroundcsOpaqueのスタイルはどちらも、コントロールのコードの他の部分からの協力が必要です。ただそれらを設定するだけではあまり効果がありません。それが行われた場合、コントロールはおそらく公開のTransparentプロパティを既に持っています。

TCustomLabel.Paintを見ると、csOpaqueスタイルをどのように尊重しているかを確認できます。それはその背景を塗る前に、それはTransparentプロパティを読み取ることによって、そのスタイルをチェック:

if not Transparent then 
begin 
    Canvas.Brush.Color := Self.Color; 
    Canvas.Brush.Style := bsSolid; 
    FillRect(ClientRect); 
end; 

そのスタイルが唯一のウィンドウコントロールに影響を与えるため、csParentBackgroundスタイルはTCustomLabelには影響しません。 TCustomLabelTGraphicControlにあり、TWinControlには該当しません。

私はTLinkLabelを持っていないので、ソースコードを見て変更する必要があるかどうかを調べることはできません。 TGraphicControlの子孫の場合は、上に示したコードをTCustomLabelから含める必要があります。それがTWinControlに下った場合は、代わりにTCustomStaticTextのコードを適用します。それはもう少し複雑です。 cn_CtlColorStatic通知メッセージに対する応答としてDrawParentBackgroundを呼び出します。また、Delphiコードではペイントしません。コントロールは、Win32の "静的な"コントロールタイプのラッパーです。

TLinkLabelは明らかにその背景を無条件にペイントします。これを修正するには、Paintメソッドをオーバーライドする必要があります。 の機能を削除すると、継承されたメソッドを呼び出してすべてのテキストをペイントすることができなくなるため、仮想メソッドをオーバーライドする従来の方法とはあまり関係ありません。代わりに、基本クラスの実装をコピーして貼り付けてから、どこかの中間に条件付き部分を追加する必要があります。

+0

私はこの夜間に多くの調査を行っています...デフォルトでは、csParentBackground *を設定すると実際に何かが行われます。 WM_ERASEBACKGNDに応答してバックグラウンドを描画するテーマサービスを呼び出します(特定の設定に依存します)。これは実際に行われています...私はコントロールがそれにペイントしていると思うが、私はより多くの研究をする必要がある。私は月曜日に質問を更新する予定です(ここはオズの週末ですが、私はショーを持っています!)。 – Nat

+0

それは私がコントロールからの協力によって意味したものです - たとえ 'csParentBackground'が設定されていても、コントロールはそれをペイントしないで*協力しなければなりません。 –

-1

テキストが静的な場合は、ラベルを使用してこれを行うこともできます。リンクとして必要な単語を含むテキストブロック全体をレイアウトします。ラベルを透明に設定します。次に、リンクになる個別のラベルコンポーネント(透明に設定されている)をドロップします。色をclNavy、フォントスタイルをfsunderline、カーソルをcrHandに変更します。次に、既存のテキストの上にラベルを配置します。次に、ホットリンクを実行するための "リンク"ラベルごとにonClickハンドラを作成します。

これは最適ではありませんが、テキストを太字にしたくない場合や、テキストを同じフォントサイズに維持したい場合は機能します。もちろん、コード内のリンクラベルの位置を計算する必要があるため、ブロックが動的な場合はうまく動作しません。これは、ワードラップを使用している場合はかなり複雑です。そうでない場合は、canvas.textwidthメソッドとcanvas.textheightメソッドを使用して、リンクラベルの必要なオフセット位置を判断できます。

+0

注意:ClearTypeまたは通常のアンチエイリアシングが有効な場合、一番上のラベルは一番下のラベルのテキストを完全にカバーしません。ボトムラベルが「にじみ」して、上のテキストの色に影響します。 –

+0

不幸なことに、私の現実世界のコードでは、テキストは折り返してあり、サイズ変更可能なフォーム上にあるので、流れなければなりません...あなたの提案をありがとう。 – Nat

+0

-1これは本当に絶望的な提案です! –