请各位高手帮帮忙!
11 个解决方案
#1
楼主参考老贴
http://topic.csdn.net/t/20000721/11/16160.html
偶建议你左边用XHtmlTree,因为那个帅很多。。。。呵呵
http://topic.csdn.net/t/20000721/11/16160.html
偶建议你左边用XHtmlTree,因为那个帅很多。。。。呵呵
#2
上面的方法是先删除了先前的视图然后重新创建视图,我试了一下,出现了不明错误。我看过单窗口的多个视图切换是先获得当前活动视图指针,然后把它隐藏起来,显示另一个视图。但是切分窗口后是怎么用这个方法实现不同视图的切换?
#3
左边CTreeCtrl,右边CFormView+CTabCtrl?
#4
左边是CTreeView,右边我想在各个CFormView、CListView或者基于其他类视图之间切换,可以这样实现吗?请指教
#5
#6
是呀,我最近的项目也遇到了此问题了,顶起来,请大侠们多多指教呀
#7
1.首先,单击树形列表子项的时候,要的到当前子项的文本。
添加树形控件的单击消息NM_CLICK映射代码:
// TODO: Add your control notification handler code here
//找到当前项的信息。
CPoint pt;
UINT nFlags;
::GetCursorPos(&pt);
::ScreenToClient(m_ctlTree_Dir.m_hWnd, &pt);
HTREEITEM ht = m_ctlTree_Dir.HitTest(pt,&nFlags); //ht代表所选择项的句柄
MessageBox(m_ctlTree_Dir.GetItemText(ht)); //显示所选择项的文本
2.关于视图的切换。所有的视图类都是从CWnd类直接或者间接派生,因此视图类都可以使用ShowWindow(1)显示,ShowWindow(0)隐藏
对某个视图对象调用这个函数可以使其视图窗口显示或者隐藏,从而实现视图切换。
3.各个切分视图之间的通讯。
有时候,当操作了视图A时,要求视图B产生某些动作,这就是视图间的通讯问题
方法1:
在文档中定义其关联的所有视图的指针变量,然后在文档的OnNewDocument函数中遍历该文档对应的所有视图,并将找到的视图的指针赋值给这些成员变量。在视图中,只要通过
GetDocument()函数得到其关联的文档,便得到了所有视图的指针。
当OnNewDocument这个函数执行之前,所有的视图(包括为切分窗格新定义的视图)都已经创建完毕,都已经存在于文档对应的视图列表中了,所以这个方法可行。
假如文档对应2个视图:CStringView,CHexView
在文档类中声明2个指针变量:
public:
CStringView* m_pStringView;
CHexView* m_pHexView;
要在文档类的头文件中添加视图类的声明(不要用#include,因为会出现错误):
class CHexView;
class CStringView;
而在文档类的.cpp文件中包含相关视图的头文件:
#include"HexView.h"
#include"StringView.h"
构造函数中对两个指针赋值
CPoemDoc::CPoemDoc()
{
// TODO: add one-time construction code here
m_pHexView=NULL;
m_pStringView=NULL;
}
//在文档的OnNewDocument()函数中:
BOOL CPoemDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
//
POSITION pos = GetFirstViewPosition(); //获得视图列表中第一个视图的位置pos
while (pos != NULL)
{
CView* pView = GetNextView(pos); //得到位置pos处的视图指针,并将pos设置为下一个视图的位置值
if(pView->IsKindOf(RUNTIME_CLASS(CStringView)) ) //如果找到了CStringView的指针
{
m_pStringView=(CStringView*)pView; //给变量m_pStringView赋值
}
else if(pView->IsKindOf(RUNTIME_CLASS(CHexView)) ) //如果找到了CHexView的指针
{
m_pHexView=(CHexView*)pView; //给变量m_pHexView赋值
}
}
if(m_pHexView==NULL || m_pStringView==NULL)
{
AfxMessageBox("找不到视图");
}
return TRUE;
}
这样,在CStringView中操作CHexView视图时,可以这样:
CPoemDoc* pDoc=this->GetDocument();
CClientDC dc(pDoc->m_pHexView); //pDoc->m_pHexView表示CHexView的指针
dc.TextOut(100,100,pDoc->m_pHexView->str); //将CHexView中的str变量输出
------------------------------------------------------------------------------------------------------------------------
方法2:
原理是:应用程序执行的时候,应用程序中的所有窗口组成一个列表,在Z轴上按次序排列。通过查找这个列表,可以得到所有的窗口。
举例:
假如有两个视图类CHexView和CStringView,而且这两个视图类不一定都是属于同一个文档。
要求在视图CHexView中单击鼠标左键,然后再视图CStringView中绘制文本"CHexView has been clicked!"
void CHexView::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd* pMyWnd=NULL;
CWnd* pTempWnd=NULL;
CStringView* pView=NULL; //定义目标视图指针,以便对其进行操作
//先向下查找
pTempWnd=GetNextWindow();
while(pTempWnd)
{
if(pTempWnd->GetRuntimeClass()->m_lpszClassName == "CStringView")//通过视图类的GetRuntimeClass()函数,得到运行时信息,然后找到类名称作比较
{//如果找到目标类名称。
pMyWnd=pTempWnd;
pView=(CStringView*)pTempWnd; //将找到的视图的指针赋值给pView
pTempWnd=NULL;
}
else
{
pTempWnd=pTempWnd->GetNextWindow();
}
}
//如果找不到,就向上查找
if(!pMyWnd)
{
pTempWnd=GetNextWindow(GW_HWNDPREV);
while(pTempWnd)
{
if(pTempWnd->GetRuntimeClass()->m_lpszClassName == "CStringView")
{
pMyWnd=pTempWnd;
pView=(CStringView*)pTempWnd;
pTempWnd=NULL;
}
else
{
pTempWnd=pTempWnd->GetNextWindow(GW_HWNDPREV);
}
}
}
//找不到时的提示信息
if(!pMyWnd)
{
MessageBox("找不到指定窗口!");
return ;
}
//在目标视图绘制文本
CClientDC dc(pView);
dc.SetBkMode(TRANSPARENT); //文字背景设置为透明。OPAQUE表示文字背景为当前背景刷子。
dc.TextOut(100,100,"CHexView has been clicked!");
CLogScrollView::OnLButtonDown(nFlags, point);
}
方法2。
在文档中定义所有其关联的视图的指针。假如有2个视图CHexView,CStringView
添加树形控件的单击消息NM_CLICK映射代码:
// TODO: Add your control notification handler code here
//找到当前项的信息。
CPoint pt;
UINT nFlags;
::GetCursorPos(&pt);
::ScreenToClient(m_ctlTree_Dir.m_hWnd, &pt);
HTREEITEM ht = m_ctlTree_Dir.HitTest(pt,&nFlags); //ht代表所选择项的句柄
MessageBox(m_ctlTree_Dir.GetItemText(ht)); //显示所选择项的文本
2.关于视图的切换。所有的视图类都是从CWnd类直接或者间接派生,因此视图类都可以使用ShowWindow(1)显示,ShowWindow(0)隐藏
对某个视图对象调用这个函数可以使其视图窗口显示或者隐藏,从而实现视图切换。
3.各个切分视图之间的通讯。
有时候,当操作了视图A时,要求视图B产生某些动作,这就是视图间的通讯问题
方法1:
在文档中定义其关联的所有视图的指针变量,然后在文档的OnNewDocument函数中遍历该文档对应的所有视图,并将找到的视图的指针赋值给这些成员变量。在视图中,只要通过
GetDocument()函数得到其关联的文档,便得到了所有视图的指针。
当OnNewDocument这个函数执行之前,所有的视图(包括为切分窗格新定义的视图)都已经创建完毕,都已经存在于文档对应的视图列表中了,所以这个方法可行。
假如文档对应2个视图:CStringView,CHexView
在文档类中声明2个指针变量:
public:
CStringView* m_pStringView;
CHexView* m_pHexView;
要在文档类的头文件中添加视图类的声明(不要用#include,因为会出现错误):
class CHexView;
class CStringView;
而在文档类的.cpp文件中包含相关视图的头文件:
#include"HexView.h"
#include"StringView.h"
构造函数中对两个指针赋值
CPoemDoc::CPoemDoc()
{
// TODO: add one-time construction code here
m_pHexView=NULL;
m_pStringView=NULL;
}
//在文档的OnNewDocument()函数中:
BOOL CPoemDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
//
POSITION pos = GetFirstViewPosition(); //获得视图列表中第一个视图的位置pos
while (pos != NULL)
{
CView* pView = GetNextView(pos); //得到位置pos处的视图指针,并将pos设置为下一个视图的位置值
if(pView->IsKindOf(RUNTIME_CLASS(CStringView)) ) //如果找到了CStringView的指针
{
m_pStringView=(CStringView*)pView; //给变量m_pStringView赋值
}
else if(pView->IsKindOf(RUNTIME_CLASS(CHexView)) ) //如果找到了CHexView的指针
{
m_pHexView=(CHexView*)pView; //给变量m_pHexView赋值
}
}
if(m_pHexView==NULL || m_pStringView==NULL)
{
AfxMessageBox("找不到视图");
}
return TRUE;
}
这样,在CStringView中操作CHexView视图时,可以这样:
CPoemDoc* pDoc=this->GetDocument();
CClientDC dc(pDoc->m_pHexView); //pDoc->m_pHexView表示CHexView的指针
dc.TextOut(100,100,pDoc->m_pHexView->str); //将CHexView中的str变量输出
------------------------------------------------------------------------------------------------------------------------
方法2:
原理是:应用程序执行的时候,应用程序中的所有窗口组成一个列表,在Z轴上按次序排列。通过查找这个列表,可以得到所有的窗口。
举例:
假如有两个视图类CHexView和CStringView,而且这两个视图类不一定都是属于同一个文档。
要求在视图CHexView中单击鼠标左键,然后再视图CStringView中绘制文本"CHexView has been clicked!"
void CHexView::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd* pMyWnd=NULL;
CWnd* pTempWnd=NULL;
CStringView* pView=NULL; //定义目标视图指针,以便对其进行操作
//先向下查找
pTempWnd=GetNextWindow();
while(pTempWnd)
{
if(pTempWnd->GetRuntimeClass()->m_lpszClassName == "CStringView")//通过视图类的GetRuntimeClass()函数,得到运行时信息,然后找到类名称作比较
{//如果找到目标类名称。
pMyWnd=pTempWnd;
pView=(CStringView*)pTempWnd; //将找到的视图的指针赋值给pView
pTempWnd=NULL;
}
else
{
pTempWnd=pTempWnd->GetNextWindow();
}
}
//如果找不到,就向上查找
if(!pMyWnd)
{
pTempWnd=GetNextWindow(GW_HWNDPREV);
while(pTempWnd)
{
if(pTempWnd->GetRuntimeClass()->m_lpszClassName == "CStringView")
{
pMyWnd=pTempWnd;
pView=(CStringView*)pTempWnd;
pTempWnd=NULL;
}
else
{
pTempWnd=pTempWnd->GetNextWindow(GW_HWNDPREV);
}
}
}
//找不到时的提示信息
if(!pMyWnd)
{
MessageBox("找不到指定窗口!");
return ;
}
//在目标视图绘制文本
CClientDC dc(pView);
dc.SetBkMode(TRANSPARENT); //文字背景设置为透明。OPAQUE表示文字背景为当前背景刷子。
dc.TextOut(100,100,"CHexView has been clicked!");
CLogScrollView::OnLButtonDown(nFlags, point);
}
方法2。
在文档中定义所有其关联的视图的指针。假如有2个视图CHexView,CStringView
#8
这个应该是个老问题了,我当初也遇到这样的问题,现在的方法很多,楼上几位的就够用了
#9
void CMySplitterWnd::ReplaceView(int row, int col, CRuntimeClass* pNewClass)//替换View
{
CView *pOldView=(CView*)GetPane(0,0);
ASSERT(*pOldView);
int ID=pOldView->GetDlgCtrlID();
CDocument *pDoc=pOldView->GetDocument();
CCreateContext context;
context.m_pCurrentDoc=pDoc;
context.m_pNewViewClass=pNewClass;
context.m_pNewDocTemplate=pDoc?pDoc->GetDocTemplate():NULL;
context.m_pCurrentFrame=NULL;
context.m_pLastView=NULL;
CWnd *pWnd;
pWnd=(CWnd*)context.m_pNewViewClass->CreateObject();
ASSERT_KINDOF(CWnd, pWnd);
ASSERT(pWnd->m_hWnd == NULL); // not yet created.
if(!pWnd->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,ID,&context))
{
TRACE0( "Warning: couldn't create new view.\n" );
// pWnd will be cleaned up by PostNcDestroy
return ;
}
pOldView->ShowWindow(SW_HIDE);
pOldView->SetDlgCtrlID(0);
RecalcLayout();
CView *pNewView=DYNAMIC_DOWNCAST(CView,GetPane(row,col) );
ASSERT_KINDOF(CView,pNewView);
pNewView->OnInitialUpdate();
}
#10
1.把原VIEW的CCreateText保存下来,用于新视的创建.
2.注意CSplitterWnd里的ID.也一样.CSplitterWnd对ID有固定要求吧.
2.注意CSplitterWnd里的ID.也一样.CSplitterWnd对ID有固定要求吧.
#11
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
#1
楼主参考老贴
http://topic.csdn.net/t/20000721/11/16160.html
偶建议你左边用XHtmlTree,因为那个帅很多。。。。呵呵
http://topic.csdn.net/t/20000721/11/16160.html
偶建议你左边用XHtmlTree,因为那个帅很多。。。。呵呵
#2
上面的方法是先删除了先前的视图然后重新创建视图,我试了一下,出现了不明错误。我看过单窗口的多个视图切换是先获得当前活动视图指针,然后把它隐藏起来,显示另一个视图。但是切分窗口后是怎么用这个方法实现不同视图的切换?
#3
左边CTreeCtrl,右边CFormView+CTabCtrl?
#4
左边是CTreeView,右边我想在各个CFormView、CListView或者基于其他类视图之间切换,可以这样实现吗?请指教
#5
#6
是呀,我最近的项目也遇到了此问题了,顶起来,请大侠们多多指教呀
#7
1.首先,单击树形列表子项的时候,要的到当前子项的文本。
添加树形控件的单击消息NM_CLICK映射代码:
// TODO: Add your control notification handler code here
//找到当前项的信息。
CPoint pt;
UINT nFlags;
::GetCursorPos(&pt);
::ScreenToClient(m_ctlTree_Dir.m_hWnd, &pt);
HTREEITEM ht = m_ctlTree_Dir.HitTest(pt,&nFlags); //ht代表所选择项的句柄
MessageBox(m_ctlTree_Dir.GetItemText(ht)); //显示所选择项的文本
2.关于视图的切换。所有的视图类都是从CWnd类直接或者间接派生,因此视图类都可以使用ShowWindow(1)显示,ShowWindow(0)隐藏
对某个视图对象调用这个函数可以使其视图窗口显示或者隐藏,从而实现视图切换。
3.各个切分视图之间的通讯。
有时候,当操作了视图A时,要求视图B产生某些动作,这就是视图间的通讯问题
方法1:
在文档中定义其关联的所有视图的指针变量,然后在文档的OnNewDocument函数中遍历该文档对应的所有视图,并将找到的视图的指针赋值给这些成员变量。在视图中,只要通过
GetDocument()函数得到其关联的文档,便得到了所有视图的指针。
当OnNewDocument这个函数执行之前,所有的视图(包括为切分窗格新定义的视图)都已经创建完毕,都已经存在于文档对应的视图列表中了,所以这个方法可行。
假如文档对应2个视图:CStringView,CHexView
在文档类中声明2个指针变量:
public:
CStringView* m_pStringView;
CHexView* m_pHexView;
要在文档类的头文件中添加视图类的声明(不要用#include,因为会出现错误):
class CHexView;
class CStringView;
而在文档类的.cpp文件中包含相关视图的头文件:
#include"HexView.h"
#include"StringView.h"
构造函数中对两个指针赋值
CPoemDoc::CPoemDoc()
{
// TODO: add one-time construction code here
m_pHexView=NULL;
m_pStringView=NULL;
}
//在文档的OnNewDocument()函数中:
BOOL CPoemDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
//
POSITION pos = GetFirstViewPosition(); //获得视图列表中第一个视图的位置pos
while (pos != NULL)
{
CView* pView = GetNextView(pos); //得到位置pos处的视图指针,并将pos设置为下一个视图的位置值
if(pView->IsKindOf(RUNTIME_CLASS(CStringView)) ) //如果找到了CStringView的指针
{
m_pStringView=(CStringView*)pView; //给变量m_pStringView赋值
}
else if(pView->IsKindOf(RUNTIME_CLASS(CHexView)) ) //如果找到了CHexView的指针
{
m_pHexView=(CHexView*)pView; //给变量m_pHexView赋值
}
}
if(m_pHexView==NULL || m_pStringView==NULL)
{
AfxMessageBox("找不到视图");
}
return TRUE;
}
这样,在CStringView中操作CHexView视图时,可以这样:
CPoemDoc* pDoc=this->GetDocument();
CClientDC dc(pDoc->m_pHexView); //pDoc->m_pHexView表示CHexView的指针
dc.TextOut(100,100,pDoc->m_pHexView->str); //将CHexView中的str变量输出
------------------------------------------------------------------------------------------------------------------------
方法2:
原理是:应用程序执行的时候,应用程序中的所有窗口组成一个列表,在Z轴上按次序排列。通过查找这个列表,可以得到所有的窗口。
举例:
假如有两个视图类CHexView和CStringView,而且这两个视图类不一定都是属于同一个文档。
要求在视图CHexView中单击鼠标左键,然后再视图CStringView中绘制文本"CHexView has been clicked!"
void CHexView::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd* pMyWnd=NULL;
CWnd* pTempWnd=NULL;
CStringView* pView=NULL; //定义目标视图指针,以便对其进行操作
//先向下查找
pTempWnd=GetNextWindow();
while(pTempWnd)
{
if(pTempWnd->GetRuntimeClass()->m_lpszClassName == "CStringView")//通过视图类的GetRuntimeClass()函数,得到运行时信息,然后找到类名称作比较
{//如果找到目标类名称。
pMyWnd=pTempWnd;
pView=(CStringView*)pTempWnd; //将找到的视图的指针赋值给pView
pTempWnd=NULL;
}
else
{
pTempWnd=pTempWnd->GetNextWindow();
}
}
//如果找不到,就向上查找
if(!pMyWnd)
{
pTempWnd=GetNextWindow(GW_HWNDPREV);
while(pTempWnd)
{
if(pTempWnd->GetRuntimeClass()->m_lpszClassName == "CStringView")
{
pMyWnd=pTempWnd;
pView=(CStringView*)pTempWnd;
pTempWnd=NULL;
}
else
{
pTempWnd=pTempWnd->GetNextWindow(GW_HWNDPREV);
}
}
}
//找不到时的提示信息
if(!pMyWnd)
{
MessageBox("找不到指定窗口!");
return ;
}
//在目标视图绘制文本
CClientDC dc(pView);
dc.SetBkMode(TRANSPARENT); //文字背景设置为透明。OPAQUE表示文字背景为当前背景刷子。
dc.TextOut(100,100,"CHexView has been clicked!");
CLogScrollView::OnLButtonDown(nFlags, point);
}
方法2。
在文档中定义所有其关联的视图的指针。假如有2个视图CHexView,CStringView
添加树形控件的单击消息NM_CLICK映射代码:
// TODO: Add your control notification handler code here
//找到当前项的信息。
CPoint pt;
UINT nFlags;
::GetCursorPos(&pt);
::ScreenToClient(m_ctlTree_Dir.m_hWnd, &pt);
HTREEITEM ht = m_ctlTree_Dir.HitTest(pt,&nFlags); //ht代表所选择项的句柄
MessageBox(m_ctlTree_Dir.GetItemText(ht)); //显示所选择项的文本
2.关于视图的切换。所有的视图类都是从CWnd类直接或者间接派生,因此视图类都可以使用ShowWindow(1)显示,ShowWindow(0)隐藏
对某个视图对象调用这个函数可以使其视图窗口显示或者隐藏,从而实现视图切换。
3.各个切分视图之间的通讯。
有时候,当操作了视图A时,要求视图B产生某些动作,这就是视图间的通讯问题
方法1:
在文档中定义其关联的所有视图的指针变量,然后在文档的OnNewDocument函数中遍历该文档对应的所有视图,并将找到的视图的指针赋值给这些成员变量。在视图中,只要通过
GetDocument()函数得到其关联的文档,便得到了所有视图的指针。
当OnNewDocument这个函数执行之前,所有的视图(包括为切分窗格新定义的视图)都已经创建完毕,都已经存在于文档对应的视图列表中了,所以这个方法可行。
假如文档对应2个视图:CStringView,CHexView
在文档类中声明2个指针变量:
public:
CStringView* m_pStringView;
CHexView* m_pHexView;
要在文档类的头文件中添加视图类的声明(不要用#include,因为会出现错误):
class CHexView;
class CStringView;
而在文档类的.cpp文件中包含相关视图的头文件:
#include"HexView.h"
#include"StringView.h"
构造函数中对两个指针赋值
CPoemDoc::CPoemDoc()
{
// TODO: add one-time construction code here
m_pHexView=NULL;
m_pStringView=NULL;
}
//在文档的OnNewDocument()函数中:
BOOL CPoemDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
//
POSITION pos = GetFirstViewPosition(); //获得视图列表中第一个视图的位置pos
while (pos != NULL)
{
CView* pView = GetNextView(pos); //得到位置pos处的视图指针,并将pos设置为下一个视图的位置值
if(pView->IsKindOf(RUNTIME_CLASS(CStringView)) ) //如果找到了CStringView的指针
{
m_pStringView=(CStringView*)pView; //给变量m_pStringView赋值
}
else if(pView->IsKindOf(RUNTIME_CLASS(CHexView)) ) //如果找到了CHexView的指针
{
m_pHexView=(CHexView*)pView; //给变量m_pHexView赋值
}
}
if(m_pHexView==NULL || m_pStringView==NULL)
{
AfxMessageBox("找不到视图");
}
return TRUE;
}
这样,在CStringView中操作CHexView视图时,可以这样:
CPoemDoc* pDoc=this->GetDocument();
CClientDC dc(pDoc->m_pHexView); //pDoc->m_pHexView表示CHexView的指针
dc.TextOut(100,100,pDoc->m_pHexView->str); //将CHexView中的str变量输出
------------------------------------------------------------------------------------------------------------------------
方法2:
原理是:应用程序执行的时候,应用程序中的所有窗口组成一个列表,在Z轴上按次序排列。通过查找这个列表,可以得到所有的窗口。
举例:
假如有两个视图类CHexView和CStringView,而且这两个视图类不一定都是属于同一个文档。
要求在视图CHexView中单击鼠标左键,然后再视图CStringView中绘制文本"CHexView has been clicked!"
void CHexView::OnLButtonDown(UINT nFlags, CPoint point)
{
CWnd* pMyWnd=NULL;
CWnd* pTempWnd=NULL;
CStringView* pView=NULL; //定义目标视图指针,以便对其进行操作
//先向下查找
pTempWnd=GetNextWindow();
while(pTempWnd)
{
if(pTempWnd->GetRuntimeClass()->m_lpszClassName == "CStringView")//通过视图类的GetRuntimeClass()函数,得到运行时信息,然后找到类名称作比较
{//如果找到目标类名称。
pMyWnd=pTempWnd;
pView=(CStringView*)pTempWnd; //将找到的视图的指针赋值给pView
pTempWnd=NULL;
}
else
{
pTempWnd=pTempWnd->GetNextWindow();
}
}
//如果找不到,就向上查找
if(!pMyWnd)
{
pTempWnd=GetNextWindow(GW_HWNDPREV);
while(pTempWnd)
{
if(pTempWnd->GetRuntimeClass()->m_lpszClassName == "CStringView")
{
pMyWnd=pTempWnd;
pView=(CStringView*)pTempWnd;
pTempWnd=NULL;
}
else
{
pTempWnd=pTempWnd->GetNextWindow(GW_HWNDPREV);
}
}
}
//找不到时的提示信息
if(!pMyWnd)
{
MessageBox("找不到指定窗口!");
return ;
}
//在目标视图绘制文本
CClientDC dc(pView);
dc.SetBkMode(TRANSPARENT); //文字背景设置为透明。OPAQUE表示文字背景为当前背景刷子。
dc.TextOut(100,100,"CHexView has been clicked!");
CLogScrollView::OnLButtonDown(nFlags, point);
}
方法2。
在文档中定义所有其关联的视图的指针。假如有2个视图CHexView,CStringView
#8
这个应该是个老问题了,我当初也遇到这样的问题,现在的方法很多,楼上几位的就够用了
#9
void CMySplitterWnd::ReplaceView(int row, int col, CRuntimeClass* pNewClass)//替换View
{
CView *pOldView=(CView*)GetPane(0,0);
ASSERT(*pOldView);
int ID=pOldView->GetDlgCtrlID();
CDocument *pDoc=pOldView->GetDocument();
CCreateContext context;
context.m_pCurrentDoc=pDoc;
context.m_pNewViewClass=pNewClass;
context.m_pNewDocTemplate=pDoc?pDoc->GetDocTemplate():NULL;
context.m_pCurrentFrame=NULL;
context.m_pLastView=NULL;
CWnd *pWnd;
pWnd=(CWnd*)context.m_pNewViewClass->CreateObject();
ASSERT_KINDOF(CWnd, pWnd);
ASSERT(pWnd->m_hWnd == NULL); // not yet created.
if(!pWnd->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,ID,&context))
{
TRACE0( "Warning: couldn't create new view.\n" );
// pWnd will be cleaned up by PostNcDestroy
return ;
}
pOldView->ShowWindow(SW_HIDE);
pOldView->SetDlgCtrlID(0);
RecalcLayout();
CView *pNewView=DYNAMIC_DOWNCAST(CView,GetPane(row,col) );
ASSERT_KINDOF(CView,pNewView);
pNewView->OnInitialUpdate();
}
#10
1.把原VIEW的CCreateText保存下来,用于新视的创建.
2.注意CSplitterWnd里的ID.也一样.CSplitterWnd对ID有固定要求吧.
2.注意CSplitterWnd里的ID.也一样.CSplitterWnd对ID有固定要求吧.
#11
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知
见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法