我想实现这样的功能:
文档包含一个过程列表,视图只显示其中一个过程,具体如下:1、首先自定义两种数据结构:CProcess(过程)和CPakage(包),其中CProcess只包含一个名称属性,而CPakage包含一个名称属性和一个CProcess对象列表,如下:#include <afxtempl.h>//过程
class CProcess : public CObject
{
//操作
public:
...
//数据
public:
CString m_strProcessName;
};//定义一个CProcess列表
typedef CTypedPtrList<CObList,CProcess*> CProcessList;//包
class CPakage : public CObject
{
//操作
public:
...
//数据
public:
CString m_strPakageName;
CProcessList m_listProcess;
};2、在文档中就包含一个CPakage对象(一个文件就是一个CPakage对象)和一个用于在视图中显示的CProcess对象,如下:class CTestDoc : public CDocument
{
// 其他操作
public:
...
//数据
public:
CPakage m_Pakage;//包
CProcess* m_pCurProcess;//当前过程--用于在视图中显示};3、包(m_Pakage)和当前过程(m_pCurProcess)的初始化如下:
CTestDoc::CTestDoc()
{
//包中加入10个过程;
for(int i=1;i<=10;i++)
{
CProcess* pTempProcess=new CProcess;
CString strProcessName="";
strProcessName.Format("Process%d",i);
pTempProcess->m_strProcessName=strProcessName;
m_Pakage.m_listProcess.AddTail(pTempProcess);
} //初始化当前过程为包中的第一个过程
m_pCurProcess=m_Pakage.m_listProcess.GetHead();}4、视图的OnDraw函数只显示当前过程的过程名称,如下:
void CTest::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(10,10,
pDoc->m_pCurProcess->m_strProcessName);
}5、下面我想实现的是,当我双击视图窗口的时候,新建一个窗口,显示最后一个过程的名称,而不更新原来的视图:
void CTestView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->m_pCurProcess=pDoc->m_Pakage.m_listProcess.GetTail(); //要求:theApp要用extern声明,CTestApp的初始化函数中的pDocTemplate变量要作为CTestApp的public型成员变量,而不是作为一个临时变量。 //1-创建新的框架窗口(还有它的子窗口)
CFrameWnd* pFrame=theApp.pDocTemplate->CreateNewFrame(
pDoc,NULL); //2-告诉框架自我更新(还有它的子窗口)
theApp.pDocTemplate->InitialUpdateFrame(pFrame,pDoc); //????如何做才能不更新原来的视图呢???
CView::OnLButtonDblClk(nFlags, point);
}6、运行结果是:原来的视图窗口也更新了,我知道这是一定会发生的,但是我想实现的就是让原来的视图不更新,并进一步扩展为可以任意选择某个过程为其新建一个窗口显示。请问如何实现?
文档包含一个过程列表,视图只显示其中一个过程,具体如下:1、首先自定义两种数据结构:CProcess(过程)和CPakage(包),其中CProcess只包含一个名称属性,而CPakage包含一个名称属性和一个CProcess对象列表,如下:#include <afxtempl.h>//过程
class CProcess : public CObject
{
//操作
public:
...
//数据
public:
CString m_strProcessName;
};//定义一个CProcess列表
typedef CTypedPtrList<CObList,CProcess*> CProcessList;//包
class CPakage : public CObject
{
//操作
public:
...
//数据
public:
CString m_strPakageName;
CProcessList m_listProcess;
};2、在文档中就包含一个CPakage对象(一个文件就是一个CPakage对象)和一个用于在视图中显示的CProcess对象,如下:class CTestDoc : public CDocument
{
// 其他操作
public:
...
//数据
public:
CPakage m_Pakage;//包
CProcess* m_pCurProcess;//当前过程--用于在视图中显示};3、包(m_Pakage)和当前过程(m_pCurProcess)的初始化如下:
CTestDoc::CTestDoc()
{
//包中加入10个过程;
for(int i=1;i<=10;i++)
{
CProcess* pTempProcess=new CProcess;
CString strProcessName="";
strProcessName.Format("Process%d",i);
pTempProcess->m_strProcessName=strProcessName;
m_Pakage.m_listProcess.AddTail(pTempProcess);
} //初始化当前过程为包中的第一个过程
m_pCurProcess=m_Pakage.m_listProcess.GetHead();}4、视图的OnDraw函数只显示当前过程的过程名称,如下:
void CTest::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->TextOut(10,10,
pDoc->m_pCurProcess->m_strProcessName);
}5、下面我想实现的是,当我双击视图窗口的时候,新建一个窗口,显示最后一个过程的名称,而不更新原来的视图:
void CTestView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->m_pCurProcess=pDoc->m_Pakage.m_listProcess.GetTail(); //要求:theApp要用extern声明,CTestApp的初始化函数中的pDocTemplate变量要作为CTestApp的public型成员变量,而不是作为一个临时变量。 //1-创建新的框架窗口(还有它的子窗口)
CFrameWnd* pFrame=theApp.pDocTemplate->CreateNewFrame(
pDoc,NULL); //2-告诉框架自我更新(还有它的子窗口)
theApp.pDocTemplate->InitialUpdateFrame(pFrame,pDoc); //????如何做才能不更新原来的视图呢???
CView::OnLButtonDblClk(nFlags, point);
}6、运行结果是:原来的视图窗口也更新了,我知道这是一定会发生的,但是我想实现的就是让原来的视图不更新,并进一步扩展为可以任意选择某个过程为其新建一个窗口显示。请问如何实现?
解决方案 »
- 今天发现 codeproject 无法打开了,有人遇到过没
- 求救:wininet URL GET方式发送URL 过长 怎么办 字符不到1024个字符
- 奇怪的问题,谁遇到过?一个CString csValue="191.319" ,想把它转成double形,再保留一位小数,怎么办?
- ratUserPassword ---> ias (Internet验证服务)扩展DLL
- 如何使编辑框自动滚屏
- 请教高手,我现在想通过一个对象(Object)即COM来操作数据库,详情请进来看看!
- 驱动程序开发 ENDPOINT的个数
- CMFCRibbonStatusBar问题
- 知道系统进程的ID,如何能获得该进程主窗口的句柄呢?急,最好能有原程序!谢了!
- 求大佬解决问题,VS2015,0xC0000005: 写入位置 0x0042B000 时发生访问冲突。
- 关于float,SOS!!
- 寻求解决方案(给分)
是不是导致你所有的VIEW都更新了?
你可能在每个视图中的更新显示中加入:IF 这个视图 <> 当前活动视图 THEN
不更新显示
ESLE
才更新
END IF