[delphi] Een transparante TEdit

Pagina: 1
Acties:
  • 164 views sinds 30-01-2008
  • Reageer

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Ik heb een applicatie waarin ik een label nodig heb waarvan je de tekst ook kan selecteren en kopiëren naar klembord. Een TEdit lijkt dan ideaal: je haalt de border weg, stelt de hoogte goed in, zet de color op clBtnFace en maakt em readonly. Voila: een TEdit die er uitziet als een label.

Maar, met de komst van windows XP en de aan de ene kant vervloekte en aan de andere kant prachtige themes, zou de achtergrond waar een TEdit op staat weleens helemaal niet clBtnFace kunnen zijn. Wanneer de TEdit bijvoorbeeld in een PageControl zit.

Vandaar dat ik me afvroeg hoe je een TEdit transparant kunt maken, zodat je de achtergrond er dus doorheen ziet. Ik heb op torry.net al wel zo'n componentje gevonden, maar die maakt alleen de rand transparant, niet de kleur achter de tekst zelf.

Heeft iemand dit weleens gedaan? en hoe dan?

日本!🎌


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Misschien is dit helemaal niet wat je zoekt. En misschien vind je dit helemaal geen sjieke oplossing, maar waarom zou je tijdens het createn van je form niet de kleur van je edit gelijk maken aan die van zijn parent? Volgens mij ben je er dan gewoon, of mis ik hier iets van de werkwijze van de themes in XP???

My personal website


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Je mist iets :)

De achtergrond hoeft namelijk geen effen kleur te zijn, het kan ook een patroontje zijn (in het Panther theme) of een verloopje (in het default Luna theme).

Ja nee, als het een kleur was had ik dat *allang* gedaan...

日本!🎌


  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
En je kunt ook niet een eigen component maken, die inheriten van een TEdit en dan misschien de OnPaint method overriden ofzo ? (geen idee trouwens wat je in die OnPaint moet doen dan hoor :) )

Of je moet misschien eens kijken naar de mogelijkheid die windows xp biedt om forms transparant te maken (ik dacht zelf dat alleen voor forms werkte maar dat weet ik niet zeker). Misschien is er wel een api waar je een control aan kan meegeven ofzo :)

Of je moet natuurlijk helemaal van je TEdit afstappen en kijken of je diezelfde functionaliteit niet kan namaken op basis van een ander component wat wel transparant kan worden.

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Zoek eens naar LMD Controls of RXControls. Daar zitten transparante labels in.

www.fendt.com | Nikon D7100 | PS5


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

ProgrammerX schreef op 14 januari 2004 @ 01:54:
En je kunt ook niet een eigen component maken, die inheriten van een TEdit en dan misschien de OnPaint method overriden ofzo ? (geen idee trouwens wat je in die OnPaint moet doen dan hoor :) )
TEdit heeft geen OnPaint, de painting wordt door de default implementatie van de Win32 Edit control gedaan.

Het is met native Windows controls niet mogelijk om een goed functionerende edit-box te maken: hiervoor zul je een eigen component moeten schrijven of er een downloaden.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

FendtVario schreef op 14 januari 2004 @ 09:39:
Zoek eens naar LMD Controls of RXControls. Daar zitten transparante labels in.
Een transparant label is iets heel anders dan een editbox. Een label is niets anders dan een DrawText op een TCanvas (zoek de code maar na), een Edit control is een encapsulatie van een native Windows common control.

Overigens is het niet echt moeilijk om een eigen edit-control te schrijven als je even door het geemmer met variable-width fonts heen bent (kunt met paar API-calls tabel trekken van breedtes van alle karakters).

Professionele website nodig?


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

@curry684, daar heb je gelijk in, het zijn heel andere dingen. Maar een TEdit is niet bedoelt om informatie weer te geven maar om de gebruiker te mogelijkheid te geven gegevens te bewerken. Als je gegevens weer wilt geven gebruik je een label. (Mijn mening hoor).

Daarbij vind ik het een beetje raar dat je de gebruiker tekst in een label wilt laten selecteren om te kopieren. Als de tekst er gewoon uitziet als een label ziet een gebruiker niet direct dat je deze kunt selecteren (en dus kopieren). Niet echt gebruiksvriendelijk dus.

www.fendt.com | Nikon D7100 | PS5


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

_Thanatos_ schreef op 14 januari 2004 @ 00:10:
Maar, met de komst van windows XP en de aan de ene kant vervloekte en aan de andere kant prachtige themes, zou de achtergrond waar een TEdit op staat weleens helemaal niet clBtnFace kunnen zijn. Wanneer de TEdit bijvoorbeeld in een PageControl zit.
Even praktisch gesproken: wat houdt je tegen om WM_GETCOLOR te sturen naar de parent van je TEdit?
FendtVario schreef op 14 januari 2004 @ 11:13:
Daarbij vind ik het een beetje raar dat je de gebruiker tekst in een label wilt laten selecteren om te kopieren. Als de tekst er gewoon uitziet als een label ziet een gebruiker niet direct dat je deze kunt selecteren (en dus kopieren). Niet echt gebruiksvriendelijk dus.
Agreed, zet er dan of een echte editbox neer, of een button 'Copy message to clipboard' en doe vervolgens TClipboard.SetText of zoiets.

Professionele website nodig?


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Even praktisch gesproken: wat houdt je tegen om WM_GETCOLOR te sturen naar de parent van je TEdit?
WM_GETCOLOR ken ik niet, en MSDN kent em ook niet... weet je zeker dat je die bedoelt?
Agreed, zet er dan of een echte editbox neer, of een button 'Copy message to clipboard' en doe vervolgens TClipboard.SetText of zoiets.
Nee, windows doet het zelf ook, doe maar es de eigenschappen van een bestand en verschillende dingen daar kun je gewoon selecteren (en dus kopiëren naar klembord). Bovendien is het kunnen kopiëren van de tekst maar een bijzaak, dus een knop ernaast zou overdreven (en overbodig IMO) zijn.

日本!🎌


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Ik heb nog eens even rondgezocht, heb geen transparante TEdit gevonden, maar wel een transparante Memo. Ik kan je niet zeggen of het werkt maar hier is de link.

www.fendt.com | Nikon D7100 | PS5


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

_Thanatos_ schreef op 14 januari 2004 @ 13:01:
[...]

WM_GETCOLOR ken ik niet, en MSDN kent em ook niet... weet je zeker dat je die bedoelt?
Hum excuus ik zocht WM_CTLCOLOREDIT maar die doet wat anders. Die kun je overigens in principe wel in de parent afvangen om vervolgens een transparent brush terug te geven?

[ Voor 18% gewijzigd door curry684 op 14-01-2004 14:36 ]

Professionele website nodig?


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ik kan bevestingen dat de oplossing van FendtVario wel werkt, maar nog wel met wat glitches. Aangezien een TMemo voor windows gewoon een multiline edit is werkt het ook met een TEdit.

De TEdit is gebaseerd op het standaard edit control van Windows. Die is door MS nooit echt ontworpen om transparant te worden, vandaar dat het zo lastig is.

Vaak wordt gewoon geadviseerd om je eigen TEdit van de grond af te schrijven zonder gebaseerd te zijn op de windows edit. Er zijn wel 3rd party pakketen die het gelukt is, maar ik weet niet of die afleiden van de TEdit of een hele eigen vervanger gemaakt hebben.

We adore chaos because we like to restore order - M.C. Escher


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Mja, met glitches kan ik natuurlijk niet mee leven. Het geeft altijd zo'n deja-vu gevoel (zie Matrix 1) :+

Misschien dat ik het dan toch maar anders moet aanpakken als het te lastig is...

日本!🎌


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 07:34

Tomatoman

Fulltime prutser

Het wil in mijn testjes met een TEdit descendant maar niet lukken. In de volgende code wordt keurig de achtergrond van de parent overgenomen, maar daarna wordt er alsnog een wit vlak overheen gezet. Waarschijnlijk komt dat door de window subclassing.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
type
  TTransparentEdit = class(TEdit)
  private
    procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
  public
    constructor Create(AOwner: TComponent); override;
  end;

...

constructor TTransparentEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlState := ControlState + [csCustomPaint];
  ControlStyle := ControlStyle + [csParentBackground];
end;

{ De procedure WMEraseBkgnd is letterlijk uit TWinControl overgenomen,
  zodat je tenminste kunt debuggen. ThemeServices.DrawParentBackground
  wordt keurig uitgevoerd. }

procedure TTransparentEdit.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
  with ThemeServices do
  if ThemesEnabled and Assigned(Parent) then
    begin
      { Get the parent to draw its background into the control's background. }
      DrawParentBackground(Handle, Message.DC, nil, False);
    end
    else
    begin
      { Only erase background if we're not doublebuffering or painting to memory. }
      if not FDoubleBuffered or
         (TMessage(Message).wParam = TMessage(Message).lParam) then
        FillRect(Message.DC, ClientRect, Brush.Handle);
    end;

  Message.Result := 1;
end;

Een goede grap mag vrienden kosten.


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 15-05 14:44

_Thanatos_

Ja, en kaal

Topicstarter
Ik snap wat je wil doen in je control... maar volgens mij teken je op die manier juist niet de achtergrond van het "editable" gedeelte, maar alleen het stukje witte eromheen (erachter dus).

日本!🎌

Pagina: 1