Avatar billede w13 Novice
05. april 2007 - 17:01 Der er 4 kommentarer og
1 løsning

Gentage billed i Image-objekt (baggrund)

Hej Eksperter.

Hvordan får jeg et billed på 10x10 px til at blive gentaget i et større Image-objekt, så det fylder det ud - nærmest som en baggrund?

Håber I kan hjælpe.
W13
Avatar billede hrc Mester
05. april 2007 - 22:05 #1
Kan du ikke bare lave n antal TImage'r og placere dem ved siden af hinanden? Hvis det skal over i ét TImage bagefter, kan man så snuppe det fra det canvas hvorpå dine TImager har tegnet.
Avatar billede borrisholt Novice
09. april 2007 - 15:23 #2
1)
  Placer dit billede i en TImage (Image1) på din for, og lav den Visible := False.
2)
  Under private i interface til din form skriver du det følgende :
    procedure ClientWndProc(var Message: TMessage);
  og trykker SHIFT + CTRL + C
3)
  Så implementerer du den således :
procedure TMainFrom.ClientWndProc(var Message: TMessage);
var
  cw, ch: Integer;
  Dc, bDc: hDC;
  bCountX, bCountY: Integer;
  Bitmap: TBitmap;
  bmXsize, bmYsize: Integer;
begin
  Bitmap := Image1.Picture.Bitmap;
  bmXsize := Bitmap.Width;
  bmYsize := Bitmap.Height;

  with Message do
    case Msg of
      WM_ERASEBKGND:
        begin
          Dc := TWMEraseBkGnd(Message).dc; //Handle til den Device Context vi skal tegne på
          bDc := Bitmap.Canvas.Handle; //Handle til den Device Context som vi skal kopiere fra.

          bCountX := Width div bmXsize; // bCountX = Antal hele gange vores bitmap kan være i breden.
          bCountY := Height div bmysize; // bCounty = Antal hele  gange vores bitmap kan være i højden.

          for cw := 0 to bCountX do
            for ch := 0 to bCountY do
              BitBlt(DC, cw * bmXsize, ch * bmYsize, bmXsize, bmYsize, bDC, 0, 0, SRCCOPY); //Tegn vores bitmap flere gange på formen
          Result := 1;
        end;
    else
      Result := CallWindowProc(FPrevClientProc, ClientHandle, Msg, wParam, lParam);
    end;
end;


Jens B
Avatar billede hrc Mester
10. april 2007 - 09:16 #3
borrisholt: Nu subklasser jeg ikke tit og jeg kan ikke få dit eksempel til at virke:

Har indsat denne da den vist manglede:

procedure TMainFrom.CreateWnd;
begin
  inherited;
  fNewClientProc := MakeObjectInstance(ClientWndProc);
  fPrevClientProc := pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
  SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(fNewClientProc));
end;
Avatar billede w13 Novice
22. april 2007 - 16:51 #4
Har valgt din løsning, Borrisholt. Hvis du lige opretter svar, så skal du få point.
Avatar billede borrisholt Novice
23. april 2007 - 09:58 #5
Svar
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