Warum sollte FillRect nicht zeichnen, wenn LineTo erfolgreich ist?

8

Ich versuche die Hintergrundfarbe eines DateTimePicker , aber meine Frage hat nichts damit zu tun, was ich versuche.

Ich erhalte die WM_PAINT -Nachricht eines Fensters, lasse die Standard-Zeichnungsimplementierung passieren (d. h. die in ComCtrl.dll) und komme dann danach und schreibe darüber.

Anfangs ist mein Code einfach:

%Vor%

Ich mache nichts, und die Kontrolle malt normalerweise:

Jetzt beginnt der Spaß

Jetzt werde ich einige tatsächliche Zeichnung durchführen. Es ist nicht die Zeichnung, die ich will , aber es zeigt, dass es funktioniert. Ich werde ein criss-cross auf das Rect des Controls zeichnen:

%Vor%

Es ist ziemlich einfach:

  • Erhalte die HDC , auf die wir zurückgreifen werden
  • Holen Sie den Kunden direkt von der Kontrolle
  • Erstellen Sie einen festen roten Stift
  • Wählen Sie den Stift im DC aus
  • zeichne das Kreuz
  • stelle den alten Stift wieder her
  • lösche unseren Stift

Und es funktioniert!

Natürlich funktioniert es.

Jetzt füllen Sie das ganze rect

Ich möchte kein Kreuzchen zeichnen, ich möchte den Hintergrund füllen. Zuerst werde ich zeigen, wie ich mein Ziel mit einer schrecklichen schrecklichen Methode erreichen kann:

  

Ich werde die Breite des Steuerelements mit einem sehr dicken Stift streichen

Es ist eine schreckliche Sache zu tun, aber es hat die Tugend, tatsächlich zu arbeiten:

%Vor%

Es ist ziemlich einfach:

  • Erstellen Sie einen Stift mit 23 Pixel
  • Strich von links nach rechts über die gesamte Breite des Pickers

Und es funktioniert:

Natürlich funktioniert es!

Aber ich möchte nicht alles löschen

Ich möchte nicht alles im datetimepicker löschen, nur den "Client" -Bereich. Also stelle ich das Rect ein:

  • subtrahiere 2 Pixel von oben, links und unten
  • subtrahiere für die datetimepicker Dropdown-Schaltfläche
  • 34 Pixel vom rechten Rand

mit Codeausschnitt:

%Vor%

Und es funktioniert:

Natürlich funktioniert es!

Was ist los mit FillRect?

Ursprünglich habe ich einfach FillRect benutzt, außer dass es nur darauf besteht in weiß zu zeichnen; anstatt irgendeiner Farbe:

%Vor%

und es funktioniert nicht:

natürlich funktioniert es nicht. Es versucht, mein Leben schwer zu machen. Wenn es funktioniert, hätte ich nicht 9 Stunden damit verbringen können.

Ich habe versucht, nur die obere Hälfte des Rechtecks ​​zu füllen. um sicherzustellen, dass meine Herkunft korrekt war:

%Vor%

und es funktioniert nicht:

Natürlich funktioniert es nicht.

Warum funktioniert das nicht?

Warum funktioniert es nicht?

Bonus-Chatter

Sie können die Delphi-Styles-Engine nicht verwenden, da die Styles-Engine bei der Verwendung nicht aktiviert ist Windows-Designs (nur bei Verwendung eines benutzerdefinierten Designs).

    
Ian Boyd 08.04.2015, 15:45
quelle

1 Antwort

7
%Vor%

Sie müssen den Pinsel nicht in den Gerätekontext auswählen, da Sie ihn als Parameter übergeben. Wenn Sie es dann auswählen, weisen Sie den zurückgegebenen Wert wieder der Pinselvariablen zu und dann machen Sie FillRect mit einem schlechten Pinselargument (weshalb es angeblich nicht funktioniert).

    
Roman R. 08.04.2015, 16:11
quelle