La grea treaba te-ai inhamat...
Asazisul "Feature Pack" cu riboane, paneluri docabile, tabbed views si alte cularai (preluat de la BCGSoft) este minunat atata timp cat il folosesti asa cum e, insa poate fi un adevarat overkill daca vrei sa-l customizezi. Nu prea am avut de-a face cu el insa mi-a scos peri albi o biblioteca similara de la o "firma concurenta" numita Codejock.
La urma urmei, (aproape) nimic nu-i imposibil, insa necesita putintica transpiratie.
Si noroc ca in Feature Pack nu si-a bagat coada un super-architect de Codejock care sa faca viata amara programerilor.
Asa ca hai sa vedem!
Nu trebuie sa suprascrii
CBasePane::CanBeClosed. O lasi in plata Domnului asa cum e de la mama ei si scoti flag-ul
AFX_CBRS_CLOSE din parametrul dwControlBarStyle pasat functiei
CDockablePane::Create. In cazul in care panelul a fost deja creat de framework cu stilul
AFX_DEFAULT_DOCKING_PANE_STYLE (care contine si
AFX_CBRS_CLOSE), atunci poti apela
CBasePane::SetControlBarStyle.
Exemplu:
Code: Select all
#define AFX_NON_CLOSE_DOCKING_PANE_STYLE AFX_CBRS_FLOAT | AFX_CBRS_RESIZE | AFX_CBRS_AUTOHIDE
Code: Select all
int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
EnableDocking(CBRS_ALIGN_ANY);
CRect rcPane(0, 0, 200, 200);
CString strCaption;
VERIFY(strCaption.LoadString(IDS_FILE_VIEW));
VERIFY(m_wndFileView.Create(strCaption, this, rcPane, TRUE, ID_VIEW_FILEVIEW,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI,
AFX_CBRS_REGULAR_TABS,
AFX_NON_CLOSE_DOCKING_PANE_STYLE));
VERIFY(strCaption.LoadString(IDS_CLASS_VIEW));
VERIFY(m_wndClassView.Create(strCaption, this, rcPane, TRUE, ID_VIEW_CLASSVIEW,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI,
AFX_CBRS_REGULAR_TABS,
AFX_NON_CLOSE_DOCKING_PANE_STYLE));
m_wndFileView.EnableDocking(CBRS_ALIGN_ANY);
m_wndClassView.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_wndFileView);
CDockablePane* pTabbedBar = NULL;
CDockablePane* pTabbedPane = m_wndClassView.AttachToTabWnd(&m_wndFileView, DM_SHOW, TRUE, &pTabbedBar);
if (NULL == pTabbedBar)
return -1;
// remove AFX_CBRS_CLOSE flag
pTabbedBar->SetControlBarStyle(AFX_NON_CLOSE_DOCKING_PANE_STYLE);
return 0;
}
Nota: de observat ca am dat ID-uri valide panelurilor.
A mai ramas o mica chestie de facut deoarece
CDockablePane::CreateTabbedPane copie stilul din panel insa pe control bar style il seteaza tot cu
AFX_DEFAULT_DOCKING_PANE_STYLE. Noroc ca-i virtuala.
Code: Select all
CTabbedPane* CClassView::CreateTabbedPane()
{
CTabbedPane* pTabbedPane = __super::CreateTabbedPane();
ASSERT_VALID(pTabbedPane);
// remove AFX_CBRS_CLOSE flag;
pTabbedPane->SetControlBarStyle(AFX_NON_CLOSE_DOCKING_PANE_STYLE);
return pTabbedPane;
}
Faci asta pentru toate panelurile care nu trebuie sa contina butonel de close sau mai bine derivezi dintr-o clasa comuna care suprascrie
CreateTabbedPane.
Simplu...
Vezi acum daca merje!
