Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » FAQ VC++ / MFC » SDI/CFormView: Tauschen des Dialogs

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.07.2005, 20:57 Uhr
deKeep



Hi Meine Lieben,

wie schaffe ich es den Dialog Diaglog1(IDD_Dialog1) durch Dialog2(IDD_DIALOG2) zu ersetzen? Ich werd hier noch bekloppt, aber finden kann ich es trotzdem nicht...

Ich nutze Visual C++ .NET, eine simple SDI-Anwendung mit Menü und die CFormView-Ansichtsklasse. Soweit ist ja alles in ordnug, nur ich würde gerne über das Menü in der Ansicht zwischen 6 Dialogen wechseln können, weiss einer wie man das erreichen kann?

deKeep
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.07.2005, 21:18 Uhr
xXx
Devil


guck dir mal an, was in der initinstance() deiner anwendung gemacht wird... die öffnen dein érstes frame... und so machst du das dan halt auch für die anderen dialoge... aber vorher den alten schließen---
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.07.2005, 21:51 Uhr
deKeep



thx, xXx!

Ich nehm mal an, dass es sich um diesen Block hier handelt:


C++:
    pDocTemplate = new CSingleDocTemplate(
        IDR_MAINFRAME,
        RUNTIME_CLASS(CTestDialogDoc),
        RUNTIME_CLASS(CMainFrame),       // Haupt-SDI-Rahmenfenster
        RUNTIME_CLASS(CTestDialogView));
    if (!pDocTemplate)
        return FALSE;
    AddDocTemplate(pDocTemplate);



nur... soll ich jetzt 6 View-klassen erzeugen? ich hätte gedacht, dass es auch mit einer gehen würde, bei der ich dann mittels funktion, die IDD austauschen kann, sprich das Hauptfenster neuerzeugt wird...

Seh ich das falsch?

deKeep
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.07.2005, 16:58 Uhr
xXx
Devil


ach sorry.. also, wenn man nen neues FrameWnd beid en resourcen hinzufügt, macht er im normal fall eigenständig nen neues template... was bewirgt.. das man ganz am start auswählen kann, welches man von den dialogen haben will...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.07.2005, 17:40 Uhr
deKeep



hmmm...

ja, ist mir auch aufgefallen, ich bastel aber gerade an einer variante, in der man die view-klasse tauschen kann, dummerweise scheint das nur mit CView-klassen fehlerfreu zu laufen, bei CFormView muss wohl einiges noch selbst geschrieben werden...

schade, hatte das in nem fetten wälzer gefunden, nur leider nicht ganz das was ich wollte...

hat vielleicht wer sowas schon gemacht?

deKeep
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.07.2005, 11:38 Uhr
~Blubb
Gast


Ich hab sowas schon häufiger gemacht, aber nur mit von CFormView abgeleiteten klassen, nicht von Dialogen

meine SwitchView-Funktion:


C++:
void CMainFrame::SwitchView(UINT uiViewTyp)
{
    if(uiViewTyp != m_uiCurViewTyp)
    {
        // build view context structure
        CCreateContext    ccx;

        switch(uiViewTyp)
        {
        case WMU_VIEW1:
            //Klasse bestimmen von die die View erstellt wird
            // Struktur benutzen um die View zu erstellen
            ccx.m_pNewViewClass = RUNTIME_CLASS(CView1);
            m_pNewView = DYNAMIC_DOWNCAST(CView1, this->CreateView(&ccx));
            break;
        case WM_CLOSE:
            PostMessage(WM_CLOSE);
            return;
            break;
        default:
            //Klasse bestimmen von die die View erstellt wird
            // Struktur benutzen um die View zu erstellen
            ccx.m_pNewViewClass = RUNTIME_CLASS(CViewBase);
            m_pNewView = DYNAMIC_DOWNCAST(CViewBase, this->CreateView(&ccx));
        }
        //Geklappt?
        if(!m_pNewView)
        {
            TRACE0("Erstellung der Ansicht fehlgeschlagen\n");
            return;
        }

        //Alte View Zerstören
        m_pCurView->DestroyWindow();
        delete m_pCurView;

        //Layout neu berechnen
        RecalcLayout();
        //View anzeigen und InitUpdate aufrufen
        m_pNewView->ShowWindow(SW_SHOW);
        m_pNewView->OnInitialUpdate();

        //View aktiv setzen
        SetActiveView(m_pNewView);

        //View Variablen zuweisen    
        m_pCurView = m_pNewView;
        m_uiCurViewTyp = uiViewTyp;
    }
}



in der Header-Datei siehts dann so aus

C++:
    UINT        m_uiCurViewTyp;
    CFormView*     m_pCurView;
    CFormView*     m_pNewView;



Sodalle jetzt ist noch folgendes zu beachten:

- Jede View die man erstellt muss als include in den MainFrame.h rein
- Der Kontruktor UND Destruktor der View MÜSSEN Public sein
- In der jeweiligen View die angezeigt werden soll MUSS PostNCDestroy überschrieben werden und der Basis Aufruf auskommentiert werden ( //CFormView::PostNcDestroy(); )
- In der Init sollte zuerste die Basis aufgerufen werden und dann die eigeninitialisierung erfolgen

Meine kleine FAQ:

F: Wie ruft man die funktion aus einer View auf?
A: z.B. so:
Includiere die MainFrame.h in die cpp-Datei der View von deraus du die Funktion aufrufen willst.
Danach Erstellst du dir ein Objekt der Klasse, z.B. so


C++:
CView1::OnBnClickedWechseln()
{
    CMainFrame* pMF = (CMainFrame*)GetParentFrame();
    pMF->SwitchView(WMU_VIEW1);
}



und schwupp die View Wechselt!

F: Was ist WMU_VIEW1

A: ein define, z.b

C++:
#define WMU_VIEW1 WM_USER+1000



F: Gibt es auch eine Message handler?
A: Aber sicher hier der Code-Ausschnitt:

header der MainFrame

C++:
LRESULT MsgChangeView(WPARAM wParam, LPARAM lParam);



cpp file


C++:
//Messagehandler fürs View switching
LRESULT CMainFrame::MsgChangeView(WPARAM wParam, LPARAM lParam)
{
    SwitchView(wParam);
    return 0;
}



der Aufruf geschieht mit PostMessage(VIEW_MEINE_ERSTE);

Ich bitte darum das der Code geachtet wird und keiner diesen code als seinen ausgibt!

ok hoffe es ist was für die FAQ

Dieser Post wurde am 23.09.2005 um 19:25 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
26.07.2005, 17:14 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


zu FAQ
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ FAQ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: