Text im Window

Anfängerfragen zum Programmieren mit PureBasic.
rudolfo
Beiträge: 19
Registriert: 19.10.2008 14:52

Beitrag von rudolfo »

Ok, stimmt.
Ich will ja nicht bohren, aber kannst Du mir erklären, warum nur weiss zu sehen ist, wenn ich den window hintergrund auf weiss stelle und danach ein image überlagere, das einen schwarzen text auf einem weissen streifen hat?
Ich möchte das gerne verstehen.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Willkommen im Board.

> warum nur weiss zu sehen ist, wenn ich den window hintergrund auf weiss stelle und danach ein image überlagere, das einen schwarzen text auf einem weissen streifen hat?

zeig mal bitte den code, wie genau du das jetzt machst.
...oder meinst du deinen code von 15:20h?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
rudolfo
Beiträge: 19
Registriert: 19.10.2008 14:52

Beitrag von rudolfo »

zeig mal bitte den code, wie genau du das jetzt machst.
...oder meinst du deinen code von 15:20h?
Ja, beim ersten code wenn man den kommentar beim SetWindowColor wegmacht. Dann ist alles nur weiss, obwohl doch das image mit schwarzem Hintergrund überlagert wird.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

verstehe...

mach mal ein Delay(2000) vor die Eventschleife, dann siehst du den auf das Fenster gedrawten Text für zwei Sekunden.
danach wird in der Eventschleife anscheinend als erstes Event ein Repaint ausgeführt,
das wurde von den SetWindowColor() befehl in die Eventqueue gestellt, aber noch nicht abgearbeitet,
das stellt die Fensterfarbe wieder her und übermalt so den temporären text.

eine mit SetWindowColor() gesetzte Fensterfarbe ist permanent, also sie wird vom System bei Bedarf wiederhergestellt.

direkt auf das Fenster gedrawtes ist das nicht, das wird beim nächsten Repaint übermalt.

deswegen, wenn du wo drauf malen willst und das bestand haben soll,
musst du das wie von ts angeregt als reaktion auf das #WM_PAINT Event machen,
oder du machst es auf ein Image und stellst das in einem Gadget dar.

bei letzterem musst du das Image erneut zuweisen, wenn du den Inhalt änderst.
(also auch eine Art "repaint" ausführen, aber dann eben auf eigene veranlassung)


wenn du in deinem ersten Beispielcode das #WM_PAINT Event manuell abarbeiten würdest,
nachdem du die fensterfarbe gesetzt hast bevor du drauf drawst,
dann würdest du das image über der Hintergrundfarbe sehen,
bis du mit einem anderen Fenster drüberfährst oder das Fenster aus dem Desktop bewegst.

... allerdings wäre das auch wieder pfusch, also entweder auf #WM_PAINT reagieren, oder ein Imagegadget bentzen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Das mit CreateImage erstelle Image ist mehr virtuell, also nicht sichtbar.
Sichbar wird es, wenn man es einem Output zuordnet, z.B. einem
ImageGadget, dort wirds auch automatisch neugezeichnet.
Auf einem Fenster oder Screen muß man es selber neuzeichnen, z.B. nach
einem #WM_Paint ereignis.

Wichtig wäre erstmal zu Wissen, für welchen Zweck möchtest Du etwas
malen, dann kann man auch sagen, wie man es am günstigsten Darstellt.

Den Rest, bzw. teilweise jetzt doppelt :mrgreen: hat Kaeru ja bereits gesagt.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
rudolfo
Beiträge: 19
Registriert: 19.10.2008 14:52

Beitrag von rudolfo »

Doch ich glaub jetzt hab ichs einigermassen verstanden.
Man muss immer auch berücksichtigen, wie Windows die Windows behandelt. Naja, so ein ausgefuchstes message-handling muss ich mir erst erarbeiten.
Danke für die Antworten.
Antworten