Auf den Desktop zeichnen / Zeichnungen sollen bestehen bleiben
-
Sein Problem ist ja, dass er nicht nur dann neu zeichnen muss, wenn sich
etwas verändert. Sondern permanent!Sag mal veganza, wie würde man das in der eigenen dialogbasierten Anwendung
handhaben? Da wird es vermutlich genauso sein?
-
Ich will ein bestimmtes Muster (sind 20 Pixel, die von den User Eingaben abhängig sind) auf den Desktop zeichnen, dass dort dann 30 Sekunden bleibt.
Nach dem Motto:
dc.SetPixel( x , y , RGB(255,255,255)); dc.SetPixel( (x+10) , (y+10) , RGB(255,255,255)); dc.SetPixel( (y+20) , (x+20) , RGB(255,255,255)); dc.SetPixel( (z+30) , (x+30) , RGB(255,255,255)); dc.SetPixel( (x+40) , (z+40) , RGB(255,255,255)); etc.....Die grundlegende Frage, die sich mir stellt ist halt nur, wie ich diese Pixel für 30Sekunden auf dem Desktop behalte, egal ob irgendwas über meine Pixel drüberzeichnet?!?

-
Liju schrieb:
Sag mal veganza, wie würde man das in der eigenen dialogbasierten Anwendung
handhaben? Da wird es vermutlich genauso sein?da würde man es in die OnPaint() schreiben... denn diese Funktion ruft der Dialog von selbst auf wenn er mitgeteilt bekommt sich zu "aktualisieren" !!!
@Ch3cksum
mußt du unbedingt auf den Desktop zeichnen ???
wenn nicht könnte Deine Anwendung doch einfach ein "Fenster" erzeugen... das dann an eine bestimmte Position auf dem Desktop anzeigen... und darin dann die Punkte malen !!!das mit den 30 Sekunden wäre "leicht" zu realisieren wenn du in ein erzeugtes "Fenster" pinseln würdest... du könntest die Z-Order des Fensters beim erzeugen so angeben das es immer das "oberste" Fenster bleibt... dann bleibt es immer sichtbar, egal was passiert !!!
hoffe das ich jetzt keinen Denkfehler drin habe... ist schon ne Zeit lang her das ich mit C++/MFC was gemacht habe

cu veganza
-
@veganza:
Übrigens, schön dich hier mal wieder zu sehen. Ist schon ein paar Monate
her, oder

Manche User, die einem in der Anfangsphase im Bereich C++ weitergeholfen haben,
vergisst man komischerweise dann doch nicht so schnell.
-
Liju schrieb:
@veganza:
Übrigens, schön dich hier mal wieder zu sehen. Ist schon ein paar Monate
her, oder

mir ging es gesundheitlich seit Ende 2003 sehr schlecht... so das ich nur noch sehr sporadisch hier vorbeischauen konnte

jetzt geht es aber wieder "bergauf"... also werde ich auch öfters wieder hier vorbeischauen

cu veganza
-
Erst mal gute Besserung!!!
zum Vorschlag: Das wäre natürlich auch ne super Idee!!!

Müsste dann nur ein Fenster sein, was sich komplett über den Desktop legt(weil der User ja jede (X,Y) Koordinate auswählen können soll.
du könntest die Z-Order des Fensters beim erzeugen so angeben das es immer das "oberste" Fenster bleibt
Also müsste ich bei der Fenstererstellung das hier einfügen?:
SetWindowPos(//hwnd Fenster, HWND_TOP, 0, 0, //Hier Desktop Auflösung X, //Hier Desktop Auflösung Y, NULL);???
THX schonmal für die Idee!!!
Den Desktop hatte ich nur ausgewählt um mir das erzeugen eines Fensters zu sparen.^^ Aber ohne Fleiß kein Preis!

-
das mit SetWindowPos() geht "so ähnlich"... schau mal hier... nach dem lesen solltest du klarkommen

http://msdn2.microsoft.com/en-us/library/a1yzfz6d.aspxMüsste dann nur ein Fenster sein, was sich komplett über den Desktop legt(weil der User ja jede (X,Y) Koordinate auswählen können soll.
mit der GetSystemMetrics() Funktion ( MSDN für weitere Infos ) kannst du die Abmessungen/Auflösung des Desktops ermitteln.
hoffe das hilft Dir weiter

cu veganza
-
Jetzt ergibt sich ein weiteres Problem:
Den Dialog hab ich über den Resourcen Editor erzeugt (IDD_DChat - Klasse CLAYER)
void show_layer() { CLAYER *m_pmodeless = new CLAYER(); m_pmodeless->Create(CLAYER::IDD); m_pmodeless->ShowWindow(SW_SHOW); }Wenn ich jetzt diese Funktion (in .cpp Datei ausgelagert) aufrufe, wird der Dialog angezeigt, aber die gesamte graphische Oberfläche des Programms samt dem neuen Dialog friert ein (Verarbeitung geht aber weiter...)

(Den Code muss ich auslagern, damit andere Funktionen ebenfalls auf ihn zugreifen können
)Ich hoffe ich hab mein Problem einigermaßen verständlich formuliert. Woran kann das liegen?

Vielen Dank für die ganzen vorrausgehenden Ratschläge!
-
was genau meinst du mit "friert ein"... ist das so zu verstehen das du auf dem Layer-Dialog was neues "gemalt" hast, diese "Veränderung" aber nicht zu sehen ist ???
Wie malst du im Layer-Dialog ??? über die OnPaint() in der Layer-Klasse ???
du mußt einfach sobald sich etwas auf dem Layer-Dialog geändert hat ein "neuzeichnen" z.B. per Invalidate() anstoßen !!!
verschiebe mal den Layer-Dialog mit der Maus aus dem sichtbaren Desktop-Bereichs... und dann wieder zurück in den sichtbaren... dann solltest du auch die Veränderung ( neuzeichnen ) sehen !!!
cu veganza
-
Ich rufe die show_layer() Funktion aus einem Arbeitsthread auf(der solange wie das Hauptprogramm läuft im Hintergrund mitläuft).
Nach dem der Dialog angezeigt wird, arbeitet mein Arbeitsthread weiter. Es scheint so also ob der Arbeitsthread den Dialog einfriert solange er keine Aufgaben bekommt...(sowie bei blockierenden Sockets, keine Eingaben sind mehr über die graphische Oberfläche der Anwendung möglich).Gibt es irgendeine Möglichkeit den Dialog einfach nur anzuzeigen und dann so lange weiter ganz normal weiter zu arbeiten bis der User z.B. einen Button auf dem neuen Dialog anklickt?
Nach dem Motto: Zeige Dialog an... mache weiter wie bisher... User klickt z.B. auf dem neuen Button -> Aktion...
-
Habe die Lösung gefunden. Ist zwar eher "unschön" aber es funktioniert.
Ich erzeuge den Dialog einfach schon beim Start der Hauptanwendung und zeige/ verstecke ihn bei Bedarf.Danke für die Geduld mit meinen Fragen!
