Toon posts:

[VC++]MFC probleem met File New optie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hey ik heb zelf een programmaatje geschreven om zelf een surfplank te ontwerpen. Nu heb ik een probleem waarover ik op het internet niets kan vinden en hoop dat jullie mij kunnen helpen.

probleem: Wanneer ik uit het menu File->New kies krijg ik een popup schermpje (zie pic) met de vraag wat voor document ik wil openen. (dit gebeurd alleen wanneer ik al van view ben gewisseld)
Het openen van opgeslagen documenten lukt meestal ook maar 1 keer.

Zoals jullie al begrepen hebben heb ik dus meerder view classes. De objecten worden niet bewaard maar telkens vernietigd en aangemaakt.

Afbeeldingslocatie: http://www.ricardis.tudelft.nl/~sideshore/programthumb.jpg

Hier nog even de code waarmee ik van view veranderd.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
bool CBoardDesignApp::SwitchView(CView* pNewView)
{
    CView* pActiveView = ((CFrameWnd*)m_pMainWnd)->GetActiveView();
//  CBoardView* pNewView= new CBoardView;
    //pNewView=(CBoardView*) new CBoardView;

        CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
        IDR_MAINFRAME,
        RUNTIME_CLASS(CBoardDesignDoc),
        RUNTIME_CLASS(CMainFrame),       // main SDI frame window
        RUNTIME_CLASS(CBoardView));
    if (!pDocTemplate)
        return FALSE;
    AddDocTemplate(pDocTemplate);
    
    CDocument* pCurrentDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();
    //CBoardDesignDoc* pCurrentDoc = pActiveView->GetDocument();

    CCreateContext newContext;
    newContext.m_pNewViewClass=NULL;
    newContext.m_pNewDocTemplate=pDocTemplate;
    newContext.m_pLastView=NULL;
    newContext.m_pCurrentFrame=NULL;
    newContext.m_pCurrentDoc=pCurrentDoc;

    UINT viewID = AFX_IDW_PANE_FIRST;
    CRect rect(0,0,0,0);
    pNewView->Create(NULL, NULL,WS_CHILD|WS_BORDER,rect,m_pMainWnd,viewID, &newContext);
    pNewView->SendMessage(WM_INITIALUPDATE,0,0);

    // Exchange view window IDs so RecalcLayout() works.
   //#ifndef _WIN32
   //UINT temp = ::GetWindowWord(pActiveView->m_hWnd, GWW_ID);
   //::SetWindowWord(pActiveView->m_hWnd, GWW_ID, ::GetWindowWord(pNewView->m_hWnd, GWW_ID));
   //::SetWindowWord(pNewView->m_hWnd, GWW_ID, temp);
   //#else
   //UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID);
   //::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNewView->m_hWnd, GWL_ID));
   //::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp);
   //#endif

   pActiveView->ShowWindow(SW_HIDE);
   pNewView->ShowWindow(SW_SHOW);
   ((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView);
   ((CFrameWnd*) m_pMainWnd)->RecalcLayout();
   pNewView->Invalidate();
   pActiveView->DestroyWindow();

    return true;
}


Alvast bedankt!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Wat is nu precies je probleem? Dat je "meestal" maar 1 keer een bestand kan openen? Waarom geef je dan de code om van view te wisselen?

Daarnaast: ben je al stap voor stap door je code heen gelopen met de debugger om te kijken wat er gebeurt op het moment dat je een file opent, of van view wisselt etc. zodat je precies kan zien welke variabelen welke waarden hebben etc? (Zie ook P&W FAQ - Leer **** debuggen!!)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Mijn probleem is dat popup schermpje met de vraag wat voor document hij moet openen op het moment dat ik file->new kies. Dat popup scherm zou ik helemaal niet moeten krijgen wanneer ik maar 1 soort document class gebruik. Toch?

En ik bedoel dat ik maar een keer een file kan openen en dat hij dan het active document veranderd en daarna veranderd het document niet meer wanneer ik een andere file open.

ps het is dus een SDI programma.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

Ok.. in de herkansing....

Waar wordt die popup aangemaakt en getoond? In je SwitchView() method? Is dat pNewView? Zo ja, daar zie ik geen enkele controle op het wel of niet showen? Toon je dat niet in je SwitchView method? Waarom post je dan niet de code je die die dat window moet tonen?

Je twijfelt zelf al of er een popup getoond moet worden. Het lijkt me dat je weet wanneer er een popup getoond wordt aangezien je zelf die code hebt geschreven om uberhaupt die pop-up te tonen?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • The End
  • Registratie: Maart 2000
  • Laatst online: 16:41

The End

!Beginning

Creepy schreef op donderdag 12 mei 2005 @ 20:44:
Ok.. in de herkansing....

Waar wordt die popup aangemaakt en getoond? In je SwitchView() method? Is dat pNewView? Zo ja, daar zie ik geen enkele controle op het wel of niet showen? Toon je dat niet in je SwitchView method? Waarom post je dan niet de code je die die dat window moet tonen?

Je twijfelt zelf al of er een popup getoond moet worden. Het lijkt me dat je weet wanneer er een popup getoond wordt aangezien je zelf die code hebt geschreven om uberhaupt die pop-up te tonen?
Als je een bepaald soort project aanmaakt (zoals een single document MFC app), dan worden heel veel standaard functies aangeroepen. Hierbij zit ook de OnFileNew functie. Deze opent de 'popup'. Als je die overerft en de aanroep naar de functie van de basisklasse weghaalt, dan zal je de 'popup' niet meer krijgen.

Verwijderd

Topicstarter
Allebei hartelijk dank voor jullie reacties. Het had me net weer even een andere kijk op het probleem gegeven en heb nu het probleem gevonden.

Allereerst even dit.
Zoals eerder genoemd die popup is iets van MFC dit heb ik niet geprogrammeerd en daarom vond ik het vreemd dat hij op kwam. En ik wilde juist niet die functie "overerfen" (ik dacht dat dit "override" heet).

De fout zat hem hierin. Elke keer maakte ik een nieuwe pDocTemplate aan. Waardoor ik dus eigenlijk meer verschillende mogelijke documenten creerde. En wist het programma niet meer wat voor document het aanmoest maken.

oude code
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
        IDR_MAINFRAME,
        RUNTIME_CLASS(CBoardDesignDoc),
        RUNTIME_CLASS(CMainFrame),       // main SDI frame window
        RUNTIME_CLASS(CBoardView));
    if (!pDocTemplate)
        return FALSE;
    AddDocTemplate(pDocTemplate);
    
    CDocument* pCurrentDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();

    CCreateContext newContext;
    newContext.m_pNewViewClass=NULL;
    newContext.m_pNewDocTemplate=pDocTemplate; //hier ging het dus mis
    newContext.m_pLastView=NULL;
    newContext.m_pCurrentFrame=NULL;
    newContext.m_pCurrentDoc=pCurrentDoc;


nieuwe code
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    //  CSingleDocTemplate* pDocTemplate;
    //pDocTemplate = new CSingleDocTemplate(
    //  IDR_MAINFRAME,
    //  RUNTIME_CLASS(CBoardDesignDoc),
    //  RUNTIME_CLASS(CMainFrame),       // main SDI frame window
    //  RUNTIME_CLASS(CBoardView));
    //if (!pDocTemplate)
    //  return FALSE;
    //AddDocTemplate(pDocTemplate);
    
    CDocument* pCurrentDoc = ((CFrameWnd*)m_pMainWnd)->GetActiveDocument();

    CCreateContext newContext;
    newContext.m_pNewViewClass=NULL;
    newContext.m_pNewDocTemplate=NULL;  //hier niet meer
    newContext.m_pLastView=NULL;
    newContext.m_pCurrentFrame=NULL;
    newContext.m_pCurrentDoc=pCurrentDoc;


nu werkt ook het openen van bestanden weer prima.

Vreemd he dat je zo lang bezig kan zijn om zo'n stomme "fout" te vinden.
Pagina: 1