Armin,
das Repaint brachte ebenfalls keine Änderungen.
Zum anderen, ja ich dachte auch ich bin schon an Position 0,0 mit dem Image, aber trotzdem stehen, wie im Bild gezeigt, an oberster Linie und am linken Rand diese Pixel.
Ich habe jetzt mal folgendes noch getestet:
Delphi-Quellcode:
procedure TJvEdit.WMPaint(
var Msg: TWMPaint);
var
MyDC: Boolean;
ps: TPaintStruct;
NewPen, OldPen: HPEN;
Canvas: TCanvas;
begin
if Images <>
nil then
begin
if UpdateEditMargins
then
Exit;
// UpdateEditMargins called Invalidate()
MyDC := Msg.DC = 0;
if MyDC
then
Msg.DC := BeginPaint(
Handle, ps);
inherited;
inherited;
Brush.Color := clNavy;
FillRect(Msg.DC, Rect(0, 0, 16,16), Brush.Handle);
if MyDC
then
EndPaint(
Handle, ps);
end
else
inherited;
end;
D.h. ich habe das eigentliche Zeichnen des Bitmaps und sonstiges Zeug mal entfernt. Ich dachte, dass FillRect() jetzt ein Rechteck an Position 0,0 zeichnen wird, aber weit gefehlt. Es ist nach wie vor ein Rand von einem Pixel, der entweder weiß bleibt oder mit undefinierten Pixel gezeichnet wird, siehe Bild.
Es sieht irgendwie so aus als ob hier das TJvEdit oder in der Basisklasse noch etwas passiert oder evtl. sogar von der Windows
API her. Oder ich mache noch was falsch...
Nachtrag:
Es sieht irgendwie so aus, als ob diese Zeilen hier dafür verantwortlich sind:
Delphi-Quellcode:
procedure TJvEdit.WndProc(var Msg: TMessage);
begin
case Msg.Msg of
CN_CTLCOLORSTATIC,
CN_CTLCOLOREDIT:
if Images <> nil then
ExcludeClipRect(Msg.WParam, 1, 1, Images.Width + FImageMarginRight + 2, Images.Height);
end;
Genau genommen das ExcludeClipRect(Msg.wParam,
1,1...
Nur wenn ich hier ExcludeClipRect(Msg.wParam,
0,0... schreiben, dann es nicht viel besser aus, es wird jetzt zusätzlich auch der Rand des Edits überzeichnet, siehe zweites Bild 'Rand überezeichnet'