Bitmap na panelu

0

Ta procedura działa prawidłowo. Jednak obrazek "rysowany" jest na formie.

  1. Jak zrobić to samo aby był rysowany na panelu,TabbedNotebook, czy innym komponencie?
  2. Jak zrobić w przypadku kiedy bitmapa jest większa od formy aby zmieściła się cała coś jak stretch w imagu?
procedure TForm1.FormPaint(Sender: TObject);
var
  Bitmap : TBitmap;
  I, J: Integer;
begin
    Bitmap := TBitmap.Create;
    Bitmap.LoadFromFile('c:\abc.bmp');

  for I := 0 to Width div Bitmap.Width do
  begin
    for J := 0 to Height div Bitmap.Height do
        Canvas.Draw(i * Bitmap.Width, J * Bitmap.Height, Bitmap);
  end;

  Bitmap.Free; 
end;
0

Ad1:

Bitmap := TBitmap.Create(Tablet);

0

Ad1:

Bitmap := TBitmap.Create(Tablet);

Oj nie działa :-(
W żaden z niżej podanych sposobów

 Bitmap := TBitmap.Create(Tpanel1);
 Bitmap := TBitmap.Create(panel1);
 Bitmap := TBitmap.Create(TTabbedNotebook1);
 Bitmap := TBitmap.Create(TabbedNotebook1);

Nie kompiluje się a powód:
Too many actual parameters

0

prawie sam sobie odpowiedziałes na drugie:

Canvas.StretchDraw(Rect(0, 0, Width, Height), Bitmapa);
0

No jasne.. ale ja guuuupii - to Canvasa trzeba położyć na parencie, a nie bitmape [glowa] .. ale i tak nie wiem jak to zrobić :(

0

prawie sam sobie odpowiedziałes na drugie:

Canvas.StretchDraw(Rect(0, 0, Width, Height), Bitmapa);

No dobrze działa bardzo ładnie
Detox możesz troche jaśniej??

0

Hm... Może:

var
 C:TCanvas;
begin
 C:=TCanvas.Create;
 C.Handle:=GetDC(Panel1.Handle);
 C.Rectangle(10,10,20,20);
 C.Free;
0

TPanel nie ma właściwości Canvas

0

TPanel nie ma właściwości Canvas

Ma tylko ukrytą, dlatego najlepiej napisać własny komponent i nadpisać w nim prockę Paint. Oto kawałek kodu:

{...}
type
  TP = class(TPanel)
  protected
    procedure Paint; override;
  end;

{...}
procedure TP.Paint;
begin
  inherited;
  // i tu sobie rysujesz cos po panelu poprzez Canvas
end;

Albo stwórz ten komponent i zamiast w Paint rysować to dodaj obsługę zdarzenia OnPaint.

0

Ale przecież ja nie wyciągam żadnej własności Canvas z panela, tylko jego uchwyt i na tej podstawie tworze sobie tego canvasa. To działa, bo u siebie sprawdzałem.

0

Tak, ale TPanel nie posiada zdarzenia OnPaint. A masz zamiar klikać w button i żeby przemalować panel za każdym razem gdy będzie taka potrzeba? Tak czy owak musi to umieścić w OnPaint.

0

Hm... żeczywiście tak trzeba... ale zawszem ozna w OnPaint od formy :)

0

Daj Align panelu na alClient i sprawdź ;-)
Zapewniam cię, że ani razu nie wykona się OnPaint formy.

0

boże... ale masz problemy :p chyba nie chodzilo o to zeby dawac align na calej formie :p

0

Mam propozycję weźcie pustą formę umieście na niej panel i TabbedNotebook, do którego dodajcie 2 zakładki. jak się wam uda na obu narysować plik bmp moze być jpg to podajcie mi kod rozwiązanie Martox'a zamula kompilator na maksa i nie działa choć by nie wiem co a rozwiązanie pregusi działa na TabbedNotebook ale tylko na tej powierzchni gdzi sa zakładki pomija główną część roboczą a na panelu widać tylko podczas tworzenia formy a później już nie.

0

Nie działa bo widocznie nie zrobiłeś tego tak jak trzeba.
Ehh... naucz się pisać komponenty (chociażby takie proste), przyda ci się to. Tym razem zrobiłem to za ciebie, żeby ci pokazać, że działa. Zapisz sobie ten kod do pliku *.pas i zainstaluj komponent.

unit BmpPanel;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, ExtCtrls;

type
  TBmpPanel = class (TPanel)
  private
    FBitmap: TBitmap;
    procedure SetBitmap(Value: TBitmap);
  protected
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Bitmap: TBitmap read FBitmap write SetBitmap;
  end;

procedure Register;

implementation

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

{ TBmpPanel }

{------------------------------------------------------------------------------}
procedure TBmpPanel.SetBitmap(Value: TBitmap);
begin
  try
    FBitmap.Assign(Value);
    Repaint;
  except
    FBitmap := nil;
  end;
end;

{------------------------------------------------------------------------------}
procedure TBmpPanel.Paint;
var
  LeftPos: Integer;
begin
  inherited;

  with Canvas do
  begin
          if FBitmap <> nil then
             StretchDraw(Rect(1, 1, Width -1, Height -1), FBitmap);
          // narysowalismy bitmape, wiec musimy od nowa narysowac text 
          case Alignment of
               taCenter:       LeftPos := Width shr 1 - TextWidth(Caption) shr 1;
               taRightJustify: LeftPos := Width - 2 - TextWidth(Caption);
               else            LeftPos := 2;
          end;
          Brush.Style := bsClear;
          // jesli ma byc sama bitmapa to nie rysujemy tekstu
          TextOut(LeftPos, (Height - TextHeight('Z')) div 2, Caption);
  end;
end;

{------------------------------------------------------------------------------}
constructor TBmpPanel.Create(AOwner: TComponent);
begin
  inherited;
  FBitmap := TBitmap.Create;
  DoubleBuffered := True;
end;

{------------------------------------------------------------------------------}
destructor TBmpPanel.Destroy;
begin
  FBitmap.Free;
  inherited;
end;

end.

I jak nie działa jak działa :-[ tylko trzeba dobrze zrobić.

0

Czy chodzi o coś takiego?

var
 Bitmap: TBitmap;
 I, J: Integer;
 C: TCanvas;
begin
 Bitmap := TBitmap.Create;
 Bitmap.LoadFromFile('c:\abc.bmp');
 C := TCanvas.Create;
 C.Handle := GetWindowDC(Panel1.Handle);
////
 if (Bitmap.Width <= Panel1.Width) and
    (Bitmap.Height <= Panel1.Height) then
 for I := 0 to Width div Bitmap.Width do
  for J := 0 to Height div Bitmap.Height do
    C.Draw(i * Bitmap.Width, J * Bitmap.Height, Bitmap)
////
 else
  C.StretchDraw(Rect(0,0,Panel1.Width,Panel1.Height), Bitmap);
////
 Bitmap.Free;

i po prostu dodaj na TabbedNotebook TPanela i rysuj na nim :P

0

Czegoś tu nie kumam [glowa] nowy panel powinien mieć zdarzenie onPaint ale jak go zainstalowałem to nie ma takiego zdarzenia [glowa]
MrSquell - Twoje rozwiązanie działa w ten sposób, ze w momencie Tworzenia formy na moment mignie bitmapa na panelu i znika nie ma. Gdy ustawie dużą wartość bewelWidth to panel jest obrysowany tym obrazkiem ale jst to 2mm rameczka [glowa]

0

Nie ma bo nie zrobiłem tego zdarzenia!! Chciałeś rysowanie bitmapy na panelu więc pokazałem ci jak to zrobić, dostałeś gotowca, nie wiem czego ci jeszcze trzeba. Jak chcesz to sam sobie dopisz OnPaint, a jak nie to rusuj co tam sobie chcesz w procce Paint. Ale skoro nadal nie potrafisz tego wykorzystać... to ja ci już nie pomogę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1