ERLEDIGT
NEIN
NEIN
ANTWORTEN
33
33
ZUGRIFFE
3330
3330
EMPFEHLEN
-
03.12.04 20:42 #1
- Registriert seit
- Oct 2004
- Beiträge
- 10
Hallo zusammen...
Ich bin jetzt schon länger am rumprobieren...Aber irgendwie...Na ja....
Ich habe eine SDI Anwendung von der CFormView Klasse abgeleitet. Nun will ich darin ein nichmodales Dialogfeld einbetten, was aber nur bedingt funktioniert...
Ich mache folgendes:
Im Style des nichmodalen Dialogfeldes setze ich "Untergordnet".
Danach bei der Hauptform unter Formate "Nebengodnete ausschneiden", sonst wird mir der Dialog überhaupt nicht angezeigt.
Nun erzeuge ich das nicht modale Dialogfeld in der OnCreate Methode in der MainFrame Klasse:
Code :1 2 3 4 5
CDlg2 *dlg2 = new CDlg2(this); dlg2->Create(IDD_DIALOG1,this); dlg2->SetWindowPos(&CWnd::wndTop,15,55,240,334,NULL); dlg2->ShowWindow(SW_SHOW);
Wenn ich die App nun starte, erscheint mir das Dialogfeld. Soweit sogut...
Wenn ich das Fenster nun verkleinere, folgt das Dialogfeld. Wenn ich aber das Fenster kleiner als die Hauptform mache, erscheinen mir unten und rechts Scrollbalken, diese Scrollbalken werden jedoch vom nichtmodalen Dialogfeld überdeckt...Dazu kann ich das Dialogfeld nicht mit den Scrollbalken verschieben...
Meine Frage: Ist das überhaupt möglich? Wenn ja, wie könnte ich das anstellen?
Ich habe mir noch gedacht, dass ich vielleicht das Dialogfeld nach jeder Betätigung der Rollbalken neu positioniere. Da weiss ich jedoch nicht, welche Nachrichten ich da abfangen muss...Kann ich die Position der Scrollbalken irgenwie abfragen?
Gruz Dan McHould
-
03.12.04 21:34 #2
- Registriert seit
- Oct 2004
- Beiträge
- 10
Hallo, ich bin's nochmal....
Ich habe es soeben herausgefunden:
Ich muss die Dialogfelder in der Viewklasse erzeugen. Ich habe sie bisher immer in der Mainframeklasse erzeugt, was dann zu diesen Problemen geführt hat...
Wenn ich die Dialogfelder in der Viewklasse erzeuge, kann ich sie nachher ohne Probleme verschieben und die Scrollbalken werden nicht mehr vom Dialogfeld überdeckt...
Gruz Dan
-
Morgen.
Ist es auch möglich den Dialog während der Laufzeit zu verändern ?
Also nicht nur Static's zu verändern sondern einen neuen Dialog einzublenden...(den alten aus)
Und wenn wie?
Das müsste doch dann auch in der ViewKlasse geschehen. (OnInitalUpdate).
Wenn ich beim Starten einfach den ersten Dialog einblende, danach wieder aus und dann den neuen geht es wunderbar... es müsste also möglich sein...
Nur wie komm ich im laufendem Betrieb nochmal in die OnInitalUpdate?
Oder gibt es eine andere Klasse/Methode wo das wechseln des Dialogs auch möglich ist?
Danke!
fhr<-- hier Signatur einfügen
-
Du musst das doch nicht mal in einer Memberklasse von dem View machen.
Du musst nur auf Kommando an einen Pointer auf den View kommen (wenn möglich gleich den richtigen Typ) und dann kannst du dort den neuen Dialog direkt einsetzen oder eine Memberfunktion des Views aufrufen, die das tut.
Generell kannst du den Dialog fast überall wechseln wo du willst. Der Code braucht eventuell noch ein, zwei Aufrufe, die dem View die neuen Ausmasse (falls anders) setzt.
-
Danke für die schnelle Antwort...
So erstelle ich meinen Dialog: (genau wie oben)
Code :1 2 3
dlg2->Create(IDD_DIALOG1,this); dlg2->SetWindowPos(&CWnd::wndTop,15,55,240,334,NULL); dlg2->ShowWindow(SW_SHOW);
Hab für jeden Dialog eine eigene Klasse erstellt...
Nur verstehe ich noch nicht so ganz wie ich weiter mache wenn ich den Pointer auf das View habe...<-- hier Signatur einfügen
-
Du brauchst ja den Pointer auf den View, weil der das Parent von dem neuen Dialog ist.
Zum Wechsel vom Dialog:
Du musst dir einen Pointer auf den gerade aktiven Dialog natürlich irgendwo merken.
Danach
dlg2->DestroyWindow();
delete dlg2; // Wenn du dlg2 ge-new-ed hast
// und den neuen erstellen
dlg3 = new CMeinAndererDialog();
dlg3->Create(IDD_DIALOG_DER_ANDERE, pViewPointer );
dlg3->SetWindowPos(&CWnd::wndTop,15,55,240,334,NULL);
dlg3->ShowWindow(SW_SHOW);
das sollte schon alles sein
-
ja logisch... ohhmann. Jetzt hat's klick gemacht...
ich werd nachher mal probieren...
vielen Dank!<-- hier Signatur einfügen
-
Schade...
bin immer noch zu doof für
Ich bekomm kein Pointer auf das View...
bzw. Absturz dann beim create();
Wieso ist der Konstruktor in der Viewklasse eigentlich protected...?<-- hier Signatur einfügen
-
OK...
so weit so gut.
Nun habe ich links ein Menü und möchte je nachdem was in diesem Menü angeklickt wird
rechts ein neuen Dialog einblenden...
Mit GetActiveView() würde ich das Menü ja mit dem Dialog überblenden.
Wie kann ich den Dialog nun im rechten Teil einblenden...<-- hier Signatur einfügen
-
Ich weiss nicht, was du mit linken und rechtem Teil meinst. Hast du deinen View mit einem Splitter unterteilt?
Ansonsten müsste das SetWindowPos nach dem Einsetzen den Dialog etwas nach rechts schieben. Damit gibst du ja die Koordinaten relativ zum Parent (also dem View) an.
-
Hi. Ja Fenster ist mit einem Splitter geteilt...
(Häckchen Explorer-Stil beim erzeugen vom Projekt an...)
Ich versuchs mit SetWindowPos()
<-- hier Signatur einfügen
-
Aha, dann musst du statt dem GetDlgItem von dem Splitter die richtige Pane holen (GetPane). Diese Pane kannst du dann als Parent einsetzen (statt dem View selbst).
-
Mit GetPane() fliegt er weg... irgendwas mach ich noch falsch...
Hättest du vielleicht ein codeschnipsel wo ein bsp. mit GetPane() drin ist?<-- hier Signatur einfügen
-
Das ist von einem Programm von mir, innerhalb von OnCreateClient, direkt nach dem Erstellen des Splitters:
CGUIEditorView* pView = (CGUIEditorView*)m_wndSplitter.GetPane( 0, 1 );
Das holt das CWnd von dem rechten Pane und castet gleich unverschämt auf meinen View-Typ.
Wenn du die Pane direkt benutzt, kannst du dir das SetWindowPos auch sparen, der Dialog ist dann ja schon richtig drin. Das Pane als Parent einsetzen, dein Dialog mit Create erzeugen und fettich.
-
OK. In der CMainFrame klappt das alles...
aber was wenn ich das ausserhalb der Klasse machen will?
Auf m_wndSplitter habe ich nur innerhalb der CMainFrame Zugriff...
CLeftView ist meine TreeView-Klasse. In der möchte ich nach einem Klick auf das TreeView den Dialog wechseln....
In der Funktion CLeftView::OnSelchanged(...)
Die Klassen:
class CVerleihlisteView : public CListView
class CMainFrame : public CFrameWnd
class CLeftView : public CTreeView
class CGamesDialog : public CDialog<-- hier Signatur einfügen
Ähnliche Themen
-
CFormView abgeleitete Klasse als Dialog in Menü integrieren
Von cappa555 im Forum VisualStudio & MFCAntworten: 4Letzter Beitrag: 11.11.08, 09:03 -
in CFormView Titelleiste anzeige
Von titanic im Forum VisualStudio & MFCAntworten: 4Letzter Beitrag: 23.07.07, 12:34 -
Compiler Error beim einbinden einer Dialog Klasse
Von Indian im Forum C/C++Antworten: 0Letzter Beitrag: 21.01.05, 15:31 -
SetWindowPos in CFormView
Von Nob im Forum VisualStudio & MFCAntworten: 2Letzter Beitrag: 24.11.04, 18:36 -
Flashanimation in ein MFC-Dialog einbinden
Von lukasS im Forum C/C++Antworten: 3Letzter Beitrag: 29.07.04, 13:42





Zitieren
Login






