Newsgroup: it.comp.programmare.win32
Titolo: [MFC] MDI e ToolBar nelle child

In una applicazione MDI avente visualizzazioni di differenti classi viste ho
voluto implementare, via codice, l'inserimento di una barra degli strumenti
e di una status bar. Dopo aver inserito i relativi membri di dati che
dovranno gestire appunto la status bar e la toolbar nella classe CChildFrame
(derivata da CMDIChildWnd) ho mappato in tale classe il messaggio WM_CREATE
genarato nel momento in cui l'architettura gestisce il frame, in questo caso
il frame child. Questo il codice:
int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 // SCOPO: questa funzione implementa una barra degli strumenti ed una
 // barra di stato all'interno del frame la cui visualizzazione č quella
 // dei Reparti di Volo
 if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
  return -1;
 if (!m_wndChildToolBar.Create(this) ||
  !m_wndChildToolBar.LoadToolBar(IDR_CHILD_TOOLBAR))    // IDR_CHILD_TOOLBAR
č l'ID della toolbar
 {
  TRACE0("Failed to create toolbar\n");
  return -1; // fail to create
 }
 if (!m_wndChildStatusBar.Create(this) ||
  !m_wndChildStatusBar.SetIndicators(indicators,
    sizeof(indicators)/sizeof(UINT)))
 {
  TRACE0("Failed to create status bar\n");
  return -1; // fail to create
 }
 // TODO: Remove this if you don't want tool tips or a resizeable toolbar
 m_wndChildToolBar.SetBarStyle(m_wndChildToolBar.GetBarStyle() |
  CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
 // TODO: Delete these three lines if you don't want the toolbar to be
dockable
 m_wndChildToolBar.EnableDocking(CBRS_ALIGN_ANY);
 EnableDocking(CBRS_ALIGN_ANY);
 DockControlBar(&m_wndChildToolBar);
 return 0;
}
Il tutto funziona ma ogni frame ha la stessa risorsa toolbar
IDR_CHILD_TOOLBAR. Se io volessi inserire una diversa toolbar a seconda
della classe vista sorgono i primi problemi. Supponiamo che io ho tre viste:
CFirstView, derivata da CView
CSecondView, derivata da CFormView
CThirdView, derivata da CListView
come faccio? Ho adottato questo procedimento:
// risalgo al frame principale MDI dell'applicazione
CMDIFrameWnd* pMainFrame = (CMDIFrameWnd*) AfxGetApp()->m_pMainWnd;
// risalgo al frame secondario MDI appena creato
 CMDIChildWnd* pChildFrame =
       (CMDIChildWnd*) pMainFrame->GetActiveFrame();
 // risalgo alla relativa visualizzazione
 CView* pView = pChildFrame->GetActiveView();
Ora io qui dovrei dire: se č CFirstView allora utilizza l'ID_FIRST_TOOLBAR e
cosě via:
Ho pensato a:
if (pView->IsKindOf(RUNTIME_CLASS(CFirstView)))
....č la soluzione giusta oppure ho pensato male?
Grazie 1000
Sergio Mola

 if (pView->IsKindOf(RUNTIME_CLASS(CFirstView)))
Mi sembra un'idea funzionante. Altrimenti per fare una cosa piu`
"formalmente corretta" potresti anche implementare una funzione membro per
ogni vista che ti "risponda" dicendoti quale ID di toolbar vuole. Ma in
questo modo dovresti definire una classe vista "contenitore" che contiene
tale funzione membro, dalla quale poi deriverai tutte le tue sotto-viste.
class CViewContenitore: public CView
{
...
virtual UINT CheToolbarVoglio();
...
};
class CView1: public CViewContenitore
{
...
UINT CheToolbarVoglio() { return ID_TOOLBAR1; };
...
};
class CView2: public CViewContenitore
{
...
UINT CheToolbarVoglio() { return ID_TOOLBAR2; };
...
};
class CView3: public CViewContenitore
{
...
UINT CheToolbarVoglio() { return ID_TOOLBAR3; };
...
};
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/