[2 days left] What’s wrong with your cloud strategy? Learn why multicloud solutions matter with Nimble Storage.Register Now

x
?
Solved

TLabel : Semi Transparent

Posted on 1998-08-25
14
Medium Priority
?
654 Views
Last Modified: 2010-04-04
How to make semi transparent of label ?
0
Comment
Question by:joely
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
  • 3
  • +3
14 Comments
 
LVL 5

Expert Comment

by:JimBob091197
ID: 1337749
A TLabel has a "Transparent" property.

What do you mean by "semi" transparent?

JB
0
 
LVL 5

Expert Comment

by:JimBob091197
ID: 1337750
Maybe older versions of Delphi don't have the Transparent property???  In that case, you can write onto any canvas without erasing the background as follows:

    SetBkMode(ACanvas.Handle, TRANSPARENT);
    ACanvas.TextOut(2, 2, 'This is transparent text.');
    SetBkMode(ACanvas.Handle, OPAQUE);

Regards,
JB
0
 
LVL 4

Expert Comment

by:erajoj
ID: 1337751
Do you want semitransparent text or background or both?

Either way you will have to work with an intermediate bitmap and some pixel-twiddling...

/// John
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 1

Expert Comment

by:nrobin
ID: 1337752
if its a component, then this will work (should).

ControlStyle := ControlStyle - [csOpaque];
0
 

Expert Comment

by:xl081198
ID: 1337753
I think JimBob's answer is OK
0
 

Author Comment

by:joely
ID: 1337754
Thank you for your comment.

I want try to explain about "semi" transparent.
If I have a background (using TImage) and I put a label (the color property filled with black color) in the front of TImage.
If Transparent property is True so the black color will lost.
"Semi" I mean, we are still look the background through a label but the black color not lost.
I give the example if we want to shutdown Windows or if you know Eidos's Championship Manager (Soccer Games Strategy).

Thank you.
0
 
LVL 4

Expert Comment

by:erajoj
ID: 1337755
Do you simply want dithering or true semitransparence?
When Windows shuts down it uses $AA$55 dithering.

/// John

0
 
LVL 4

Expert Comment

by:erajoj
ID: 1337756
Note: true semitransparence looks best in hi- to true-color modes and can be difficult to achieve in 16-32768 color modes.
Dithering can be made quite goodlooking in any mode (2-48 bit).

/// John
0
 

Accepted Solution

by:
clopez earned 400 total points
ID: 1337757
It is slow, but it works. Just redefine the paint function and set trasparent to true.

You could also us TCustomLabel and hide the trasparent property.

If you want to use a mask, instead of dithering, then it will be faster using MaskBlt.

unit STLabel;

interface

uses
  Windows, Classes, StdCtrls;

type
  TSTLabel = class(TLabel)
  protected
    procedure Paint; Override;
  public
    constructor Create(AOwner:TComponent); override;
  end;

procedure Register;

implementation

constructor TSTLabel.Create(AOwner:TComponent);
begin
   inherited Create(AOwner);
   Transparent:=True;
end;

procedure TSTLabel.Paint;
var x,y:integer;
    r,g,b:Integer;
    r1,g1,b1:Integer;
begin
  R1:=GetRValue(Color);
  G1:=GetGValue(Color);
  B1:=GetBValue(Color);
  for x:=0 to Width do
     for y:=0 to Height do
     begin
        R:=GetRValue(Canvas.Pixels[x,y]);
        G:=GetGValue(Canvas.Pixels[x,y]);
        B:=GetBValue(Canvas.Pixels[x,y]);
        R:=(R+R1) div 2;
        G:=(G+G1) div 2;
        B:=(B+B1) div 2;
        Canvas.Pixels[x,y]:=RGB(R,G,B);
     end;
  inherited;
end;

procedure Register;
begin
  RegisterComponents('Samples', [TSTLabel]);
end;

end.
0
 
LVL 4

Expert Comment

by:erajoj
ID: 1337758
Quite a good solution. Terribly slow though.
If you, joely, confirm this to be the semitransparence you're looking for, I might just send you some pointers on how to make it faster.

/// John

0
 

Author Comment

by:joely
ID: 1337759
How to make it faster ?
0
 

Expert Comment

by:clopez
ID: 1337760
Sorry it took me so long.

I didn't remember the quick way last night.  This is the fast method (Windows API).  The effect property doesn't nee to be published, but it gives the component a lot more usability.

Try this instead:

unit STLabel;

interface

uses
  Windows, Classes, StdCtrls;

type

   TEffect=(teBlackness,teDSTInvert,teMergeCopy,teMergePaint,teNotSRCCopy,
      teNotSRCErase,tePATCopy,tePATInvert,tePATPaint,teSRCAnd,teSRCCopy,
      teSRCErase,teSRCInvert,teSRCPaint,teWhiteness);

  TSTLabel = class(TLabel)
  private
    fEffect:TEffect;
  protected
    procedure Paint; Override;
    procedure SetEffect(Value:TEffect);
  public
    constructor Create(AOwner:TComponent); override;
  published
    property Effect:TEffect read fEffect write SetEffect;
  end;

procedure Register;

implementation

uses Graphics;

const Effects:array[TEffect] of Integer=(BLACKNESS,DSTINVERT,MERGECOPY,
         MERGEPAINT,NOTSRCCOPY,NOTSRCERASE,PATCOPY,PATINVERT,PATPAINT,
         SRCAND,SRCCOPY,SRCERASE,SRCINVERT,SRCPAINT,WHITENESS);

constructor TSTLabel.Create(AOwner:TComponent);
begin
   inherited Create(AOwner);
   Transparent:=True;
   fEffect:=teSRCPaint;
end;

procedure TSTLabel.Paint;
var Bmp1:TBitmap;
begin
  Bmp1:=TBitmap.Create;
  Bmp1.width:=Width;
  Bmp1.Height:=Height;
  Bmp1.Canvas.Brush.Style:=bsSolid;
  Bmp1.Canvas.Brush.Color:=Color;
  Bmp1.Canvas.FillRect(Rect(0,0,Width,Height));
  BitBLT(Bmp1.Canvas.Handle,0,0,Width,Height,Canvas.Handle,0,0,Effects[fEffect]);
  Canvas.Draw(0,0,Bmp1);
  inherited;
end;

procedure TSTLabel.SetEffect(Value:TEffect);
begin
   if fEffect<>Value then
   begin
      fEffect:=Value;
      Refresh;
   end;
end;

procedure Register;
begin
  RegisterComponents('Samples', [TSTLabel]);
end;

end.
0
 

Author Comment

by:joely
ID: 1337761
1. Effect property with teSRCPaint is not working for black    color. Why is that?
2. How to reduce color intensity (using teSRCPaint because I       think this effect better than the other, espesially for red      and blue color). What I mean is this component will be more      transparent so the background will be more visible.
0
 

Expert Comment

by:clopez
ID: 1337762
Hi joley

1.- The component is doing an or function and black is 0.  Try using SRCAND and an almost white instead;

2.- Change the color.  What you do using SRCPAINT is to increase a particular color.  If you choose clRed (That's RGB (255,0,0))  It will look red.  Try the color RGB(216,0,0) or even lower.  For Delphi clRed is $000000FF, clGreen id $0000FF00 and clBlue is $00FF0000.


Ok, here you can find what Delphi says the effects do:

Value      Description
BLACKNESS      Fills the destination rectangle using the color associated with index 0 in the physical palette. (This color is black for the default physical palette.)

DSTINVERT      Inverts the destination rectangle.

MERGECOPY      Merges the colors of the source rectangle with the specified pattern by using the Boolean AND operator.

MERGEPAINT      Merges the colors of the inverted source rectangle with the colors of the destination rectangle by using the Boolean OR operator.

NOTSRCCOPY      Copies the inverted source rectangle to the destination.

NOTSRCERASE      Combines the colors of the source and destination rectangles by using the Boolean OR operator and then inverts the resultant color.

PATCOPY      Copies the specified pattern into the destination bitmap.

PATINVERT      Combines the colors of the specified pattern with the colors of the destination rectangle by using the Boolean XOR operator.

PATPAINT      Combines the colors of the pattern with the colors of the inverted source rectangle by using the Boolean OR operator. The result of this operation is combined with the colors of the destination rectangle by using the Boolean OR operator.

SRCAND      Combines the colors of the source and destination rectangles by using the Boolean AND operator.

SRCCOPY      Copies the source rectangle directly to the destination rectangle.

SRCERASE      Combines the inverted colors of the destination rectangle with the colors of the source rectangle by using the Boolean AND operator.

SRCINVERT      Combines the colors of the source and destination rectangles by using the Boolean XOR operator.

SRCPAINT      Combines the colors of the source and destination rectangles by using the Boolean OR operator.

WHITENESS      Fills the destination rectangle using the color associated with index 1 in the physical palette. (This color is white for the default physical palette.)
0

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…
We’ve all felt that sense of false security before—locking down external access to a database or component and feeling like we’ve done all we need to do to secure company data. But that feeling is fleeting. Attacks these days can happen in many w…
Suggested Courses

649 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question