创建没有Document的MFC MDI应用程序

程序源代码   

效果,如图:


1)
创建一个MFC MDI应用程序,Wizard设置如图,

然后点Finish

2)
CMyTreeView 
在CMyTreeView中新增三个函数,显示些示例数据
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);//本例没有使用该函数
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
virtual void OnInitialUpdate();
源代码如下:
int CMyTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;

CTreeCtrl& m_treeCtrl = GetTreeCtrl();

HTREEITEM hItem;
hItem = m_treeCtrl.InsertItem("node 1", TVI_ROOT);
m_treeCtrl.Expand(hItem, TVE_EXPAND);

hItem = m_treeCtrl.InsertItem("node 2", TVI_ROOT);
m_treeCtrl.Expand(hItem, TVE_EXPAND);

hItem = m_treeCtrl.InsertItem("node 3", hItem);
m_treeCtrl.Expand(hItem, TVE_EXPAND);

return 0;
}

void CMyTreeView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
CTreeCtrl& m_treeCtrl = GetTreeCtrl();
m_treeCtrl.ModifyStyle(0, WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES | TVS_DISABLEDRAGDROP);
}

CMyListView
在CMyListView中新增三个函数,显示些示例数据
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);//本例没有使用该函数
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
virtual void OnInitialUpdate();
源代码如下:

int CMyListView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO:  Add your specialized creation code here
CListCtrl& m_list = GetListCtrl();

CString sTmp = "asdf";//示例数据,代码中最好封装成函数
int iPos = m_list.GetItemCount();
m_list.InsertItem(iPos, sTmp);
m_list.SetItemText(iPos, 1, sTmp+sTmp);

return 0;
}

void CMyListView::OnInitialUpdate()
{
CListView::OnInitialUpdate();

CListCtrl& listCtrl = GetListCtrl();

LONG lStyle;
lStyle = GetWindowLong(listCtrl.m_hWnd, GWL_STYLE);   
lStyle &= ~LVS_TYPEMASK;                            
lStyle |= LVS_REPORT ;          
SetWindowLong(listCtrl.m_hWnd, GWL_STYLE, lStyle);    

DWORD dwStyle = listCtrl.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT | TVS_SHOWSELALWAYS | LVS_EX_FULLROWSELECT;
listCtrl.SetExtendedStyle(dwStyle);

CRect rect;
GetClientRect(&rect);

listCtrl.InsertColumn( 0, "信息",     LVCFMT_CENTER,  rect.Width()/2 );
listCtrl.InsertColumn( 1, "信息2",     LVCFMT_CENTER,  rect.Width()/2 );
}

CFrmChildTree
FrmChildTree.h

class CFrmChildTree : public CMDIChildWnd

#include "MyTreeView.h"
声明一个CMyTreeView数据成员
CMyTreeView m_FrmChildTree;

FrmChildTree.cpp
int CFrmChildTree::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO:  Add your specialized creation code here
if (!m_FrmChildTree.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, 
CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
{
TRACE0("Failed to create view window\n");
return -1;
}

return 0;
}

CFrmChildList

FrmChildList.h

class CFrmChildList : public CMDIChildWnd(with Splitter)

#include "MyListView.h"
最好声明一个MyListView数据成员,用于记录Spliter创建的View,以便以后使用
CMyListView* m_pMyListView;

FrmChildList.cpp
BOOL CFrmChildList::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
//return m_wndSplitter.Create(this,
// 2, 2,       // TODO: adjust the number of rows, columns
// CSize(10, 10),  // TODO: adjust the minimum pane size
// pContext);
// TODO: Add your specialized code here and/or call the base class
CRect rect;
GetClientRect(&rect);
if (!m_wndSplitter.CreateStatic(this, 2, 1))
{
return FALSE;
}
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyListView),CSize(rect.Width(),rect.Height()/5  ),pContext);
m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CMyListView),CSize(rect.Width(),rect.Height()/5  ),pContext);
m_pMyListView = (CMyListView*)m_wndSplitter.GetPane(0, 0);  //... ...

return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}

3)
修改menu:IDR_MFC_MDI_BUT_NO_TYPE
增加:ID_FILE_TREE ID_FILE_LIST 两个菜单,分别为Tree 和 List
在app中响应

app.h

#include "FrmChildList.h"
#include "FrmChildTree.h"

CMDIChildWnd* m_pFrmChildList; //两个CMDIChildWnd对象
CMDIChildWnd* m_pFrmChildTree;

afx_msg void OnFileTree();
afx_msg void OnFileList();

private:
void ActiveChildWnd(CMDIChildWnd* m_pMDIChildWnd);
app.cpp

BOOL CMFC_MDI_BUT_NO_DOCApp::InitInstance()
{
... ...
if( NULL == m_pFrmChildList )
{
m_pFrmChildList =pFrame->CreateNewChild( RUNTIME_CLASS(CFrmChildList), IDR_MFC_MDI_BUT_NO_TYPE, 0, 0);
}
... ...
}

void CMFC_MDI_BUT_NO_DOCApp::OnFileNew() //屏蔽该代码,删除对应的New菜单
{
//CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd);
create a new MDI child window
//pFrame->CreateNewChild(
//RUNTIME_CLASS(CChildFrame), IDR_MFC_MDI_BUT_NO_TYPE, m_hMDIMenu, m_hMDIAccel);
}

void CMFC_MDI_BUT_NO_DOCApp::OnFileTree()
{
// TODO: Add your command handler code here
CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd);
if( NULL == m_pFrmChildTree )
{
m_pFrmChildTree =pFrame->CreateNewChild( RUNTIME_CLASS(CFrmChildTree), IDR_MFC_MDI_BUT_NO_TYPE, 0, 0);
}
else
{
ActiveChildWnd( m_pFrmChildTree );
}
m_pFrmChildTree->SetWindowTextA("Tree");    
}

void CMFC_MDI_BUT_NO_DOCApp::OnFileList()
{
// TODO: Add your command handler code here]
CMainFrame* pFrame = STATIC_DOWNCAST(CMainFrame, m_pMainWnd);
if( NULL == m_pFrmChildList )
{
m_pFrmChildList =pFrame->CreateNewChild( RUNTIME_CLASS(CFrmChildList), IDR_MFC_MDI_BUT_NO_TYPE, 0, 0);
}
else
{
ActiveChildWnd( m_pFrmChildList );
}
m_pFrmChildList->SetWindowTextA("List");
}

void CMFC_MDI_BUT_NO_DOCApp::ActiveChildWnd(CMDIChildWnd* m_pMDIChildWnd)
{
m_pMDIChildWnd->MDIActivate();
}

转载于:https://www.cnblogs.com/zkliuym/archive/2010/04/01/1702168.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《MySQL必知必会》笔记--数据库基础

数据库:  数据库(database) 保存有组织的数据的容器(通常是一个文 件或一组文件)。 表: 表(table) 某种特定类型数据的结构化清单。 模式: 模式(schema&…

[软技能] 请说说使用iconfont图标的优点和缺点

[软技能] 请说说使用iconfont图标的优点和缺点 优点:减少请求次数,将多个 icon 合并到一个字体文件中,从而提高网页性能; 自由的变化大小和颜色,因为字体是可以通过样式来设置大小和颜色的; 矢量图不失真&…

glassfish mysql 配置文件_最新glassfish配置mysql

在百度搜了一个下午,都没有搞定glassfish配置mysql,特别是百度文库中的GlassFish中MySQL连接池配置这篇文章,我不知道它是不是过时了,配一个jdbcConnPool就要写一个mysql.xml,那我要再配一个,岂不是再写一个mysql2.xml…

jQuery选择器的演示

jQuery选择器对于web developer来说可能是再熟悉不过的了,但是我相信还是有很多大家不熟悉的,下面的链接会给你很多帮助http://www.liehuo.net/a/200912/0911381.html PS 前几天发现选择器的兼容性貌似并没有想像的那么好,比如要选出id为aaa的…

Apollo 无人驾驶平台中多传感器标定

传感器标定是无人车最基础也是最核心的模块之一。作为软件层提供的第一项服务,标定质量和准确度极大地影响着感知、定位地图、PNC 等模块。在 Apollo 开源自动驾驶平台中,我们提供了丰富的多传感器标定服务,如激光雷达、惯导、摄像头、多普勒…

mysql数据库的数据类型转换_MySQL 和Server 2000 数据库中数据类型的转换

问题阐述在某些特殊的时候,可能要将MySQL 数据库转换为SQL Server 2000 数据库,这时问题也就随之而来。例如,在MySQL 数据库中,创建的字段使用varchar 类型,该类型的数据可以进行聚合运算,其返回的值是stri…

[软技能] png-8和png-24有什么区别?

[软技能] 第682天 png-8和png-24有什么区别? 1、“PNG8”是bai指8位索引色位图du,“PNG24”是24位索引色位图;2、png8:每一张“png8”图像,都最多只能展示256种颜色,所以“png8”格式更适合那些颜色比较单一…

Window7

IE8开发人员工具 在运行栏中输入“Winver”即可查看版本 Windows7 PowerShell UNIX系统一直有着功能强大的壳程序(shell),Windows PowerShell的诞生就是要提供功能相当于UNIX系统BASH的命令列壳程序,同时也内建脚本语言以及辅助…

[软技能] 你认为计算专业和非计算机专业的差别在哪?为什么?

[软技能] 你认为计算专业和非计算机专业的差别在哪?为什么? 非计科,说一下自我所了解到的 在我们学校计科专业不算很强,他们的专业课就是四大套,我们专业会学习其中的数据结构与算法,大学时期的课程我个人…

python 动态规划 数塔_数塔问题,简单的动态规划算法

/*数塔问题:912 1510 6 82 18 9 519 7 10 4 16有形如图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一直走到底层,要求找出一条路径,使路径上的值最大。这道题如果用枚举法,在数…

一位软件工程师的7年总结(转)

勉励下自己... 1、分享第一条经验:“学历代表过去、能力代表现在、学习力代表未来。” 其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道理有些体会吧。但我相信这一点也很重要:“重要的道理明白太晚将抱憾终生&…

[软技能] 现如今面对如层出不穷的类库,说说你的感受

[软技能] 现如今面对如层出不穷的类库,说说你的感受 百花齐放,百家争鸣的感觉。 说明社区活跃,这一片欣欣尚荣的风景,蛮好!个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚…

maven集成命令-U -B -P -e -X

maven -U clean compile install -e -X -Dmaven.test.skiptrue 在持续集成服务器上使用怎样的 mvn 命令集成项目,这个问题乍一看答案很显然,不就是 mvn clean install 么?事实上比较好的集成命令会稍微复杂些,下面是一些总结&…

String、StringBuffer与StringBuilder之间区别

最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下。 关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什…

java 异步框架_基于Java的轻量级异步编程框架

# **DActor**## IntroductionDActor框架可同时支持同步和异步代码,简化在线异步代码的开发,用同步代码的思维来开发异步代码,兼顾异步代码的高并发、无阻塞和同步代码的易读性,可维护性。基于协程思想设计最大程度的降低阻塞&…

【Silverlight】Bing Maps开发应用与技巧二:自定义图钉标注控件和动态ToolPanel

在Bing Maps Silverlight Control中以及为我们提供了地图图钉控件Pushpin,我曾经在《使用图钉层(Pushpin layer)及地图图层(MapLayer)》一文中介绍过他的使用方法,本篇主要介绍如何自定义图钉标注控件以及对…

比拼浮点运算速度,超算排行榜是这样“算”出来的

6月17日,新一期全球超算500强榜单出炉,入选500强的所有超算浮点运算速度都突破每秒千万亿次,中国超算也在前四占有两席位置。 普通计算机用指令运算速度衡量计算性能,而超算通常用浮点运算速度来衡量其性能。那么,什么…

[软技能] 在前后端分离项目里,请说说前端传递的token的流程?

[软技能] 在前后端分离项目里,请说说前端传递的token的流程? (一):cookie前端 post 账号密码,后端 response header: set-cookie, 将 token 插入 cookie 内,之后每次针对该域名下的请求都会带上…

java short后缀_自学java的新手问个问题,为什么写个代码中的int能自动转

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼你学一个东西 先学会他的定义java语法是这样定义的 类型修饰符 变量名 值其中左边是被赋值的 右边是赋值的 类型修饰符有 八种 int boolean char short long float double byte当你声明 一个变量时 的语法是类型修饰符 变量名; 也…

[html] 使用svg画一个爱心

[html] 使用svg画一个爱心 <head><style>*,*:before,*:after {box-sizing: border-box;margin: 0;padding: 0;}.heart-loader {position: absolute;display: block;left: 50%;top: 50%;margin-top: -90px;width: 180px;height: 180px;overflow: visible;transform…