Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 04.08.2007, 19:11 Titel: |
|
|
@dotmarkus:
Gewöhn dir doch mal bitte an, die edit-Funktion zu benutzen.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 05.08.2007, 13:49 Titel: |
|
|
Oh man die Seite hab ich garnicht gesehn xD _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 05.08.2007, 15:34 Titel: |
|
|
AndT hat Folgendes geschrieben: | Oh man die Seite hab ich garnicht gesehn xD |
zusammenhang?  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 06.08.2007, 10:11 Titel: |
|
|
hallo
csderats hat eine messagebox verwendet, die kommt ohne
get-, transplate- und dispatchmessage-schleife aus.
weiss irgendwer warum aber in meinem beispiel , mit einem normalen fenster, sendmessage in der sub nicht funktioniert?
scheint mit obengenannter schleife zu tun zu haben.
ich würde es auch gerne ohne messagboxen schaffen.
danke
m. |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 06.08.2007, 14:15 Titel: |
|
|
dotmarkus hat Folgendes geschrieben: | hallo
csderats hat eine messagebox verwendet, die kommt ohne
get-, transplate- und dispatchmessage-schleife aus.
weiss irgendwer warum aber in meinem beispiel , mit einem normalen fenster, sendmessage in der sub nicht funktioniert?
scheint mit obengenannter schleife zu tun zu haben.
ich würde es auch gerne ohne messagboxen schaffen.
danke
m. |
Du zeichnest in der Sub irgendwas in einen DC und schickst DANACH eine WM_PAINT. Damit wird alles, was Du gerade gezeichnet hast, wieder gelöscht.
Darum werden Zeichnungen immer WÄHREND der Bearbeitung der WM_PAINT erstellt. Du kannst also eine Sub, in der eine Zeichnung angefertigt wird, bei WM_PAINT aufrufen.
Abgesehen davon: Es macht keinen Sinn, eine WM_PAINT per SendMessage zu schicken. WM_PAINT löst man aus, indem man mit InvalidateRect den Fensterbereich ungültig macht. Das kannst Du tun, indem Du eine selbstdefinierte Nachricht schickst und diese bei Bedarf bearbeitets. |
|
Nach oben |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 06.08.2007, 21:22 Titel: |
|
|
Elektronix hat Folgendes geschrieben: | dotmarkus hat Folgendes geschrieben: | hallo
csderats hat eine messagebox verwendet, die kommt ohne
get-, transplate- und dispatchmessage-schleife aus.
weiss irgendwer warum aber in meinem beispiel , mit einem normalen fenster, sendmessage in der sub nicht funktioniert?
scheint mit obengenannter schleife zu tun zu haben.
ich würde es auch gerne ohne messagboxen schaffen.
danke
m. |
Du zeichnest in der Sub irgendwas in einen DC und schickst DANACH eine WM_PAINT. Damit wird alles, was Du gerade gezeichnet hast, wieder gelöscht.
Darum werden Zeichnungen immer WÄHREND der Bearbeitung der WM_PAINT erstellt. Du kannst also eine Sub, in der eine Zeichnung angefertigt wird, bei WM_PAINT aufrufen.
Abgesehen davon: Es macht keinen Sinn, eine WM_PAINT per SendMessage zu schicken. WM_PAINT löst man aus, indem man mit InvalidateRect den Fensterbereich ungültig macht. Das kannst Du tun, indem Du eine selbstdefinierte Nachricht schickst und diese bei Bedarf bearbeitets. |
jetzt hab ich diese paar zeilen hier sicher schon 15 mal gelesen und noch nicht vollständig decodiert.
sollte jemand ein praktisches beispiel haben , wäre ich sehr dankbar.
danke jedenfalls für die sehr zweckdienlichen hinweise.
achja @ csderats: dialog, du hast natürlich recht. |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 07.08.2007, 09:16 Titel: |
|
|
dotmarkus hat Folgendes geschrieben: | Elektronix hat Folgendes geschrieben: |
Du zeichnest in der Sub irgendwas in einen DC und schickst DANACH eine WM_PAINT. Damit wird alles, was Du gerade gezeichnet hast, wieder gelöscht.
Darum werden Zeichnungen immer WÄHREND der Bearbeitung der WM_PAINT erstellt. Du kannst also eine Sub, in der eine Zeichnung angefertigt wird, bei WM_PAINT aufrufen.
Abgesehen davon: Es macht keinen Sinn, eine WM_PAINT per SendMessage zu schicken. WM_PAINT löst man aus, indem man mit InvalidateRect den Fensterbereich ungültig macht. Das kannst Du tun, indem Du eine selbstdefinierte Nachricht schickst und diese bei Bedarf bearbeitets. |
jetzt hab ich diese paar zeilen hier sicher schon 15 mal gelesen und noch nicht vollständig decodiert.
|
Du hast die Zeichenroutine einmal im Hauptprogramm und einmal in der Subroutine.
1. ist das unnötig, weil Du damit dopppelte Arbeit machst->Reesourcenverschwendung.
2. wird alles, was Du in der Sub zeichnest, im Hauptprogramm unter WM_PAINT wieder übermalt. Da Du in der Sub eine WM_PAINT an das Hauptprogramm schickts, geschieht das jedesmal beim Durchlaufen der Sub.
3. Der Wert für Counter wird in der Sub ermittelt. Hast Du überprüft, ob die Counter-Variable nach Rückkehr der Sub ins Hauptprogramm noch existiert? In der Regel werden dafür nämlich nur Kopiien angelegt, die nach Ende der Sub gelöscht werden (ist jedenfalls in C so). |
|
Nach oben |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 07.08.2007, 11:39 Titel: |
|
|
jetz ist mir klar was du meinst
schau dir mal obenstehendes beispielprogramm von csderats an
er hat den counter global deklariert. zwar hat er sowohl in der sub als auch in wmpaint die gleichen zeichenroutinen drin , jedoch sollte auch wmpaint
den wert des counters ins fenster schreiben.
witzigerweise wird nach seinen consolenmeldungen sogar wmpaint korrekt empfangen , der wert im fenster ändert sich aber dennoch nicht.
edit:
Zitat: | 3. Der Wert für Counter wird in der Sub ermittelt. Hast Du überprüft, ob die Counter-Variable nach Rückkehr der Sub ins Hauptprogramm noch existiert? In der Regel werden dafür nämlich nur Kopiien angelegt, die nach Ende der Sub gelöscht werden (ist jedenfalls in C so). |
die sub ist übrigens ein thread und läuft die ganze zeit nebenbei. das nämlich deswegen , weil das hauptprogramm ja unbedingt in der getmessageschleife hängen muss , und ein sleep oder sonst was zeitintensives in ebengenannter schleife das fenster für eine gewisse zeit ausser funktion setzen würde. |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 07.08.2007, 12:44 Titel: |
|
|
Das finde ich langsam hochinteressant
Die Variable "count" hat nicht nur im Thread sondern auch während des Empfangs von WM_PAINT den richtigen Wert, aber selbst nach Lektüre der entsprechenden Abschnitte im Petzold (jaa, ich habe ihn inzwischen auch *freu* Wobei ich jetzt auch weiß, wie man Menüs zur Laufzeit verändert) wird mir nicht klar, warum es nicht das Tut was es soll. _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 07.08.2007, 12:51 Titel: |
|
|
@csderats
Genau darauf will ich hinaus: Das Hauptprogramm greift offensichtlich nicht korrekt auf die Counter-Variable zu.
Global deklarierte Variablen werden nicht durch subs überschreiben, sondern es werden in der Sub lokale Kopiien angelegt- mit eigener Speicheradresse. Sub und Hauptprogramm greifen also auf verschiedene Speicherstellen zu.
Man muß den Counter so deklarieren, daß auch die Sub auf die Originalvariable zugreift (in C heißt das Schlüsselwort "static")- oder der Sub einen Zeiger oder eine Referenz übergeben. |
|
Nach oben |
|
 |
dotmarkus
Anmeldungsdatum: 04.08.2007 Beiträge: 14
|
Verfasst am: 07.08.2007, 20:27 Titel: |
|
|
Elektronix hat Folgendes geschrieben: | @csderats
Genau darauf will ich hinaus: Das Hauptprogramm greift offensichtlich nicht korrekt auf die Counter-Variable zu.
Global deklarierte Variablen werden nicht durch subs überschreiben, sondern es werden in der Sub lokale Kopiien angelegt- mit eigener Speicheradresse. Sub und Hauptprogramm greifen also auf verschiedene Speicherstellen zu.
Man muß den Counter so deklarieren, daß auch die Sub auf die Originalvariable zugreift (in C heißt das Schlüsselwort "static")- oder der Sub einen Zeiger oder eine Referenz übergeben. |
wenn man aber in den code von csderats schaut sieht man das er testhalber eine konsolenausgabe im hauptprogramm implementiert hat und zwar inklusive ausgabe des werts von count der dann in der konsole auch stimmt.
wie kann es sein, dass im hauptprogramm (wmpaint) count einmal falsch und einmal korrekt abgefragt wird (sogar im gleichen durchlauf)?
edit: und warum wird der wert dann doch noch ins fenster geschrieben und zwar wenn das fenster resized wird ? beim resizen des fensters wird ja auch nichts anderes gemacht als eine wmpaint gesendet. demnach müsste die wmpaint im hauptprogramm bei nachwievor laufender sub den counter-wert beim aufruf durch ein resize korrekt abfragen. |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 08.08.2007, 08:59 Titel: |
|
|
dotmarkus hat Folgendes geschrieben: |
wie kann es sein, dass im hauptprogramm (wmpaint) count einmal falsch und einmal korrekt abgefragt wird (sogar im gleichen durchlauf)?
edit: und warum wird der wert dann doch noch ins fenster geschrieben und zwar wenn das fenster resized wird ? beim resizen des fensters wird ja auch nichts anderes gemacht als eine wmpaint gesendet. demnach müsste die wmpaint im hauptprogramm bei nachwievor laufender sub den counter-wert beim aufruf durch ein resize korrekt abfragen. |
Ich hatte ja gesagt: Beschränke Dich auf die WM_PAINT im Hauptprogramm. Nutze InvalidateRect, um im Hauptprogramm eine WM_PAINT auszulösen. Von der Sub eine zu schicken, macht keinen Sinn. |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
|