BCGControlBar的使用问题

lovey_carolin 2011-05-30 03:40:37
预期的结果:将对话框放置在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);
}
...全文
263 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzz_yangzhizhong 2012-02-01
  • 打赏
  • 举报
回复
都是高手啊
lovey_carolin 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 guya1314 的回复:]
我用过DockingBar,没你这么痛苦
不需要CRuntimeClass* pFactory = RUNTIME_CLASS(CCamera);
cc = (CCamera *)(pFactory->CreateObject());这些,只要在OnCreate方法中先new在Create对话框就可以了,没那么复杂,至于删除注册表,也不需要,继承与BCG的APP类有个参数,你设为FALSE……
[/Quote]

今天参考了一下Samples里面的DockingView例子,也是需要CRuntimeClass* pFactory = RUNTIME_CLASS(CCamera);
cc = (CCamera *)(pFactory->CreateObject());这些的呀?
guya1314 2011-05-31
  • 打赏
  • 举报
回复
我用过DockingBar,没你这么痛苦
不需要CRuntimeClass* pFactory = RUNTIME_CLASS(CCamera);
cc = (CCamera *)(pFactory->CreateObject());这些,只要在OnCreate方法中先new再Create对话框就可以了,至于删除注册表,也不需要,继承于BCG的那个APP类有个参数,你设为FALSE就可以了,把问题搞复杂了
guya1314 2011-05-31
  • 打赏
  • 举报
回复
我用过DockingBar,没你这么痛苦
不需要CRuntimeClass* pFactory = RUNTIME_CLASS(CCamera);
cc = (CCamera *)(pFactory->CreateObject());这些,只要在OnCreate方法中先new在Create对话框就可以了,没那么复杂,至于删除注册表,也不需要,继承与BCG的APP类有个参数,你设为FALSE就可以了,把问题搞复杂了

ToperRay 2011-05-30
  • 打赏
  • 举报
回复
直接从SAMPLE上修改,或者看他们的例子和你这个有什么不同。
StarManJhh 2011-05-30
  • 打赏
  • 举报
回复
在BCG的samples文件夹下有个DockingView的例子,就是WorkspaceBar里显示各种对话框控件,应该是你想要的效果。你看过了吗?
StarManJhh 2011-05-30
  • 打赏
  • 举报
回复
BCG用的很痛苦。。。
大不了从头修改WorkSpaceBar -_-!!!

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧