MFC多文档应用程序常用知识点

1、修改左上角圆形按图标。可以将要显示的图标放在资源中加载,也可以将图标文件放在程序目录下加载。

	CRect rt1;
	m_wndRibbonBar.GetClientRect(&rt1);
	CMFCRibbonApplicationButton * pAppButton = m_wndRibbonBar.GetApplicationButton();
	HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL,
		CScale3DCGlobal::GetAppllicationPath()+ _T("\\user\\admin.bmp"),
		IMAGE_BITMAP,
		0, 0, //原始大小
		LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE);
	pAppButton->SetImage(hBitmap);

以上代码放在MainFrame.cpp的OnCreate中执行。
2、在Ribbon中加载自己的控件

	CRect rt(10, rt1.bottom+3, 460, rt1.bottom + 3+107);
	m_LedString.Create(_T("000000"), 0, rt, &m_wndRibbonBar, IDC_LED1);
	m_LedString.SetStringPost(25, 21);
	m_LedString.SetStringAmp(0.3);
	m_LedString.SetTip(_T("COM4:9600 XK3190A9 COM2:YH-5大屏幕"));
	m_LedString.SetUnit(_T("公斤"));

3、在一个按钮中创建新的视图

if (m_bIsScaleWeightView)return;

m_pScaleWeight = new CScale3DCChildFrame;//子框架
CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CScale3DCScaleWeightView);
if (!m_pScaleWeight->LoadFrame(IDR_MAINFRAME,
	WS_OVERLAPPEDWINDOW | FWS_PREFIXTITLE, AfxGetMainWnd(), &context))
	return;

m_pScaleWeight->InitialUpdateFrame(NULL, TRUE);//虚函数

m_bIsScaleWeightView = TRUE;//自定义创建标记

4、通过工具栏隐藏和显示面板

BOOL CScale3DCMainFrame::OnCloseDockingPane(CDockablePane* pWnd)//虚函数
{
	// TODO: 在此添加专用代码和/或调用基类
	m_bVideoShow = TRUE;
	m_bDataGridShow = TRUE;

	return CMDIFrameWndEx::OnCloseDockingPane(pWnd);
}

//虚函数
BOOL CScale3DCMainFrame::OnCloseMiniFrame(CPaneFrameWnd* pWnd)
{
	// TODO: 在此添加专用代码和/或调用基类
	CWnd* pwnd = pWnd->GetPane();
	if (pwnd->IsKindOf(RUNTIME_CLASS(CTabbedPane)))//多个窗口
	{
		CTabbedPane* tabpane = (CTabbedPane *)pwnd;

		CMFCBaseTabCtrl* pTabWnd = tabpane->GetUnderlyingWindow();
		//关闭所有的面板
		for (int i = 0; i < pTabWnd->GetTabsNum(); i++)
		{
			CDockablePane* pBar = DYNAMIC_DOWNCAST(CDockablePane, 
			                               pTabWnd->GetTabWnd(i));
			if (pBar != NULL)
			{
				ASSERT_VALID(pBar);
				//将关闭消息加入该DockPane队列,等待完成本函数后关闭
				::PostMessageA(pBar->m_hWnd, WM_CLOSE, 0, 0);
			}
		}
	}
	else 
	{ //单个窗口
		CDockablePane* pane = (CDockablePane *)pwnd;
		if (pane->IsKindOf(RUNTIME_CLASS(CDockablePane)) || 
		pane->IsKindOf(RUNTIME_CLASS(CPane))
		 && pane->IsKindOf(RUNTIME_CLASS(CPaneFrameWnd)))
		{
			//将关闭消息加入该DockPane队列,等待完成本函数后关闭
			::PostMessageA(pWnd->GetPane()->m_hWnd, WM_CLOSE, 0, 0);
		}
	}
	m_bVideoShow = TRUE;
	m_bDataGridShow = TRUE;
	return TRUE;
	//return CMDIFrameWndEx::OnCloseMiniFrame(pWnd);
}

void CScale3DCMainFrame::OnButtonVideo()
{
	if (!m_bVideoShow)
	{
		m_bVideoShow = TRUE;

		m_wndVideoPanel.ShowPane(FALSE, FALSE, FALSE);
	}
	else if (m_wndVideoPanel.GetSafeHwnd())
	{
		m_bVideoShow = FALSE;

		m_wndVideoPanel.ShowPane(TRUE, FALSE, TRUE);
	}
	else
	{
		BOOL bNameValid;

		CString strPropertiesWnd;

		bNameValid = strPropertiesWnd.LoadString(IDS_PROPERTIES_WND);
		ASSERT(bNameValid);

		if (!m_wndVideoPanel.Create(strPropertiesWnd, this, 
		CRect(0, 0, 200, 200), 
		TRUE, 
		ID_VIEW_PROPERTIESWND,
		WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | 
		CBRS_RIGHT | CBRS_FLOAT_MULTI))
		{
			TRACE("未能创建%s窗口\n", strPropertiesWnd);
			return;
		}

		m_wndVideoPanel.EnableDocking(CBRS_ALIGN_ANY);
		DockPane(&m_wndVideoPanel);

		m_bVideoShow    = FALSE;
	}

	RecalcLayout();
}

void CScale3DCMainFrame::OnButtonDatagrid()
{
	// TODO: 在此添加命令处理程序代码
	if (!m_bDataGridShow)
	{
		m_bDataGridShow = TRUE;

		m_wndDataGridPanel.ShowPane(FALSE, FALSE, FALSE);
	}
	else if (m_wndDataGridPanel.GetSafeHwnd())
	{
		m_bDataGridShow = FALSE;

		m_wndDataGridPanel.ShowPane(TRUE, FALSE, TRUE);
	}
	else
	{
		BOOL bNameValid;

		CString strPropertiesWnd;

		bNameValid = strPropertiesWnd.LoadString(IDS_OUTPUT_WND);
		ASSERT(bNameValid);

		if (!m_wndDataGridPanel.Create(strPropertiesWnd, this, 
		CRect(0, 0, 200, 200), 
		TRUE, ID_VIEW_PROPERTIESWND,
		WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | 
		CBRS_RIGHT | CBRS_FLOAT_MULTI))
		{
			TRACE("未能创建%s窗口\n", strPropertiesWnd);
			return;
		}

		m_wndDataGridPanel.EnableDocking(CBRS_ALIGN_ANY);
		DockPane(&m_wndDataGridPanel);

		m_bDataGridShow = FALSE;
	}

	RecalcLayout();
}

5、设置视图的标签标题文字

BOOL CScale3DCChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或样式
	cs.style &= ~(LONG)FWS_ADDTOTITLE;
	if( !CMDIChildWndEx::PreCreateWindow(cs) )
		return FALSE;

	return TRUE;
}
void CScale3DCScaleWeightView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();
	CMDIChildWndEx * pFrame = (CMDIChildWndEx*)this->GetParentFrame();
	CScale3DCChildFrame * pMidFrame = (CScale3DCChildFrame*)pFrame;

	pMidFrame->SetWindowText(_T("称重数据区"));
	// TODO: 在此添加专用代码和/或调用基类
}

6、改变视图的背景颜色

BOOL CScale3DCScaleWeightView::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CRect   rt;
	GetClientRect(&rt);
	CBrush   brush;
	brush.CreateSolidBrush(RGB(255, 255, 255));
	CBrush * pOldBrush = pDC->SelectObject(&brush);
	pDC->FillRect(&rt, &brush);

	pDC->SelectObject(pOldBrush);

	return TRUE;
	//return CFormView::OnEraseBkgnd(pDC);
}

原文地址:http://blog.51cto.com/9233403/2085368

时间: 2024-08-30 11:31:25

MFC多文档应用程序常用知识点的相关文章

C++MFC编程笔记day05 文档类-单文档和多文档应用程序

文档类 1 相关类 CDocument类-父类是CCmdTarget类,所以,文档类也可以处理菜单等 命令消息.作用保存和管理数据. 注意事项:如何解决断言错误 2 在视图中显示文档中的数据 2.1 CView::OnInitialUpdate 作用初始化视图,在附加文档之后,显示之前,由框架调用. 2.2 CView::GetDocument 获取与视图相关的文档 2.3 CFrameWnd::InitialUpdateFrame 作用,初始化更新框架,可以引起CView::OnInitial

mfc学习---文档视图架构

MFC的AppWizard可以生成三种类型的应用程序:基于对话框的应用.单文档应用(SDI)和多文档应用(MDI). 一般情况下,采用文档/视结构的应用程序至少应由以下对象组成:       1.应用程序是一个CwinApp派生对象,它充当全部应用程序的容器.应用程序沿消息映射网络分配消息给它的所有子程序.       2.框架窗口是一CfrmeWnd派生对象.       3.文档是一个CDocument派生对象,它存储应用程序的数据,并把这些信息提供给应用程序的其余部分.       4.视

C++MFC编程笔记day07 MFC单文档绘图保存、多文档绘图保存

完善绘图例子(day06中的),加上保存功能 1 设计和编写图形类 CShape 1.1 成员变量 CPoint m_ptBegin; CPoint m_ptEnd; UINT m_nType; 1.2 支持序列化 1.2.1 继承自CObject 1.2.2 添加序列化的声明宏和实现宏 1.2.3 重写虚函数Serilize(),在函数中,完成成员变量的序列化 2 由于保存多个图形,引入MFC的集合类CObArray,保存的是CObject 对象的地址. 3 图形数据需要保存到文档类中,在该类

MFC多文档的创建和打开过程

我们在学习MFC的时候,时常是很迷糊的,往往微软很多很好的机制都都深埋到代码里面了,让你无法看清她的神秘面纱.常常我们是糊里糊涂的将代码写出来了,往往是知其然,不知其所以然.这样的时候,有时候让我感觉很惶恐.叫我去看msdn,有发现自己的英文水平有限,再者,实在没这个耐心将其看完.看到一本很经典的书<深入浅出MFC这本书对MFC的机制讲的很好.仔细看了会对你受益匪浅,让你认识到,VC MFC编程就是拖拖控件这么简单的事情. MFC最经典的就是她的文档视图结构了 ,本文就愿作抛砖引玉之石.有不对之

openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)

最近学习计算机图形学写的基于opengGL的作业 源码下载链接:链接:http://pan.baidu.com/s/1slANShZ 密码:hbwj 1.三维网格坐标建立 2.基本3维图形创建 3.鼠标相应旋转缩放 4.键盘相应旋转缩放 5.灯光设置 6.纹理载入映射 7.读取模型 关于MFC配置编写openGL网上有很多教程 需要的函数创建一般是: OnCreat() OnDestroy() Onsize() PreCreateWindow() OnDraw() 在我的MFC单文档项目中ena

MFC单文档多视图程序设计与Splitter拆分窗口

1. 创建不同的子frame. 在文档视图程序中 CMainFrame(class CMainFrame : public CMDIFrameWndEx) 继承自 CMDIFrameWnd (CMDIFrameWndEx 为 CMDIFrameWnd子类). 因此可以将 m_pMainWnd 转为 CMDIFrameWnd 的指针, 再调用 CreateNewChild 创建一个子frame. 此时可根据传入的具体的类名, 强制转换为所需的对象. CMDIFrameWnd* pMdiFrmWnd

MFC单文档的视图分割

最近做的工作里包括了MFC单文档的分割,过程很简单,但还是想记录下来. 如下进行了单文档分割为三个视图的操作: 1 利用类向导建立额外的两个view  基类是CView 2 在mainFirm.cpp中包含两个新加的view的头文件 3 在mainFirm.h中添加分割窗口的成员变量CSplitterWnd m_wndSplitter; 4 在mainFirm.cpp中重写oncreateclient BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT

VTk与MFC单文档程序联合编程

兴趣需要,想做下VTK与MFC想结合的程序,MFC快要在桌面程序上面失去市场份额了,现在大多使用QT来做,但是本科的时候学的就是MFC,也相对来说比较熟悉,所以就想使用MFC来写一个简单的单文档程序.首先我们需要在编译的时候将USEGUISUPPORT->USEMFC勾选上,才能在MFC平台上使用VTK.网络上现在大多流行两种VTK和MFC的方法,其实两者结合的关键就是将VTK的绘制窗口vtkrenderwindow与MFC中的view窗口相一致,让VTK上的绘制图形能够在MFC上的VIEW类上

8.MFC多文档视图构架程序

一.多文档视图构架程序 1.相关问题 可以同时管理多个文档(可以有多个文档类对象) 2.相关类 CWinApp / CDocument / CView / CMIDChildWnd / CMIDFrameWnd CDocTemplate CMultiDocTemplate - 多文档模板类 CDocManager - 文档管理类