这是我修改过的viewbar // ViewBar.cpp: implementation of the CViewBar class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "ViewBar.h"#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endifIMPLEMENT_DYNAMIC(CViewBar, TViewBarBase);////////////////////////////////////////////////////////////////////// // Construction/Destruction //////////////////////////////////////////////////////////////////////CViewBar::CViewBar() { ZeroMemory(&m_Context, sizeof(m_Context)); // Create a frame object. CRuntimeClass *pRuntimeClass = RUNTIME_CLASS(CFrameWnd); CObject* pObject = pRuntimeClass->CreateObject(); ASSERT( pObject->IsKindOf( RUNTIME_CLASS( CFrameWnd ) ) ); m_pFrameWnd = (CFrameWnd *)pObject; } CViewBar::~CViewBar() { } BEGIN_MESSAGE_MAP(CViewBar, TViewBarBase) //{{AFX_MSG_MAP(CViewBar) ON_WM_CREATE() ON_WM_SIZE() //}}AFX_MSG_MAP END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CViewBar message handlers/* --------------------------------------------------------------- Overridden to set the view class before calling the base create function. Note the other version of the create function is "obsolete" so I don't support it. For an SDI application the main frame window is created when the document template is created and a valid CreateContext is passed through (hurray!). Meaning there is no problem creating the ViewBar in the frame window create. However, for an MDI application the main frame window is constructed outside the document creation, so the CreateContext isn't present. In this case you can either create and setup a CreateContext object with the desired characteristics (doc template, frame window, etc.) and pass it, or let the CViewBar::Create() create a CreateContext with only the runtime class of the view, and the main frame window set. --------------------------------------------------------------- */ BOOL CViewBar::Create( CWnd* pParentWnd, CRuntimeClass *pViewClass, CCreateContext *pContext, LPCTSTR lpszWindowName, DWORD dwStyle, UINT nID) { ASSERT(pViewClass != NULL); ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CWnd))); if (pContext){ memcpy(&m_Context, pContext, sizeof(m_Context)); } else { CFrameWnd *fw = (CFrameWnd *)AfxGetMainWnd(); if (fw) { m_Context.m_pCurrentDoc = fw->GetActiveDocument(); m_Context.m_pCurrentFrame = fw; } } m_Context.m_pNewViewClass = pViewClass; return TViewBarBase::Create( lpszWindowName, pParentWnd, nID, dwStyle); } /* --------------------------------------------------------------- Create the frame window associated with the view bar. --------------------------------------------------------------- */ int CViewBar::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (TViewBarBase::OnCreate(lpCreateStruct) == -1) return -1; if (!m_pFrameWnd->Create(NULL, NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE, CRect(0,0,0,0), this, NULL, 0, &m_Context)) return -1; return 0; } /* --------------------------------------------------------------- Must remember to move the frame window as well... --------------------------------------------------------------- */ void CViewBar::OnSize(UINT nType, int cx, int cy) { CRect rc; TViewBarBase::OnSize(nType, cx, cy); GetClientRect(rc); if(::IsWindow(m_pFrameWnd->GetSafeHwnd())) m_pFrameWnd->MoveWindow(rc); }
m_Context.m_pCurrentDoc = fw->GetActiveDocument(); 你加的这一段代码,原先我也试过了,我现在也懂它的意思,不过不知道为什么原先我取不到那个指针,hehe控件作者给我一段代码,你看看: Get a pointer to the view. --------------------------------------------------------------- */ CWnd *CViewBar::GetView() const { ASSERT_VALID(this);CWnd* pView = m_pFrameWnd->GetDlgItem(AFX_IDW_PANE_FIRST); ASSERT(pView != NULL); return pView; }
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
MDICREATESTRUCT* lpmcs=(MDICREATESTRUCT*)lpCreateStruct->lpCreateParams;
CCreateContext* pContext = (CCreateContext*)lpmcs->lParam;
if(!m_wndDeptViewBar.Create(this, RUNTIME_CLASS(CCWDeptTreeView),pContext,"部门栏",
WS_CHILD | WS_VISIBLE | CBRS_RIGHT|CBRS_GRIPPER,AFX_IDW_CONTROLBAR_FIRST + 33 )){
TRACE0("Failed to create dept bar\n");
return -1; // fail to create
}
m_wndDeptViewBar.SetSCBStyle(SCBS_SIZECHILD);
pFrame=(CMainFrame *)::AfxGetMainWnd();
pView=(CEagleView *)(pFrame->m_wndMyBar.GetDlgItem(AFX_IDW_PANE_FIRST+32));
或
pView=(CEagleView *)(pFrame->m_wndMyBar.GetDlgItem(IDD_EAGLE));
都不行
在CLEditApp中的Initinstance()中只有 pDocTemplate = new CMultiDocTemplate(
IDR_LEDITTYPE,
RUNTIME_CLASS(CLEditDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CLEditView));
AddDocTemplate(pDocTemplate);
不知道需不需要添加一个文档模板以建立CEagleView和CLEditDoc连接,这方面我理解的很浑,你的方法是可以把视加入到控件中,这个我已经实现了,但在取得CEagleView *pView指针时
CEagleView* CLEditView::GetView()
{
CLEditDoc *pDoc=(CLEditDoc *)GetDocument();
if(pDoc){
POSITION pos=pDoc->GetFirstViewPosition();
CView* pView;
while (pos != NULL)
{
pView = pDoc->GetNextView(pos);
if (pView->IsKindOf(RUNTIME_CLASS(CEagleView)))
return (CEagleView *)pView;
}
}
return NULL;
}取不到CEagleView指针,是什么原因,首先谢谢你,help me?
我的e-mail:[email protected]可以给一个具体相关的代码吗,very thank you!!!
注意只有pView->m_pDocument=NULL时才能AddView(pView)
只要你指定了CreateContext的m_pDocument,它自己就会AddView。
CCreateContext m_Context;
m_Context.m_pCurrentDoc=当前文档;
然后就会文档和视自动建立连接了非常感谢你这些天对我的帮助,谢谢,能在网上碰见你,我非常的高兴我的qq 是66442318,可告诉我,你的吗
BOOL CViewBar::Create(
CWnd* pParentWnd,
CRuntimeClass *pViewClass,
CCreateContext *pContext,
LPCTSTR lpszWindowName,
DWORD dwStyle,
UINT nID)
{
ASSERT(pViewClass != NULL);
ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CWnd)));
if (pContext)
memcpy(&m_Context, pContext, sizeof(m_Context));
else {
CFrameWnd *fw = (CFrameWnd *)AfxGetMainWnd();
if (fw) {
// cc.m_pCurrentDoc = fw->GetActiveDocument();
m_Context.m_pCurrentFrame = fw;
}
}
m_Context.m_pNewViewClass = pViewClass;
// m_Context.m_pCurrentDoc=((CFrameWnd *)AfxGetMainWnd())->GetActiveDocument();
m_Context.m_pCurrentDoc=m_pFrameWnd->GetActiveDocument();
return TViewBarBase::Create(
lpszWindowName,
pParentWnd,
nID,
dwStyle);
}但无法取到我需要的应用程序文档指针,最上一行注释是原控件作者加的
// ViewBar.cpp: implementation of the CViewBar class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ViewBar.h"#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endifIMPLEMENT_DYNAMIC(CViewBar, TViewBarBase);//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CViewBar::CViewBar()
{
ZeroMemory(&m_Context, sizeof(m_Context));
// Create a frame object.
CRuntimeClass *pRuntimeClass = RUNTIME_CLASS(CFrameWnd);
CObject* pObject = pRuntimeClass->CreateObject();
ASSERT( pObject->IsKindOf( RUNTIME_CLASS( CFrameWnd ) ) );
m_pFrameWnd = (CFrameWnd *)pObject;
}
CViewBar::~CViewBar()
{
}
BEGIN_MESSAGE_MAP(CViewBar, TViewBarBase)
//{{AFX_MSG_MAP(CViewBar)
ON_WM_CREATE()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CViewBar message handlers/* ---------------------------------------------------------------
Overridden to set the view class before calling the
base create function. Note the other version of the create
function is "obsolete" so I don't support it.
For an SDI application the main frame window is created
when the document template is created and a valid
CreateContext is passed through (hurray!). Meaning there is
no problem creating the ViewBar in the frame window create.
However, for an MDI application the main frame window is
constructed outside the document creation, so the
CreateContext isn't present. In this case you can either
create and setup a CreateContext object with the desired
characteristics (doc template, frame window, etc.) and pass
it, or let the CViewBar::Create() create a CreateContext
with only the runtime class of the view, and the main frame
window set.
--------------------------------------------------------------- */
BOOL CViewBar::Create(
CWnd* pParentWnd,
CRuntimeClass *pViewClass,
CCreateContext *pContext,
LPCTSTR lpszWindowName,
DWORD dwStyle,
UINT nID)
{
ASSERT(pViewClass != NULL);
ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CWnd)));
if (pContext){
memcpy(&m_Context, pContext, sizeof(m_Context));
}
else {
CFrameWnd *fw = (CFrameWnd *)AfxGetMainWnd();
if (fw) {
m_Context.m_pCurrentDoc = fw->GetActiveDocument();
m_Context.m_pCurrentFrame = fw;
}
}
m_Context.m_pNewViewClass = pViewClass;
return TViewBarBase::Create(
lpszWindowName,
pParentWnd,
nID,
dwStyle);
}
/* ---------------------------------------------------------------
Create the frame window associated with the view bar.
--------------------------------------------------------------- */
int CViewBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (TViewBarBase::OnCreate(lpCreateStruct) == -1)
return -1; if (!m_pFrameWnd->Create(NULL, NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
CRect(0,0,0,0), this, NULL, 0,
&m_Context))
return -1;
return 0;
}
/* ---------------------------------------------------------------
Must remember to move the frame window as well...
--------------------------------------------------------------- */
void CViewBar::OnSize(UINT nType, int cx, int cy)
{
CRect rc; TViewBarBase::OnSize(nType, cx, cy);
GetClientRect(rc);
if(::IsWindow(m_pFrameWnd->GetSafeHwnd()))
m_pFrameWnd->MoveWindow(rc);
}
m_Context.m_pCurrentDoc = fw->GetActiveDocument();
你加的这一段代码,原先我也试过了,我现在也懂它的意思,不过不知道为什么原先我取不到那个指针,hehe控件作者给我一段代码,你看看:
Get a pointer to the view.
--------------------------------------------------------------- */
CWnd *CViewBar::GetView() const
{
ASSERT_VALID(this);CWnd* pView = m_pFrameWnd->GetDlgItem(AFX_IDW_PANE_FIRST);
ASSERT(pView != NULL);
return pView;
}