Avatar billede prodoc Nybegynder
31. december 2000 - 14:19 Der er 19 kommentarer og
1 løsning

Listbox med Transparent- eller billedbaggrund

Hejsa allesammen,
er der nogen der har et komponent hvori man kan lave en listbox der enten har en Transparent baggrund eller sådan at man bare kan indsæte et billede som baggrund!!!!!

Godt Nytår!!!
Avatar billede ultik Nybegynder
31. december 2000 - 15:29 #1
i det sidste spørgsmål var der noget med den gennemsigtige, måske det følgende er løsningen

Lav en komponent der er
type
  TCTHRUListBox = class(TListBox)
    public :
      procedure Draw(); override;
  end;

procedure TCHTRUListbox.Draw()
begin
  // indsæt koden her
  TCHTRUListBox.Brush....
  inherited(Draw);
end;

end.

Er det ikke noget i den dur der skal til ?
Avatar billede borrisholt Novice
02. januar 2001 - 10:53 #2
Jeg har her en transperent Memo .. Den må du kunne få ideer fra til din ListBox :

unit TransparentMemo;

{$R-}
interface
uses Messages, Controls, StdCtrls,classes;
const TMWM__SpecialInvalidate=WM_USER+1111;
type
  TTransparentMemo = class(TMemo)
  private
    procedure SpecialInvalidate(var Message:TMessage); message TMWM__SpecialInvalidate;
    procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
    procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
    procedure WMSetText(var Message:TWMSetText); message WM_SETTEXT;
    procedure CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT); message
CN_CTLCOLOREDIT;
    procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
constructor Create(AOwner: TComponent); override;
  end;
procedure Register;
implementation
uses Windows;
{ TTransparentMemo }
procedure TTransparentMemo.WMHScroll(var Message: TWMHScroll);
begin
  inherited;
  PostMessage(Handle,TMWM__SpecialInvalidate,0,0);
end;
procedure TTransparentMemo.WMVScroll(var Message: TWMVScroll);
begin
  SendMessage(Handle,TMWM__SpecialInvalidate,0,0);
  inherited;
  PostMessage(Handle,TMWM__SpecialInvalidate,0,0);
end;
procedure TTransparentMemo.CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT);
begin
  with Message do
    begin
      SetBkMode(ChildDC,TRANSPARENT);
      Result:=GetStockObject(HOLLOW_BRUSH)
    end
end;
procedure TTransparentMemo.WMSetText(var Message:TWMSetText);
begin
  inherited;
  if not (csDesigning in ComponentState) then
    PostMessage(Handle,TMWM__SpecialInvalidate,0,0)
end;
procedure TTransparentMemo.SpecialInvalidate(var Message:TMessage);
var r:TRect;
begin
  if Parent<>nil then
    begin
      r:=ClientRect;
      r.TopLeft:=Parent.ScreenToClient(ClientToScreen(r.TopLeft));
      r.BottomRight:=Parent.ScreenToClient(ClientToScreen(r.BottomRight));
      InvalidateRect(Parent.Handle,@r,true);
      RedrawWindow(Handle,nil,0,RDW_FRAME+RDW_INVALIDATE)
    end;
end;
procedure TTransparentMemo.WMKeyDown(var Message: TWMKeyDown);
begin
  SendMessage(Handle,TMWM__SpecialInvalidate,0,0);
  inherited;
  PostMessage(Handle,TMWM__SpecialInvalidate,0,0);
end;
procedure TTransparentMemo.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
  Message.Result:=1
end;

constructor TTransparentMemo.Create(AOwner: TComponent);
begin
inherited;
ControlStyle:=[csCaptureMouse, csDesignInteractive,
csClickEvents,  csSetCaption, csOpaque, csDoubleClicks,
  csReplicatable, csNoStdEvents];
end;

procedure TTransparentMemo.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
      ExStyle:=ExStyle or WS_EX_TRANSPARENT and not WS_EX_WINDOWEDGE
            and not WS_EX_STATICEDGE and not WS_EX_DLGMODALFRAME and not
          WS_EX_CLIENTEDGE;
  end;
end;
procedure Register;
begin
  RegisterComponents(\'Samples\', [tTransparentMemo]);
end;

end.





Jens B
Avatar billede borrisholt Novice
02. januar 2001 - 11:00 #3
prøv den her :

unit Unit2;

interface
uses Messages, Controls, StdCtrls,classes;

const TMWM__SpecialInvalidate=WM_USER+1111;

type
  TTransparentListBox = class(TListBox)
  private
    procedure SpecialInvalidate(var Message:TMessage); message TMWM__SpecialInvalidate;
    procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
    procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
    procedure WMSetText(var Message:TWMSetText); message WM_SETTEXT;
    procedure CNCTLCOLORLISTBOX(var Message:TWMCTLCOLORLISTBOX); message CN_CTLCOLORLISTBOX;
    procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
constructor Create(AOwner: TComponent); override;
  end;
procedure Register;
implementation
uses Windows;
{ TTransparentListBox }
procedure TTransparentListBox.WMHScroll(var Message: TWMHScroll);
begin
  inherited;
  PostMessage(Handle,TMWM__SpecialInvalidate,0,0);
end;
procedure TTransparentListBox.WMVScroll(var Message: TWMVScroll);
begin
  SendMessage(Handle,TMWM__SpecialInvalidate,0,0);
  inherited;
  PostMessage(Handle,TMWM__SpecialInvalidate,0,0);
end;

procedure TTransparentListBox.CNCTLCOLORLISTBOX(var Message:TWMCTLCOLORLISTBOX);
begin
  with Message do
    begin
      SetBkMode(ChildDC,TRANSPARENT);
      Result:=GetStockObject(HOLLOW_BRUSH)
    end
end;
procedure TTransparentListBox.WMSetText(var Message:TWMSetText);
begin
  inherited;
  if not (csDesigning in ComponentState) then
    PostMessage(Handle,TMWM__SpecialInvalidate,0,0)
end;
procedure TTransparentListBox.SpecialInvalidate(var Message:TMessage);
var r:TRect;
begin
  if Parent<>nil then
    begin
      r:=ClientRect;
      r.TopLeft:=Parent.ScreenToClient(ClientToScreen(r.TopLeft));
      r.BottomRight:=Parent.ScreenToClient(ClientToScreen(r.BottomRight));
      InvalidateRect(Parent.Handle,@r,true);
      RedrawWindow(Handle,nil,0,RDW_FRAME+RDW_INVALIDATE)
    end;
end;
procedure TTransparentListBox.WMKeyDown(var Message: TWMKeyDown);
begin
  SendMessage(Handle,TMWM__SpecialInvalidate,0,0);
  inherited;
  PostMessage(Handle,TMWM__SpecialInvalidate,0,0);
end;
procedure TTransparentListBox.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
  Message.Result:=1
end;

constructor TTransparentListBox.Create(AOwner: TComponent);
begin
inherited;
ControlStyle:=[csCaptureMouse, csDesignInteractive,
csClickEvents,  csSetCaption, csOpaque, csDoubleClicks,
  csReplicatable, csNoStdEvents];
end;

procedure TTransparentListBox.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
      ExStyle:=ExStyle or WS_EX_TRANSPARENT and not WS_EX_WINDOWEDGE
            and not WS_EX_STATICEDGE and not WS_EX_DLGMODALFRAME and not
          WS_EX_CLIENTEDGE;
  end;
end;

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

end.

Jens B
Avatar billede prodoc Nybegynder
02. januar 2001 - 19:45 #4
Ømmm nu er det ikke fordi jeg er kvart så god som jer til Delphi ;)
Så ville I ikke klippe det ud i pap til mig.... Eller endnu bedre har I ikke et komponent som kan lave en transparent Listbox (Jeg er villig til at sætte points op hvis I kan finde et til mig.....) ;)

godt nytår!
Avatar billede ultik Nybegynder
02. januar 2001 - 21:45 #5
kopier ovenstående ind i en tom unit og tryk CTRL + F9 for at kompilere
Avatar billede ultik Nybegynder
02. januar 2001 - 21:47 #6
derefter installerer du outputtet som en komponent, eller direkte fra pas filen, så skal den bare kompileres der
Avatar billede prodoc Nybegynder
03. januar 2001 - 14:25 #7
Jamen når jeg skriver koden ind i en unit skriver den:
\"Error in module Unit1 Declaration of class Form1 is missing or incorrect\" ???

Men Hey gider du ikke sende det til mig på pro_doctor@hotmail.com så når jeg har modtaget det og det virker ;) så giver jeg dig bare de points (Det lover jeg - Delphi sikkert! ;) )

Avatar billede borrisholt Novice
03. januar 2001 - 14:35 #8
nu har jeg sendt den til dig ....

Jens B
Avatar billede ultik Nybegynder
03. januar 2001 - 16:06 #9
hmm, du har lavet en ny applikation..... du skal sådan set bare close all, og så trykke new.. og vælge unit
Avatar billede prodoc Nybegynder
05. januar 2001 - 20:05 #10
Jamen Den unit kan man jo ikke se (SHIFT F12) ? og den unit du sendte borrisholt var i transparent! ???
Avatar billede borrisholt Novice
08. januar 2001 - 08:21 #11
Den unit jeg sendte dig var ett komponent, og skal instaleres som så !

Jens B
Avatar billede prodoc Nybegynder
08. januar 2001 - 22:48 #12
BorrisHolt> Der er noget galt den siger følgende hver gang jeg prøver at installere hest.pas:
[Fatal Error] hest.pas(1): Line too long (more than 1023 characters)
Avatar billede borrisholt Novice
09. januar 2001 - 13:37 #13
prodoc >> jeg ved ikke lige hvad der er galt ... men her er en fremgangs måde der virker :

1)
  Start Delphi op
2)
  Fra menuen vælg : Component -> New Component
3)
  Udfylder dialogen såleses :

  Ancestor type : TListBox
  Class Name : TTransparentListBox
  Palette Package : Samples
  Unit file name: Lad det være som står der ..

Så klipper du koden fra mit svar den 2/01 2001 11:00:17  PÅ NÆR DEN FØRSTE LINJE !!!!!!!!

der efter vælger du fra menuen Component --> Install Component og instaleret komponentet på normal vis ....

Det virker for sure !

Jens B
Avatar billede prodoc Nybegynder
09. januar 2001 - 17:08 #14
Nu er Transparetlistbox addet til mit komponent liste.... men hvordan får jeg det til at virke?
Avatar billede borrisholt Novice
10. januar 2001 - 08:22 #15
prodoc>> Du sætter den på din form, så skulle den gerne være gennemsigtig ...

Jens B
Avatar billede borrisholt Novice
10. januar 2001 - 09:03 #16
prodoc>>  Sæt en TImage neden uner og så en Gennemsigtig listbox oven på den ...

Jens B
Avatar billede prodoc Nybegynder
10. januar 2001 - 23:54 #17
Undskyld Borrisholt jeg glemte lige at jeg havde lagt Komponentet under Samples......
Nu skal du nok endeligt få dine længe fortjente ponts....
(TAK fordi du hjalp en fatsvag DelphiprogrammørWANNABE... ;) )
Avatar billede prodoc Nybegynder
10. januar 2001 - 23:57 #18
Lige inden jeg giver dig dine points....
Kan man ikke gøre det sådan at teksten er en anden farve end sort og at der ikke er en grafisk fejl når man mar half markeret en linie??????

Avatar billede borrisholt Novice
11. januar 2001 - 08:56 #19
Jo fulstendig uden tvivl .. Det vil jeg så overlade som en passende øvelse til dig ....

ListVoxet er stikket sammen på 15 minutter, på den tid kan man ikke forvente mirakler ....


Jens B
Avatar billede prodoc Nybegynder
11. januar 2001 - 22:12 #20
OKay men det var jo det jeg bad om altså en transparent listform så her får du dine points.... (Men hvis du engang falder over sådan et komponent med listbox med baggrund el lign, så må du da gerne sige til eller maile  ;)

Mange tak for hjælpen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester