tutorials.de Buch-Aktion 05/2012
Seite 1 von 3 123 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
33
ZUGRIFFE
3330
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Dan McHould Dan McHould ist offline Mitglied
    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
     

  2. #2
    Dan McHould Dan McHould ist offline Mitglied
    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
     

  3. #3
    Registriert seit
    Sep 2003
    Ort
    Wiesbaden
    Beiträge
    182
    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

  4. #4
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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.
     

  5. #5
    Registriert seit
    Sep 2003
    Ort
    Wiesbaden
    Beiträge
    182
    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

  6. #6
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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
     

  7. #7
    Registriert seit
    Sep 2003
    Ort
    Wiesbaden
    Beiträge
    182
    ja logisch... ohhmann. Jetzt hat's klick gemacht...

    ich werd nachher mal probieren...

    vielen Dank!
     
    <-- hier Signatur einfügen

  8. #8
    Registriert seit
    Sep 2003
    Ort
    Wiesbaden
    Beiträge
    182
    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

  9. #9
    Registriert seit
    Sep 2003
    Ort
    Wiesbaden
    Beiträge
    182
    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

  10. #10
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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.
     

  11. #11
    Registriert seit
    Sep 2003
    Ort
    Wiesbaden
    Beiträge
    182
    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

  12. #12
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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).
     

  13. #13
    Registriert seit
    Sep 2003
    Ort
    Wiesbaden
    Beiträge
    182
    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

  14. #14
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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.
     

  15. #15
    Registriert seit
    Sep 2003
    Ort
    Wiesbaden
    Beiträge
    182
    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

  1. CFormView abgeleitete Klasse als Dialog in Menü integrieren
    Von cappa555 im Forum VisualStudio & MFC
    Antworten: 4
    Letzter Beitrag: 11.11.08, 09:03
  2. in CFormView Titelleiste anzeige
    Von titanic im Forum VisualStudio & MFC
    Antworten: 4
    Letzter Beitrag: 23.07.07, 12:34
  3. Antworten: 0
    Letzter Beitrag: 21.01.05, 15:31
  4. SetWindowPos in CFormView
    Von Nob im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 24.11.04, 18:36
  5. Flashanimation in ein MFC-Dialog einbinden
    Von lukasS im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 29.07.04, 13:42