BCGControlBar的使用问题
预期的结果:将对话框放置在WorkspaceBar上。
实际的结果:新建的对话框老是出现在左上角,无法放置在WorkspaceBar上。后来在程序中添加了删注册表的语句后,程序一运行就崩溃了。。。
以下是我的操作步骤:
//=========================================================================
1、新建一个工程或打开已有工程,打开ClassView视图,点击右键选择New Class,Class type选择Generic Class,
类名为:CWorkspaceBar
基类选择:CBCGPDockingControlBar (默认public继承)
2、打开ClassView视图,选择CMainFrame,打开MainFrm.cpp,在OnCreate()函数中添加:
if (!m_wndWorkSpace.Create (_T("View 1"), this, CRect (0, 0, 210, 210),TRUE, ID_VIEW_WORKSPACE,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
{
TRACE0("Failed to create Workspace bar\n");
return FALSE; // fail to create
}
m_wndWorkSpace.SetIcon (imagesWorkspace.ExtractIcon (0), FALSE);
m_wndWorkSpace.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
EnableAutoHideBars(CBRS_ALIGN_ANY);
DockControlBar (&m_wndWorkSpace);
3、打开MainFrm.h,添加:
#include "WorkspaceBar.h"
public:
CWorkspaceBar m_wndWorkSpace;
4、在WorkspaceBar.h中添加:
#include "camera.h" //需要放置在WorkspaceBar之上的对话框文件
protected:
CCamera* cc; //CCamera为对话框类,需要将CCamera对话框放置在WorkspaceBar之上
public:
virtual BOOL CanBeClosed()const{ return FALSE;}; //禁止关闭
virtual BOOL CanFloat()const{return FALSE;}; //禁止浮动
// Generated message map functions
protected:
//{{AFX_MSG(CWorkspaceBar)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnPaint(); //点击类右键->Add Windows Messages Handle添加WM_CREATE、WM_PAINT、WM_SIZE
//}}AFX_MSG
5、在WorkspaceBar.cpp中添加:
在构造函数中添加:
CWorkspaceBar::CWorkspaceBar()
{
CRuntimeClass* pFactory = RUNTIME_CLASS(CCamera);
cc = (CCamera *)(pFactory->CreateObject());
}
int CWorkspaceBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CBCGPDockingControlBar::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rect;
GetClientRect (rect);
CRect ccRect;
ccRect.left=rect.left;
ccRect.top=rect.top;
ccRect.right=(long)(rect.right);
ccRect.bottom=rect.bottom;
if (cc!= NULL)
{
cc->CreateView(this,NULL,ccRect);
}
return 0;
}
void CWorkspaceBar::OnSize(UINT nType, int cx, int cy)
{
CBCGPDockingControlBar::OnSize(nType, cx, cy);
}
void CWorkspaceBar::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect (rect);
CRect ccRect;
ccRect.left=rect.left;
ccRect.top=rect.top;
ccRect.right=(long)(rect.right);
ccRect.bottom=rect.bottom;
cc->MoveWindow(&ccRect,TRUE );
}
6、新建一个对话框,并在此对话框上放置相应的控件。并为此对话框新建类CCamera(CCamera类继承于CFormView),对话框中的具体操作不再一一详述。
在Camera.h头文件中添加
public:
BOOL CreateView(CWnd* pParent, CCreateContext* pContext,CRect rect);
在Camera.cpp中添加:
BOOL CCamera::CreateView(CWnd *pParent, CCreateContext *pContext,CRect rect)
{
// CRect rect(300,0,600,300);
if (!Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
rect, pParent, AFX_IDW_PANE_FIRST, pContext))
{
TRACE0("Warning: couldn't create camera!\n");
return FALSE;
}
return TRUE;
}
//========================================================================
以下是注册表相关的代码:
在MainFrm.h中添加:
public:
BOOL DeleteKey(HKEY hKey, char *szSubKey);
在MainFrm.cpp中添加:
BOOL CMainFrame::DeleteKey(HKEY hKey, char *szSubKey)
{
if(ERROR_SUCCESS == RegDeleteKey(hKey,szSubKey))
return true;
HKEY hSubKey;
if(RegOpenKeyEx(hKey,szSubKey,0,KEY_WRITE|KEY_READ,&hSubKey) != ERROR_SUCCESS)
return false;
DWORD dwIndex = 0;
long lResult;
char szName[100];
DWORD cbName = 100;
lResult = RegEnumKeyEx(hSubKey,dwIndex,szName,&cbName,0,NULL,NULL,NULL);
while(lResult == ERROR_SUCCESS && lResult != ERROR_MORE_DATA)
{
DeleteKey(hSubKey,szName);
cbName = 100;
lResult = RegEnumKeyEx(hSubKey,dwIndex,szName,&cbName,0,NULL,NULL,NULL);
}
RegCloseKey(hSubKey);
RegDeleteKey(hKey,szSubKey);
return true;
}
在MainFrm.cpp中的析构函数里添加:
CMainFrame::~CMainFrame()
{
HKEY hKey;
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER,_T("SOFTWARE\\BCGP AppWizard-Generated Applications"),
0,KEY_WRITE,&hKey))
{
if(!DeleteKey(hKey,"ChaiFenPlayer"))
MessageBox("error");
}
else
MessageBox("error");
RegCloseKey(hKey);
}