100分求解 文档/视图 问题!~~~~~~~~~~~~~

nystroM 2005-03-06 11:45:07
一个单文档项目

我自己为默认文档添加了一个View

当我切换项目自动生成的View(DefaultView)和我添加的这个View(MyView)时:

1 如何将MyView自动填充框架空白区域?我是先取得ActiveView(也就是DefaultView)的RECT,将其给MyView,结果上面少一条,把下面的StatusBar盖住了。。。也就是有偏差。

2 关键的问题是。。。。。。。。。我的MyView不可以自动充满FrameWnd,也就是切换到显示MyView的时候,把上面几个ControlBar浮起来,MyView尺寸不变。。。。而切回去DefaultView,则一切正常,自动调整尺寸。

我想请教大家的是:
我是给框架的ActiveDocument添加的一个View,和默认View类一样,为什么默认生成的View有着和MyView不一样的性能?我想区别具体在哪个地方?呵呵~~~如果谁能帮我把问题1也解决那更好了^^

多谢!

附我添加View的方法:
CCreateContext* pCrContext = new CCreateContext;
pCrContext->m_pCurrentDoc = this->GetActiveDocument();
pCrContext->m_pNewViewClass = NULL;
pCrContext->m_pCurrentFrame = NULL;
pCrContext->m_pLastView = NULL;
pCrContext->m_pNewDocTemplate = this->GetActiveDocument()->GetDocTemplate();

CMyView* pView = new CMyView;
pView->Create(NULL, NULL, WS_CHILD|WS_VISIBLE, rectDefault, this, NULL, pCrContext);
...全文
125 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nystroM 2005-03-08
  • 打赏
  • 举报
回复
多谢大家了!给了我很多启发,这么点分真不好意思~
idontlikenickname 2005-03-07
  • 打赏
  • 举报
回复


MFC经典问答中的源码:
全局函数,直接调用就行。

第一个参数是主框架指针,后一个这样用:RUNTIME_CLASS(CYourNewView)。

void SwitchViewInFrame(CFrameWnd *pFrame, CRuntimeClass *pViewClass)
{
ASSERT_VALID(pFrame);

ASSERT(pViewClass != NULL);

ASSERT(pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)));

CView *pActiveView = pFrame->GetActiveView();
if(pActiveView == NULL)
{
// No active view.
return;
}

if(pActiveView->IsKindOf(pViewClass))
{
// The same view.
return;
}

CRect rcView;
pActiveView->GetWindowRect(&rcView);

CDocument *pDoc = pActiveView->GetDocument();
ASSERT_VALID(pDoc);

BOOL bSaveAutoDelete = pDoc->m_bAutoDelete;
pDoc->m_bAutoDelete = FALSE;

pActiveView->DestroyWindow();

pDoc->m_bAutoDelete = bSaveAutoDelete;

CCreateContext context;
context.m_pNewDocTemplate = NULL;
context.m_pLastView = NULL;
context.m_pCurrentFrame = NULL;

context.m_pNewViewClass = pViewClass;
context.m_pCurrentDoc = pDoc;

CView *pNewView = static_cast<CView *>(pFrame->CreateView(&context));
ASSERT_VALID(pNewView);

pFrame->ScreenToClient(&rcView);
pNewView->MoveWindow(&rcView, TRUE);

pFrame->InitialUpdateFrame(pDoc, TRUE);
}

fengqinggao 2005-03-07
  • 打赏
  • 举报
回复
那个值可以这么赋值:
pContext->m_pNewViewClass = RUNTIME_CLASS(CMyView);

你两个View是同一个派生的,那还不如用一个View,然后根据选择不同更新其中的内容呢,这样结构会更紧凑些

如果是同一个类,那确实不好在View类的OnSize()处理,但是可以在CMainFrame的OnSize中处理,将我上面的语句修改一下即可,即先取得正常View的尺寸,然后设置不正常窗口的尺寸
nystroM 2005-03-07
  • 打赏
  • 举报
回复
多谢大家的热情
CreateView好象是FrameWnd的方法呀,他好象要求CCreateContext::pNewViewClass不为NULL,俺不会设这个值。。。。谁教我一下~
fengqinggao(风清高):
我这2个View是一个类,在OnSize()写是什么意思呢?
shxng 2005-03-07
  • 打赏
  • 举报
回复
mark
老夏Max 2005-03-07
  • 打赏
  • 举报
回复
参考例子:
http://www.vckbase.com/document/viewdoc/?id=691
legendhui 2005-03-07
  • 打赏
  • 举报
回复
CreateView
fayifu 2005-03-07
  • 打赏
  • 举报
回复
pView->Create(NULL, NULL, WS_CHILD|WS_VISIBLE, rectDefault, this, NULL, pCrContext);
不要用Create,要用CreateView.
fengqinggao 2005-03-07
  • 打赏
  • 举报
回复
这个问题我碰到过,在你的正常的View(两个中必有一个正常的)的OnSize()函数中,获取另一个View的指针,如你这里的pView(应该设为CMainFrame的成员变量,局部变量用过就扔,不能实现你的功能的),然后进行窗口大小设置,该函数中增加的参考代码如下:
CMainFrame *pMainFrame = (CMainFrame*)AfxGetMainWnd();
if(pMainFrame == NULL || pMainFrame->m_pYourView == NULL)
return;//m_pYourView不正常的View的指针;
CRect oThisRect;
GetWindowRect(oThisRect);
pMainFrame->ScreenToClient(oThisRect);
pMainFrame->m_pYourView->MoveWindow(oThisRect, TRUE);

这样你的两个问题就可以解决
菜牛 2005-03-07
  • 打赏
  • 举报
回复
CreateView()

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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