创建没有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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

java 创建线程的三种方法_java 创建线程的几种方式

说道线程,肯定会想到使用 java.lang.Thread.java这个类那么创建线程也主要有2种方式第一种方式:public class MyThread extends Thread {public void run() {System.out.println("这是MyThread线程");}}然后在调用处,执行start方法…

【iOS】从实际出发理解多线程(二)--NSThread基础操作

简介 NSthread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需要自己控制线程的生命周期。在平时使用较少,常用的就是下面的方法来获取当前线程。 [NSThread currentThread] 使用 1.实例初始化、属性…

双绞线制作方法和标准

双绞线的制作方法: 标准568B:橙白--1,橙--2,绿白--3,蓝--4,蓝白--5,绿--6,棕白--7,棕--8 (如图2) 标准568A:绿白--1,绿--2&#xff0c…

深入理解Java枚举类型(enum)

理解枚举类型 枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看什么是枚举…

Flash/Flex学习笔记(47):反向运动学(上)

先回顾上篇所说的"正向运动学":以人行走的例子来说,基本上可以理解为大腿驱动小腿,小腿驱动脚,从而引发的一系列姿态调整和运动。再举一个例子,我们用着拿一根软鞭或链条的一端挥舞,被手挥舞的这…

java tomcat jms_JavaWeb之使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务

前言之所以使用JNDI 是出于通用性考虑,该例子使用JMS规范提供的通用接口,没有使用具体JMS提供者的接口,这样可以保证我们编写的程序适用于任何一种JMS实现(ActiveMQ、HornetQ等)。什么是JNDI:JNDI(Java Naming and Directory Inte…

你是第几名:Excel 中 Large 和 Small 的用法

类似于 SQL 语言中的 TOP X, Large 和Small 有2个参数 Large(Array,k) Array 可以为一个单元格区域,k 为第k各最大值,Small 与之对应返回第k个最小值。 注意:单元格区域中的非数字会被忽略掉。 例子如下: 可以类比Rank的用法&…

mac系统下android studio创建手机模拟器

打开android studio,点击右上角的模拟器图标,打开“Android Virtual Device Manager” 窗口,如下图 点击“Create Virtual Device”,在打开的设备定义列表中,选择“Phone -> Nexus 5X”,右边列出了改机型…

如何设置Hyper-V的虚拟机快捷方式

在Windows Server 2008中,提供的Hyper-V功能,可以很方便地在企业环境中部署多个虚拟机,以适应不同的开发需要。一般我们都是通过下面的方式 1. 打开服务器管理器 2.打开Hyper-V管理器,找到有关的虚拟机,然后右键点击“…

java跨函数跳转_VS code 函数无法跨文件跳转到定义

现状:本文件函数通过this打点调用的函数,引入绝对路径的文件,调用的函数都可以通过Ctrl 点击 实现跳转到定义处。而如果在 webpack 通过alias 设置了别名,无法跳转成功。解决方案: 新建文件 jsconfig.json,配置如下。…

python enumerate()

描述 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 语法 以下是 enumerate() 方法的语法: enumerate(sequence, [start0]) 参数 sequence -- 一个序列、迭代器…