Titelleiste dynamisch "beschriften"
-
Hy...Ich habe zwar hier schin viele ähnlich gelagerte Themen gefunden, aber nicht so recht die Antwort auf mein spezielles Problem.
Ich habe einen Dialog zum Erfassen von Daten. Diesen nenne ich zum Erfassen sagen wir "Erfassungsdialog".
Nun möchte ich den gleichen Dialog aber auch zum Anzeigen von Daten nutzen und ihn auch so benennen. Also was weiß ich ...."Daten anzeigen"....Nun meine Frage....WIE geht das....
Habe ja in der Dialog-Klasse schon in der Methode "PreCreateWindow" nen Zeiger cs auf den "Style" des Fensters. Und dort auch schon mit lpszName probiert, ändert sich aber nix.
Also, hat wer nen Vorschlag?
Wäre echt sehr dankbar, ich weiß DASS es geht, aber leider nicht mehr wie, ist schon etwas länger her.Danke schonmal......
-
dlg.SetWindowText(_T("MeinTitel"));Ist aber eine Methode von CWnd.
-
irgendwo im Dialog
this->SetWindowText( "neuer Titel" );grüssle

zu langsam. Aber ist ja :xmas1:
-
Hy nochmal....
War erstmal Mittag essen....
Danke für die prompten Antworten!!Leider funzt keine von beiden so recht. Beide bekomm ich zwar kompiliert, aber die erste Variante bricht in nem Laufzeitfehler ab, und bei der zweite erziele ich keinen Effekt, also die Titelbeschriftung bleibt die gleiche...
Bei der Zweiten Variante würd ich gern schon noch wissen, wo GENAU die den hinkommen soll?
Denn das "this" bezieht sich auf irgend ein Objekt ? Oder?
Und gehe ich richtig in der Annahme dass der "Window Style Parameter" lpszName, den ich über des "cs.irgendwas" ansprechen kann, nicht das ist was ich suche? Zumindest gibt eine Änderung da auch keinen Effekt?!Wäre für weitere Vorschläge dankbar....
:xmas1:
-
Was für einen Laufzeitfehler bekommst du denn beim ersten Fall? Die SetWindowText kannst du nur anwenden, solange der Dialog sichtbar ist (und bei einem modalen Dialog hat das Hauptprogramm in der Zeit keine Eingriffsmöglichkeiten).
Die Variante mit dem this mußt du aus einer Methode des Dialogs heraus aufrufen - z.B. in der OnInitDialog().
-
Hm...Naja....Debug Assertion eben...
in der Winocc.dll
Beim Ersten...
Und hab die SetWindowText mit this-Variante in der OnInit, PreCreateWindow und OnCreate ausprobiert....kein Fehler, aber auch keine Änderung...
Werd wenn ich zu Hause bin noch mal in mein MFC Buch schaun...hab hier leider nurein c++ Kompendium, da steht nix drüber drin...
Aber danke....Bin trotzdem weiter offen für Vorschläge...
Dank euch....
P.S.: Wenn ich ne passable Lösung hab post ich die natürlich...
Ho Ho Ho
-
also ich hab die oben gepostete Lösung in einem eigenen Projekt getestet, und das funktioniert so.
Erstelle mal nen neuen Dialog in einem Projekt, mach nen Button drauf und in die BN_CLICKED diethis->SetWindowText( "neuer Titel" );rein. Wenn du ein UNICODE Project hast, dann:
this->SetWindowText( _T("neuer Titel") );Wüsste nicht, warum es nicht funktionieren sollte

grüssle

-
Huhu nochmal...
Natürlich funktioniert das mit nem kleinen Testprojekt auch bei mir(wie sollte es sonst anders sein...;o) ). Da poppt auch wieder dieses kleine Auswahlfenster auf wenn ich "this->..." eingebe.
Das hab ich meinem Projekt aber nich weil ich ein zwei mal kopiert habe....
Da scheintdas so zu sein, dass die IDE die Klassen und Methoden-Info nicht mehr richtig verarbeitet. Aber das is ja nicht so wichtig.
Die Frage wäre nun ob das nur bei ner Nachricht, wie eben Button Down, funktioniert, weil er da ja den Dialog eh neu "malt". Aber ich hätt es halt gern so, dass er das schon beim Erstellen des Dialogs macht...
Ich machs ma konkret.....
Der Dialog hat an und für sich den Namen "Neu erfassen"....
Und wenn ich dann im Programm auf alle anzeigen geh, und dann einen Eintrag anklick, kommt der gleiche Dialog und soll aber eben nen annern Titel haben.
Dazu lese ich zunächst die ganzen Daten in den Dialog aus der DB ein und übergebe auch den neuen Titel, etwa so:
Dlg.Titel="Was weiss ich"; (im Projekt ist das natürlich eine String Variable)Dann starte ich den Dialog mit "DoModal".... aber der alte Titel ist da. Wie du schon richtig meintest, muss ich sicher des "this->" Zeugs in die Dialog Klasse schreiben.
Ich werd ma weiter probiern.
Ist ja schon ma ne neue Erkenntnis, daß es prinzipiell so klappen muss...Mal sehen wo der Wurm hängt...
Aber nochma Danke!!!
Werd sicher jetzt öfter mal hier rein schaun....
bis morgen...
Schönen Feierabend....
-
"this-> zeug"
this zeigt immer auf den aktuellen dialog
wenn du
class bla
{
this == *bla
}class blu
{
this == *blu
}usw
um den titel zu aendern einfach in der klasse welches das fenster verwaltet das setwindowtext aufrufen, (nicht in dem parent fenster welches das fenster mit DoModal erstellt)
und auch erst aufrufen sobald das fenster fertig erstellt wurde {zb bei OnInitDialog}
-
*APPLAUS*
Es funktioniert.
Hattest vollkommen Recht, funktioniert erst wenn es in der IniDialog drinsteht. Logisch, da dann ja erst die Instanz der Klasse wirklich da ist.
Danke dafür!!! Wär ich allein nie und nimmer drauf gekomm..(oder hätt den Hammer rausgeholt...
....
Ganz großes Kino...
Vergesst alle teuren Bücher...n gutes Forum bringt echt mehr...;o)
Nu muss ich aber zum Bus flitzen.....

Man liest sich.... :xmas1:
-
Hallo zusammen,
ich bin der Neue und möchte diesen Thread gleich mal aufgreifen. Und zwar versuche ich die Titelleiste eines Dialogs in einer WM5 Applikation zu ändern, aber ohne Erfolg.
Der Dialog wird mit DoModal() erzeugt und in der Methode OnInitDialog() wird mit SetWindowText(L"Super Dialog") der Titel geändert. Aber es tut sich nichts.
Wie gesagt dass ganze läuft auf Windows Mobile 5. Kann jemand helfen?
Grüße
-
Hy...
Also ich muss einleitend sagen , dass ich nicht weiß, ob das WM5 1:1 mit der MFC programmierbar ist.
Aber bei meinem Programm ging es auch mit dem Befehl, den Du (ich darf doch Du sagen?!..;o) ), genutzt hast NICHT.
Probier mal mit
this->SetWindowText(m_Titel);
Die OnInitMethode im Dialog ist schon ok...
da steht das bei mir auch drin...Viel Erfolg....

-
DasAlteLeid schrieb:
Das hab ich meinem Projekt aber nich weil ich ein zwei mal kopiert habe....
Da scheintdas so zu sein, dass die IDE die Klassen und Methoden-Info nicht mehr richtig verarbeitet. Aber das is ja nicht so wichtig.Schau dazu mal in die FAQ.

-
this->SetWindowText geht leider auch nicht. Ist aber eh das gleiche wie ohne this.
Mir ist etwas komisches aufgefallen. Ich erstelle einen Dialog und ändere den Titel. Der bleibt allerdings gleich und ändert sich nicht. Wenn ich aus diesem Dialog einen weitere Dialog öffne und diesen wieder schließe, hat sich auf einmal der Titel vom ursprünglichen Dialog geändert. Es sieht so aus, als würde da eine Art refresh oder sowas fehlen. Hat jemand eine Idee?
-
Invalidate();

-
estartu schrieb:
Invalidate();

und direkt danach ein UpdateWindow();
ist ein Erfahrungswert, da Invalidate() ja eigentlich 'nur' löscht.
Windows: Sicher ist Sicher
grüssle

-
Invalidate();
UpdateWindow();funktionieren leider auch nicht. Habe im MSDN gelesen, dass hier nur innere Bereich eines Dialoges betroffen nicht. Der Rahmen und somit auch der Titel werde nicht aktualisiert. Hat sonst jemand eine Idee?
-
aendert sich die schrift wenn du das fenster selber verschiebst oder es in der groesser veraenderst ? {kannst ja zum test kurzzeitig auf resizable stellen}
-
Im PreCreateWindow( gibts das im WM5??? ) dann noch:
cs.style &= ~FWS_ADDTOTITLE;oder heisst das da anders?
grüssle

-
Mr Evil schrieb:
aendert sich die schrift wenn du das fenster selber verschiebst oder es in der groesser veraenderst ? {kannst ja zum test kurzzeitig auf resizable stellen}
Leider gibt es in der Applikation nur Modale Fullscreen Dialoge. Sogar das Hauptfenster ist von dieser Sorte. Und so auf die Schnelle habe ich das jetzt nicht hinbekommen mit dem verschieben oder größe ändern.
Smitty schrieb:
Im PreCreateWindow( gibts das im WM5??? ) dann noch:
cs.style &= ~FWS_ADDTOTITLE;oder heisst das da anders?
Das scheint mir ein interessanter Ansatz zu sein. PreCreateWindow gibt es. Aber wie funktioniert das mit FWS_ADDTOTITLE? Muss ich da nicht irgendwo den neuen Text übergeben?