Entwickler-Ecke

Multimedia / Grafik - SelectObject verhält sich seltsam


TomyN - Do 14.06.12 07:22
Titel: SelectObject verhält sich seltsam
Hi,

ich zeichne ein Auswahlrechteck in einem Canvas. Das ganze funktioniert wunderbar, wenn ich in der Routine die entsprechenden Eigenschaften von Pen und Brush setze, und dann ein Rechteck zeichne (einmal zum löschen und einmal an der neuen Position).


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
with malen.canvas do begin
  pen.mode:=      pmnotxor;
  brush.color:=   GUIAktuell.getColor(cBK);
  brush.Style:=   bsClear;
  pen.color:=     GUIAktuell.getColor(cCursor);
  pen.style:=     psdot;
  //Löschen und malen..
end;


Als guter Programmierer möchte ich da optimieren, also erzeuge ich mir beim Programmstart einen Pen und eine Brush, setze die Parameter und aktiviere sie in der Zeichenroutine

Delphi-Quelltext
1:
2:
3:
4:
5:
with malen.canvas do begin
  oldPen:=  selectObject( Handle, pMark.Handle );
  oldBrush:=selectObject( Handle, bClear.Handle );
  //Löschen und malen ...
end;


Bei der Brush funktioniert das auch, beim Pen funktioniert dann das Löschen nicht mehr, der Rest (Farbe, Style) wird aber so verwendet, daher bin ich sicher, dass es der richtige Pen ist. Das ganze ist nun nicht so tragisch, allerdings würde es mich schon interessieren, ob es da noch einen Trick gibt.

Tomy


Blup - Do 14.06.12 16:50

Ich hoffe, nach dem "Löschen und malen" gibt es auch noch jeweils ein "SelectObject" für oldPen und oldBrush ?
Bitte Quelltext wie pMark und bClear erzeugt werden.


TomyN - Do 14.06.12 19:14

Aber klar doch :-)

Zur Erzeugung:

Beim Start der Anwendung


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 pMark:=         TPen.Create;
 pMark.mode:=    pmnotxor;
 pMark.style:=   psdot;
 pMark.Width:=   1;
 bClear:=        TBrush.Create;
 bClear.Style:=  bsClear;    //Leer..


Beim Setzen der Farben (an einer anderen Stelle, da der User die Farbe ändern kann)


Delphi-Quelltext
1:
 pMark.Color:= GuiAktull.getColor(cCursor);                    


Beim Ende der Anwendung:


Delphi-Quelltext
1:
2:
if assigned(pMark) then pMark.free;
if assigned(bClear) then bClear.free;


Grüße

Tomy