Avatar billede zerohero Nybegynder
15. juli 2001 - 22:06 Der er 7 kommentarer og
1 løsning

wm_paint

Borrisholt viste mig en måde at tilføre canvas property til en panel. Problemet var bare at mine paneler ikke blev tegnet i opstarts proceduren. Jeg valgte derfor at tvinge proceduren gennem en TTimer og på den måde tegne mine paneler. Jeg har imellemtiden fundet ud af at hvis jeg lader min application få besked fra API\'en om en wm_paint så vil mine paneler blive tegnet fra starten (og jeg er fri for at min application skal bruge unødig resourcer). Men noget har undret mig meget:

1. Hvorfor modtager min application ikke en wm_paint besked når jeg eksempelvis flytter min application uden for skærmen og når min application har været minimeret?

2. Min application indeholder 6 paneler. Alle paneler på nær Panel1 bliver tegnet i opstarts proceduren (ellers bliver de alle tegnet ens) hvorfor?

Her et min kode:

...

var
  Form1: TForm1;
  pan01, pan02, pan03, pan04, pan05, pan06,
  skin : Tbitmap;
implementation

{$R *.DFM}

type
  Tcanvascontrol = class(Tcustomcontrol)
    property canvas;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
application.onmessage := appmessage;
end;

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if (msg.message = wm_paint) then
    begin
      //handled := true;
      formpaint(nil);
    end;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  canvas.draw(0,0,skin);                //tegner bitmap på form1

  //tegner bitmaps på mine panel\'er
  Tcanvascontrol(panel1).canvas.draw(0,0,pan01);
  Tcanvascontrol(panel2).canvas.draw(0,0,pan02);
  Tcanvascontrol(panel3).canvas.draw(0,0,pan03);
  Tcanvascontrol(panel4).canvas.draw(0,0,pan04);
  Tcanvascontrol(panel5).canvas.draw(0,0,pan05);
  Tcanvascontrol(panel6).canvas.draw(0,0,pan06);
end;

...

ZeroHero
Avatar billede easysoft_studios Nybegynder
16. juli 2001 - 02:11 #1
hey zerohero!

Jeg bliver lige nødt til at spørge hvorfor du vil tegne på dine paneler. Jeg havde nemlig selv tænkt mig at gøre det engang, men så brugte jeg bare et skide tImage i stedet, og det virker da også fint...


Jeg tror faktisk, mht. sp. 1, at man SKAL kalde en hvilken som helt re-paint eller sådan noget, for at tenge vise owner-draw componenter.

Jeg lavede engang et program hvor det var muligt at minimere, så programmet fløj ned i Tray\'en, og når man så klikkede på tray-ikonet, så popede ens program op igen (det kender du jo). Men det viste sig at man skulle kalde en procedure i Application, vist nok, får at den næste gang man valgte at minimere, gjorde det!
Så måske ligger det i det. Bare et gæt.

Jeg er nødt til at spørge i hvilken procedure du deklærere pan01..pan06. Det er vist ikke ligegyldtigt hvorhenne...


PS: ved du hvordan, bortset fra bannerklik og svare på spørgsmål der aldrig sker mere med, jeg kan få lidt extra point? Jeg er rimlig flad :<


EasySoft Studios
Avatar billede zerohero Nybegynder
16. juli 2001 - 08:43 #2
EasySoft Studios>> Grunden til at jeg har valgt Tpanel\'er er fordi at jeg med dem kan \"forme\" som jeg har lyst til. Jeg kender nemlig en smart kode som kan gøre mine Tforms og Tpanel\'er runde, trekantet eller hvad jeg nu har lyst til - og det skal jeg bruge i min applikation.

Nu er der ingen problemer med det eksempel jeg har vist da alle mine canvas funktioner ligger i FormPaint proceduren, men hvis jeg nu havde valgt at de skulle ligge i en user-defined procedure så kom problemerne...

Du har selvfølig ret at jeg kan tvinge min appliction til at blive Re-Paintet efter at den har været minimeret - men det er mere princippet jeg gerne vil vide.

Mine Tbitmaps bliver created under min initialization og bliver fri-gjort under min finalization (Jeg går ikke ud fra at det skulle have nogen påvirkelse).

Du får automatisk points hverdag af eksperten (jeg tror nok det er 5 points du får) - så du bliver nødt til væbne dig med tålmodighed.
Avatar billede martinlind Nybegynder
16. juli 2001 - 10:58 #3
Det kunne godt være et problem med tegne-rækkefølgen, uden att jeg har testet det, du gør jo det at du tegner på dine panel\'er fra din FORM, og ikke fra panelernes Paint, hvilket ville være det rigtige, også evt. lave en bitmap property på din panelcomp. i set proceduren laver du en Invalidate og i den overridet paint kalder du inherited og tegner din bitmap, og vupti så kører det, uden kode i dit project, men gemt i din panel-comp.

/Martin
Avatar billede zerohero Nybegynder
16. juli 2001 - 11:03 #4
martinlind>> det lyder ret fornuftigt, men kunne du ikke vise et eksempel?
Avatar billede zerohero Nybegynder
16. juli 2001 - 12:04 #5
martinlind>> hvordan laver jeg en bitmap property på min panelcomp?
Avatar billede martinlind Nybegynder
16. juli 2001 - 12:33 #6
Sådan :

unit BitmapPanel;

interface

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

type
  TBitmapPanel = class(TPanel)
  private
    FBitMap: TBitMap;
    procedure SetBitMap(const 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(\'MyComps\', [TBitmapPanel]);
end;

{ TBitmapPanel }

constructor TBitmapPanel.Create(AOwner: TComponent);
begin
  inherited;
  FBitMap := TBitmap.Create;
end;

destructor TBitmapPanel.Destroy;
begin
  FBitmap.Free;
  inherited;
end;

procedure TBitmapPanel.Paint;
begin
  inherited;
  // Tegn din Bitmap
end;

procedure TBitmapPanel.SetBitMap(const Value: TBitMap);
begin
  FBitMap.Assign(Value);
end;

end.
Avatar billede martinlind Nybegynder
16. juli 2001 - 12:34 #7
hvis du ikke synes det er smat med en TBitmap kan du bruge en TImage i stedet.
Avatar billede zerohero Nybegynder
16. juli 2001 - 12:38 #8
martinlind>> ok... jeg prøver med det samme
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