fancyliujing的个人博客分享 http://blog.sciencenet.cn/u/fancyliujing

博文

在对话框窗体上创建视图

已有 8383 次阅读 2009-11-19 14:15 |个人分类:未分类|系统分类:科研笔记| 对话框, 视图

    通常我们在设计算法的时候需要一个比较简单的人机交互界面,那么数据的调整与现实就显得必不可少,VC++通常是将文档视图框架作为一个整体展现给我们,这样在某一个子步骤中难免有很多麻烦,我的想法是在以对话框为框架,左边为数据的输入与调整,右边需要显示数据进行交互,那么我们就不需要利用MFC本身的文档视图结构,从而实现自己想要的功能。

1、我的想法是在MDI工程中通过一个菜单命令调用一个动态创建的无模式对话框,然后在无模式对话框上放置了一个静态控件,这个静态控件主要是用来实现一个区域的作用,这个区域用来固定显示VIEW动态创建后显示的区域。

2、利用Wizard生成一个基于CView的CTestView类;在CtestView类中声明一个成员变量Pview;在对话框中添加如下代码:

void  CDephData_Dlg::CreateView()  
{   
  CRect rect;  
 CWnd *pWnd=GetDlgItem(IDC_STATIC5);   //获得静态控件的指针
 pWnd->GetWindowRect(&rect);//获得静态控件的位置
 pWnd->DestroyWindow();//必须销毁静态窗体,否则视图是依附在静态控件上
 ScreenToClient(&rect);
 CCreateContext cx;   
 cx.m_pNewViewClass=RUNTIME_CLASS(CSplitLayerView);  
 cx.m_pCurrentDoc=NULL;    
 CFrameWnd* pfWnd=(CFrameWnd*)this;  
    pView=(CSplitLayerView*)pfWnd->CreateView(&cx);
// pView->SetScrollSizes(MM_TEXT,CSize(2000,2000));//当你继承的基类是滚动视图类时这句很重要,需要设置视的大小
 pView->MoveWindow(&rect); 

3、不过又有了一个新的问题,对话框中生成后如果点击视图区域,就会出现内存错误,当忽略后如果想要退出系统就退不出去了。

通过寻找相关信息发现,发现当没有给CView使用DYNAMIC_CREATE宏时,MFC不调用OnMouseActivate所以在这里需要进行处理。于是在创建的视图类中间手工添加消息映射ON_MESSAGE(WM_MOUSEACTIVATE,   OnMouseActivate)   ,并实现OnMouseActivate消息

int CTestView::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT msg)
{
return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, msg);
}

运行程序,OK,成功!

希望能给那些需要的朋友提供一点帮助



https://blog.sciencenet.cn/blog-272367-272197.html

上一篇:VC之读取任意格式的文本文件
下一篇:滚动视图里绘图关于刷新
收藏 IP: .*| 热度|

0

发表评论 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-26 15:07

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部