Создание панели в 1С:
//Регистрируем шаблон
pMainApp->AddDocTemplate(new CTemplate7(
id,
RUNTIME_CLASS(CPanelDocument),
RUNTIME_CLASS(CPopupFrame),
RUNTIME_CLASS(CPanelView)));
// Добавляем описание своей панели управления через ToolBarManager
// это избавляет нас от хлопот по выводу и сохранению/восстановлению состояния панели
// Спасибо trad'у за находку.
GetToolBarManager()->FUNC3(id, (char*)(LPCTSTR)name, id, id,
NULL, 0xE81D, 0, 1, 0x3F800000, 0x96);
id - номер ресурсов, описывающих DocTemplate. Для каждой панели используетя свой номер, номера не должны пересекаться ни у одного CDocTemplate. В openconfe используются номера с 11000 по 11016, в openv7 с 3000 по 3255.
Далее код для поиска и отображения/скрытия панелей:
SECControlBar* FindBar(LPCSTR strCaption)
{
SECControlBar* pFnd = NULL;
for(POSITION pos=pMainFrame->m_listControlBars.GetHeadPosition();pos;)
{
SECControlBar* pCB=(SECControlBar*)pMainFrame->m_listControlBars.GetNext(pos);
CString txt;
pCB->GetWindowText(txt);
if(0 == txt.CompareNoCase(strCaption))
{
if(strcmp("CDockBar7", pCB->GetRuntimeClass()->m_lpszClassName))
return pCB;
}
}
return NULL;
}
void ShowBar(SECControlBar* pBar, BOOL bShow /* = TRUE */)
{
if(pBar)
{
if(pBar->IsMDIChild())
{
CMDIChildWnd* pHolder=(CMDIChildWnd*)pBar->GetParentFrame();
if(bShow)
{
pMainFrame->MDIActivate(pHolder);
if(pBar->IsWindowVisible())
{
CWnd* pChild = pBar->GetWindow(GW_CHILD);
while(pChild)
{
if(pChild->IsKindOf(RUNTIME_CLASS(CView)))
{
pChild->SetFocus();
break;
}
pChild = pChild->GetWindow(GW_CHILD);
}
return;
}
}
else
{
CMDIChildWnd* pChild = pMainFrame->MDIGetActive();
if(pChild == pHolder)
pMainFrame->MDINext();
pHolder->SendMessage(WM_CLOSE);
return;
}
}
pMainFrame->ShowControlBar(pBar, bShow, TRUE);
if(bShow)
{
CWnd* pChild = pBar->GetWindow(GW_CHILD);
while(pChild)
{
if(pChild->IsKindOf(RUNTIME_CLASS(CView)))
{
pChild->SetFocus();
break;
}
pChild = pChild->GetWindow(GW_CHILD);
}
}
else
{
CMDIChildWnd* pChild = pMainFrame->MDIGetActive();
if(pChild && pChild->IsWindowVisible())
{
pChild->ActivateFrame();
if(CView* pView = pChild->GetActiveView())
pView->SetFocus();
}
}
}
}
CPanelDoc - наследник от CDocument, пустой док с DECLARE_DYNCREATE
CPanelView - наследник от CView, он и будет отображаться в панели.
В ресурсах обязательно должно быть пустое меню с заданным тобой в AddDocTemplate id.
Ну и на всякий случай из frame.h
class IMPORT_1C CTBManager
{
private:
SECToolBarManager SECManager;
public:
virtual void FUNC0();
virtual void FUNC1();
virtual void FUNC2();
virtual void FUNC3(int idr, char* name, int idr2, int idm, CDocument* doc, int DockID, int arg_6, int arg_7, int arg_8, int HorzDockCY);
public:
DWORD buf[0x70];
static class SECToolBarManager * GetSECManager(void); //708
static class CTBManager * GetToolBarManager(void); //737
};