Knowledge Base Nr: 00306 dlgbar.cpp - http://www.swe-kaiser.de

Downloads: source sample project

MFC: VS2005 dialogbar implementieren

  
- dialogbars sind etwas zwischen toolbars und dialogen (z.b. properties in visual studio)

- dialog in resourceneditor erzeugen
- nur WS_CHILD (stil:untergeordnet, systemmenu:false, titelleiste:false)
- nicht VISIBLE (sichtbar:false)
- klasse erzeugen:
- ableiten von CDialog
- CDialog in h- und cpp-file ersetzen durch CDialogBar
- klasse erweitern um

bool CPropDialogBar::InitDialog()
{
SetWindowText(L"meine tolle Dialogbar");
return true;
}

- mainframe h-file erweitern:
- #include "PropDialogBar.h"
- CPropDialogBar m_wndDialogBar;

- mainframe cpp-file
- OnCreate() erweitern:

if (!m_wndDialogBar.Create(this, IDD_DIALOGBAR,
CBRS_RIGHT, //CBRS_TOP, CBRS_BOTTOM, CBRS_LEFT, CBRS_RIGHT
) || !m_wndDialogBar.InitDialog())
{
TRACE0("Fehler beim Erstellen der Dialogbar.\n");
return -1; // Fehler beim Erstellen
}
m_wndDialogBar.EnableDocking(CBRS_ALIGN_ANY); //CBRS_ALIGN_ANY, CBRS_ALIGN_HORZ, CBRS_ALIGN_VERT
DockControlBar(&m_wndDialogBar);

- OnCmdMsg() überladen:

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
if (m_wndDialogBar.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;

return CMDIFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

- menupunkt zum ein-/ausschalten:

void CMainFrame::OnAnsichtDialogbar()
{
ShowControlBar(&m_wndDialogBar, (m_wndDialogBar.GetStyle() & WS_VISIBLE) == 0, FALSE);
}

void CMainFrame::OnUpdateAnsichtDialogbar(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck((m_wndDialogBar.GetStyle() & WS_VISIBLE) != 0);
}

- controls neu anordnen- z.b füllen mit tree- und listcontrol:
- funktion in dialogbar-klasse hinzufügen:

void CPropDialogBar::DoResize(int cx, int cy)
{
CWnd* pTree = GetDlgItem(IDC_TREE);
CWnd* pList = GetDlgItem(IDC_LIST);

if (pTree && pList)
{
this->MoveWindow (0, 0, cx, cy);

pTree->MoveWindow (3, 3, cx-6, cy/2-18);
pList->MoveWindow (3, cy/2+3, cx-6, cy/2-68);
}
}

- WM_SIZE-handler für mainrame hinzufügen:

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CMDIFrameWnd::OnSize(nType, cx, cy);

CRect rect;
this->GetClientRect(&rect);
cy = rect.Height();

m_wndDialogBar.GetClientRect(&rect);
cx = rect.Width();

m_wndDialogBar.DoResize(cx, cy);
}


//////beispiel benutzung:

CObArray arElemInfo;
CObArray arPropInfo1, arPropInfo2;

void CMainFrame::OnPropertiesSetup()
{
arPropInfo1.Add(new CPropertyInfo(L"col1", L"Poodle", M_COLOR));
arPropInfo1.Add(new CPropertyInfo(L"edit1", L"Siamese", M_EDIT));
arPropInfo1.Add(new CPropertyInfo(L"combo1", L"Angel Fish", M_COMBO));
arElemInfo.Add(new CElementInfo(L"view1", ET_VIEW, &arPropInfo1));

arPropInfo2.Add(new CPropertyInfo(L"combo2", L"Angel Fish", M_COMBO));
arPropInfo2.Add(new CPropertyInfo(L"edit2", L"Siamese", M_EDIT));
arPropInfo2.Add(new CPropertyInfo(L"col2", L"Poodle", M_COLOR));
arElemInfo.Add(new CElementInfo(L"view2", ET_VIEW, &arPropInfo2));

m_wndDialogBar.SetupProperties(arElemInfo);
}

void CMainFrame::OnPropertiesUpdate()
{
m_wndDialogBar.UpdateProperties(arElemInfo);
}

void CMainFrame::OnPropertiesAdd()
{
arPropInfo1.Add(new CPropertyInfo(L"add", L"nutzelfutzel", M_EDIT));
m_wndDialogBar.UpdateProperties(arElemInfo);
}

void CMainFrame::OnPropertiesDelete()
{
arPropInfo1.RemoveAt(0);
m_wndDialogBar.UpdateProperties(arElemInfo);
}

void CMainFrame::OnPropertiesChange()
{
arPropInfo1.SetAt(0, new CPropertyInfo(L"changed", L"geändert", M_COMBO));
m_wndDialogBar.UpdateProperties(arElemInfo);
}