Das mache ich ja auch, ist ja inzwischen auch nicht das Problem. Und ich muß zugeben, dass ich damals durch harte Versuche selbst drauf gekommen bin. Zuletzt habe ich Blut gespuckt. Denn entweder hatte nie ein anderer je dieses Problem, weil das Entfernen des Rahmens so simpel ist und jeder einen angeborenen Instinkt hat es immer zuletzt zu plazieren, oder es ich weiß es nicht.
Wenn du dir aber das Beispiel 2 anguckst, dann lösche ich da vor FillRect den Rahmen. Aber auch das sehe ich nicht als das Problem an, denn Xor zeichnen verändert nicht die Eigenschaften der Pixel. Wenn also zu Anfang der Prozedur bereits ein Rahmen existiert, dann wird er spätestens nach FillRect weg sein. Xor hin, Xor her.
Wenn ich also (nach meiner Logik) am Ende der Prozedur selbst ein Xor Rahmen zeichne und das System danach wieder einen Xor Rahmen zeichnet, dann ist er weg. Somit müßte nach meinem Verständnis nach dem Ende der Prozedur wieder ein Xor Rahmen gezeichnet werden. Nur ich sehe nicht wo.
zu finden ist das hier:
Delphi-Quellcode:
unit Vcl.StdCtrls;
...
procedure TCustomListBox.CNDrawItem(
var Message: TWMDrawItem);
var
State: TOwnerDrawState;
begin
with Message.DrawItemStruct
{$IFNDEF CLR}^
{$ENDIF} do
begin
...
// unwichtiger Krams ... wenigstens für diese Betrachtung :o)
if Integer(itemID) >= 0
then
DrawItem(itemID, rcItem, State)
// <-- hier wird auch das OnDrawItem-Event ausgelöst
else
FCanvas.FillRect(rcItem);
if (odFocused
in State)
and not TStyleManager.IsCustomStyleActive
then
DrawFocusRect(hDC, rcItem);
// <-- da ist der schlimme Finger
FCanvas.Handle := 0;
end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)