Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Memo TRansparente? (https://www.clubdelphi.com/foros/showthread.php?t=65279)

broly7 02-12-2009 18:36:44

Memo TRansparente?
 
Existe algún componente o alguna forma por código de hacer un memo con el fondo transaprente? Osea que se visualicen las letras y las scroll bars pero sin el fondo de color. (como un label)

Saludos.

crespopg 02-12-2009 21:25:18

respuesta a Memo transparente
 
1 Archivos Adjunto(s)
Estimado;
broly7
Aqui mi propuesta a tu pregunta.
En la Propiedad de form1.TransparentColor:=true y
despues utilizar el color blanco como el color transparente,
y opcionalmente definir el color en blanco para form1.

form1.TransparentColor:=true;
form1.TransparentColorValue:=clWhite;
form1.Color:=ClWhite;

Memo TRansparente?
--------------------------------------------------------------------------------
Existe algún componente o alguna forma por código de hacer un memo con el fondo transaprente?
Osea que se visualicen las letras y las scroll bars pero sin el fondo de color. (como un label)
Saludos.
Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
 form1.TransparentColor:=true;
 form1.TransparentColorValue:=clWhite;
 form1.Color:=ClWhite;
 form1.Memo1.Lines.LoadFromFile('ejemplo1.txt');
end;
end.

broly7 02-12-2009 23:44:57

Lo siento no sirve. Ya lo tenía como tu dices, en propiedades tengo:
Código Delphi [-]
form1.TransparentColor:=true;  
form1.TransparentColorValue:=clFuchsia; 
 form1.Color:=clFuchsia;

Entonces la form queda totalmente transparente pero le he puesto una imagen encima, y solo se ve la imagen ok?

Pero al poner el MEMO1 de color Fuchsia encima de la imagen, se me come toda la imagen quedando como en la imagen: h t t p : / /i46.tinypic.c om/2qxuy5s.png

Yo quiero que sea transparente pero que se vea la imagen de fondo. T_T

rgstuamigo 03-12-2009 15:30:03

Aqui te pongo el codigo de un componente (adaptado por mi) descendiente de TMemo que se pone trasparente cuando no tiene el foco.;).
Código Delphi [-]
unit AlphaMemo;
interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

const
  TWM_RGSInvalidate=WM_USER+1;

type
  TAlphaMemo=class(TMemo)
  private
    { Private declarations }
    procedure RgsInvalidate(var Message:TMessage); message
              TWM_RGSInvalidate;
    procedure CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT); message
              CN_CTLCOLOREDIT;
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
    procedure WMMove(var Message: TMessage); message WM_MOVE;

  protected
    { Protected declarations }
    FTransparent: boolean;
    procedure CreateWnd; override;
    procedure CreateParams(var Params: TCreateParams); override;
    procedure DoExit; override;
    procedure DoEnter; override;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    procedure Invalidate; override;

  published
    { Published declarations }
  end;

procedure Register;

implementation

constructor TAlphaMemo.Create(AOwner:TComponent);
begin
inherited create(AOwner);
   ftransparent:=true;
end;

procedure TAlphaMemo.CreateWnd;
begin
inherited CreateWnd;
   if fTransparent then
      begin
       SetWindowLong(Parent.Handle, GWL_STYLE,
       GetWindowLong(Parent.Handle, GWL_STYLE) and not WS_CLIPCHILDREN);
       end;
end;

procedure TAlphaMemo.RgsInvalidate(var Message:TMessage);
var r:TRect;
begin
  if (Parent<>nil) and FTransparent then
    begin
      r:=ClientRect;
      r.TopLeft:=Parent.ScreenToClient(ClientToScreen(r.TopLeft));
      r.BottomRight:=Parent.ScreenToClient(ClientToScreen(r.BottomRight));
      RedrawWindow(Handle,nil,0,RDW_FRAME+RDW_INVALIDATE);
    end;
end;

procedure TAlphaMemo.CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT);
begin
  if FTransparent then
   with Message do
    begin
      SetBkMode(ChildDC,Windows.TRANSPARENT);
      Result:=GetStockObject(HOLLOW_BRUSH)
    end
   else inherited;
end;



procedure TAlphaMemo.WMEraseBkgnd(var Message:TWMERASEBKGND);
begin
  if FTransparent and not (csDesigning in ComponentState) then
      PostMessage(Handle,TWM_RGSInvalidate,0,0)
  else inherited;
end;

procedure TAlphaMemo.WMMove(var message:TMessage);
begin
inherited;
if FTransparent then SendMessage(Handle,TWM_RGSInvalidate,0,0)
  else Invalidate;
end;

procedure TAlphaMemo.CreateParams(var Params:TCreateParams);
begin
inherited CreateParams(Params);
if (CsDesigning in ComponentState) then exit;
    with Params do
      begin
   ExStyle:=ExStyle or WS_EX_TRANSPARENT;
      end;
end;

procedure TAlphaMemo.DoExit;
begin
inherited;
   FTransparent:=true;
   SetCursor(0);
   RecreateWnd;
end;

procedure TAlphaMemo.DoEnter;
var ExStyle,StdStyle:longint;
begin
inherited;
Ftransparent:=False;
StdStyle:= Windows.GetWindowLong(handle, GWL_EXSTYLE);
ExStyle:= StdStyle and not WS_EX_TRANSPARENT;
Windows.SetWindowLong(Handle, GWL_EXSTYLE, exStyle);
Invalidate;
end;

procedure TAlphaMemo.Invalidate;
begin
if FTransparent then SendMessage(Handle,TWM_RGSInvalidate,0,0)
  else inherited;
end;

procedure Register;
begin
  RegisterComponents('MyComponents', [TAlphaMemo]);
end;

end.
Solo copia y pega el codigo en una nueva unidad ,lo guardas y luego lo instalas.;)
Saludos...:)

JXJ 03-12-2009 18:24:03

broly7

¿para que se usa esa habilidad de que se ponga de ese color si no tiene el foco?

broly7 03-12-2009 19:16:21

Cita:

Empezado por JXJ (Mensaje 348097)
broly7

¿para que se usa esa habilidad de que se ponga de ese color si no tiene el foco?

No lo he entendido muy bien. Que para que quiero que se ponga transparente?
-Mi Memo estará en "Readonly" no quiero que se escriba por lo tanto no tendrá el foco, y quiero que sólo se vean las letras para "hacer del recuadro de la imagen de detrás como si fuese el recuadro de un memo".

Más o menos lo he conseguido, sabe alguien cómo se puede hacer de un memo para que lea el string de un INI tal que admita los interlieados??
Si lo probáis con Readstring, no coje el cambio de línea T_T.

rgstuamigo 07-12-2009 16:03:51

Cita:

Empezado por broly7 (Mensaje 348106)
No lo he entendido muy bien. Que para que quiero que se ponga transparente?
-Mi Memo estará en "Readonly" no quiero que se escriba por lo tanto no tendrá el foco, y quiero que sólo se vean las letras para "hacer del recuadro de la imagen de detrás como si fuese el recuadro de un memo".
.

Si va ser solo de lectura(Readonly), entonces para que usar un memo?:confused: :rolleyes: si tranquilamente lo podrias hacer en un simple Label con su propiedad WordWrap=True para que sea multilinea y su propiedad Transparent=True para que sea transparente.;)

broly7 08-12-2009 11:41:17

Porque no tiene scroll bars

Flecha 21-12-2011 10:32:29

Me parece la mar de interesante este componente, rgstuamigo. ;)

¿Sabrías indicarme si es posible que tu componente también sea transparente cuando tiene el foco? :)


Es que estoy haciéndome un programita en el que me vendría de lujo tener TMemo con líneas de diferentes colores de fondo (esto no se puede hacer ni con TMemo ni con TRichEdit).
Así que se me está ocurriendo usar tu componente transparente con un TImage detrás en el que yo pinto las líneas que quiero que se vean a través del TMemo, de manera que parezca que es el TMemo quien tiene las líneas de distinto color, ¿me explico?

Lo malo es que los TMemo que necesito sí que van a ser editables, y por lo tanto van a tener el foco. :(

Un saludo.
Muchas gracias.

Flecha 21-12-2011 11:05:19

:( Ya me respondo yo solito.

Dentro del procedure DoEnter he comentado la siguiente línea:

//Ftransparent:=False;

Y con eso ya es transparente siempre.


Peeeeeeeeeeeeeero :( al hacer scroll (ya sea con las barras de desplazamiento, o simplemente escribiendo texto, o desplándome por el TMemo con los cursores de teclado), la imágen de abajo se desplaza junto con el texto, en vez de que el texto "flote" por encima de la imágen. :(

Intentaré hacer algo a ver si logro que la imágen de debajo no siga al texto.
Si alguien avergua cómo, le agredecería que lo compartiera.

Muchas gracias.


La franja horaria es GMT +2. Ahora son las 18:31:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi