Menu controls view, doc or main frame ? Which the better ?
Pedro Vicente -- vicente@hidro1.ist.utl.pt Wednesday, April 03, 1996 Environment: VC++ 4.0 / Win 95 Hi all I' m doing a program that does some numeric calculus. I put the data inside a CDocument and displayed the data on a CView (the app is MDI). I have two diferent views of the doc. The user controls the numeric calculation by the menu (options like Start, stop , trace and clear ), which acts on a timer. What I did first was to define the ID_COMMAND function controled by one view. This works fine, but the other view does not react, except on a Paint message. I tried pDocument->UpdateAllViews( this ); inside the current view. Ok, the other view gets updated but the view's client area gets terribly flickering ( it does a BitBlt of a bitmap). I tried another approach: the menu controls the CMainFrame instead (i.e the timer is on CMainFrame). The same happened, with the disavantege of some complex window accessing: void CMainFrame::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CMDIChildWnd* pActiveChild = MDIGetActive(); if ( pActiveChild ) { CHidroDoc* pDocument = (CHidroDoc*) pActiveChild->GetActiveDocument(); pDocument->transfer.hydro_1D->Iterar(); pDocument->UpdateAllViews( NULL ); } CMDIFrameWnd::OnTimer(nIDEvent); } I suspect that if I tranfer the timer directly to the document the same flicker occurs on the views. Anyway what is the best place to put the timer , i.e, the best place to define the ID_COMMAND menu messages : inside one view, the doc, the MDI main frame or the MDIChildFrame ? Pedro Vicente
nicolas@dsys.ceng.cea.fr Friday, April 05, 1996 > [...] This works fine, but the other > view does not react, except on a Paint message. I tried > > pDocument->UpdateAllViews( this ); > > inside the current view. Ok, the other view gets updated but > the view's client area gets terribly flickering ( it does a BitBlt > of a bitmap). > [...] You didn't focused on the problem. Whatever where you call your view's update, you will have flickering. This is because Windows paint an uniform background, and AFTER you paint your bitmap. The way of avoiding this is to prevent windows to draw the background. Just add one OnEraseBackground() function (with Class Wizard) in your views and do nothing in it. You will no more have flickering. Hope it helps. ---- Eric NicolasTake a look to the SWORD home page : http://mimine.iut.univ-metz.fr/~borysgr/sword.web/home.html
Darius Thabit -- darius@world.std.com Friday, April 05, 1996 [Mini-digest: 2 responses] > I tried > > pDocument->UpdateAllViews( this ); > > inside the current view. Ok, the other view gets updated but > the view's client area gets terribly flickering ( it does a BitBlt > of a bitmap). What you can do is define a "hint" code (or hint structure, if you need more parameters - this must be derived from CObject) that can represent the various update possibilities for your document, and which takes into account the corresponding sub-tasks for your views. You pass this to UpdateAllViews, which gets routed to your view's OnUpdate, which can then check the hint parameter for non-null and do the required subtask; otherherwise pass off the call to your view base class, which updates the entire view. See the docs for CView::OnUpdate() for more details. -----From: Dan KirbyHi, UpdateAllViews calls OnUpdate() for each of your views. In OnUpdate, MFC calls Invalidate(TRUE). This is causing the view to be repainted and you will see the flickering. If you want to modify what happens when the view gets updated, override OnUpdate. --dan
Pedro Vicente -- vicente@hidro1.ist.utl.pt Sunday, April 07, 1996 Hi Thanks for the suggestion. I think I found a better method instead. With your approach I would have to implemt a different timer for each view, right ? I implement this timer * only * for the main frame, an then loop by the views : void CMainFrame::Run() { CMDIChildWnd* pActiveChild = MDIGetActive(); if ( pActiveChild ) { //necessario por causa da toolbar CHidroDoc* pDocument = (CHidroDoc*)pActiveChild->GetActiveDocument(); pDocument->transfer.hydro_1D->Iterar(); //iterar pela lista de views do doc POSITION pos = pDocument->GetFirstViewPosition(); while ( pos != NULL ) { CBaseView* pView = (CBaseView*)pDocument->GetNextView(pos); pView->Show(); } } //if ( pActiveChild ) } Here Show is a virtual method that each view has. Pedro Vicente ---------- From: Darius Thabit[SMTP:darius@world.std.com] Sent: sabado, 6 de abril de 1996 1:18 To: vicente@hidro1.ist.utl.pt Cc: mfc-l@netcom.com Subject: Re: Menu controls view, doc or main frame ? Which the better ? [Mini-digest: 2 responses] > I tried > > pDocument->UpdateAllViews( this ); > > inside the current view. Ok, the other view gets updated but > the view's client area gets terribly flickering ( it does a BitBlt > of a bitmap). What you can do is define a "hint" code (or hint structure, if you need more parameters - this must be derived from CObject) that can represent the various update possibilities for your document, and which takes into account the corresponding sub-tasks for your views. You pass this to UpdateAllViews, which gets routed to your view's OnUpdate, which can then check the hint parameter for non-null and do the required subtask; otherherwise pass off the call to your view base class, which updates the entire view. See the docs for CView::OnUpdate() for more details. -----From: Dan KirbyHi, UpdateAllViews calls OnUpdate() for each of your views. In OnUpdate, MFC calls Invalidate(TRUE). This is causing the view to be repainted and you will see the flickering. If you want to modify what happens when the view gets updated, override OnUpdate. --dan
Pedro Vicente -- vicente@hidro1.ist.utl.pt Monday, April 08, 1996 Hi Thanks for the suggestion. I think I found a better method instead. With your approach I would have to implemt a different timer for each view, right ? I implement this timer * only * for the main frame, an then loop by the views : void CMainFrame::Run() { CMDIChildWnd* pActiveChild = MDIGetActive(); if ( pActiveChild ) { //necessario por causa da toolbar CHidroDoc* pDocument = (CHidroDoc*)pActiveChild->GetActiveDocument(); pDocument->transfer.hydro_1D->Iterar(); //iterar pela lista de views do doc POSITION pos = pDocument->GetFirstViewPosition(); while ( pos != NULL ) { CBaseView* pView = (CBaseView*)pDocument->GetNextView(pos); pView->Show(); } } //if ( pActiveChild ) } Here Show is a virtual method that each view has. Pedro Vicente ---- Pedro VicenteTake a look at the MARETEC home page : http://hidro1.ist.utl.pt ---------- From: nicolas@jupiter.ceng.cea.fr[SMTP:nicolas@jupiter.ceng.cea.fr] Sent: sexta-feira, 5 de abril de 1996 15:06 To: mfc-l@netcom.com Subject: Re: Menu controls view, doc or main frame ? Which the better ? > [...] This works fine, but the other > view does not react, except on a Paint message. I tried > > pDocument->UpdateAllViews( this ); > > inside the current view. Ok, the other view gets updated but > the view's client area gets terribly flickering ( it does a BitBlt > of a bitmap). > [...] You didn't focused on the problem. Whatever where you call your view's update, you will have flickering. This is because Windows paint an uniform background, and AFTER you paint your bitmap. The way of avoiding this is to prevent windows to draw the background. Just add one OnEraseBackground() function (with Class Wizard) in your views and do nothing in it. You will no more have flickering. Hope it helps. ---- Eric Nicolas Take a look to the SWORD home page : http://mimine.iut.univ-metz.fr/~borysgr/sword.web/home.html
| Вернуться в корень Архива |