Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9601908
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-03-30 22:00:20

下载本文示例代码
前面四篇中我介绍了TangramMini组件在对话框程序中的使用,本篇我将简单介绍一下TangramMini组件在SDI(单文档界面)程序中的使用。在SDI程序中利用TangramMini组件搭建框架使应用程序框架设计更加快捷、简单。废话我不多说,直接切入主题。
请注意,要安装TangramMini组件,请到中下载组件安装包并安装,并且如果要运行源代码,也必须先安装TangramMini组件方可编译运行。

首先我们要先生成一个普通的SDI程序。启动Microsoft Visual C++ 6.0开发环境,进入主菜单中的File->New,在New对话框,选择Projects页,然后选择MFC AppWizard (exe),在Project name中输入SDI(请注意:这里的SDI是工程名,你也可以随便取个什么名字),然后单击OK按钮,在向导的第一页选择Single document(单文档)类型,然后单击Finish完成单文档程序的创建,你也可以不直接Finish,可以先Next做一些别的修改,然后完成。

由于不是对话框程序,这次我们不能直接在界面上拖入TangramMiniCtrl控件,只能动态创建TangramMiniCtrl控件,在这里我们有两个办法创建TangramMiniCtrl,一个办法当然是直接手工创建;另一个办法就是利用TangramMiniB2C组件创建,因为TangramMiniB2C有辅助创建TangramMiniCtrl的功能,当然要利用TangramMiniB2C组件创建TangramMiniCtrl控件,我们就必须先创建TangramMiniB2C组件。在这里我决定使用第二种办法,就是利用TangramMiniB2C组件创建TangramMiniCtrl控件,因为方法更加简单方便,编码更少。在TangramMini组件安装之后,所带的案例中,这两种创建方法都有相对应的例子,大家也可以自己查看。
为了编码方便,我们直接从安装包的案例源码中找到TangramMini_i.c与TangramMini_i.h两个文件复制到之前新建的SDI工程源码下。搞定之后,我们前期工作准备完毕,开始编码:
1、 打开stdafx.h文件,加入包含头文件语句:

#include "TangramMini_i.c" 
#include "TangramMini_i.h"
为了编译不出现问题,我这里提醒大家,最好是先包含.c文件,再包含.h文件。
2、 由于需要创建ActiveX组件,所以需要COM支持,在创建TangramMiniB2C组件之前必须调用CoInitialize(NULL)语句。
3、 在CMainFrame类中分别加入成员变量m_pMiniB2C与m_pMiniCtrl,类型分别为ITangramMiniB2C*与ITangramMiniCtrl*类型。
4、 修改CMainFrame类的OnCreate()函数,在函数尾部加入下例代码(也是本篇中最主要的代码):
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_TangramMiniB2C,
  NULL,
  CLSCTX_INPROC_SERVER,
  IID_ITangramMiniB2C,
  (LPVOID*)&m_pMiniB2C);

if (SUCCEEDED(hr) && (m_pMiniB2C != NULL))
{
 m_pMiniB2C->put_TargetHandle((LONG)m_hWnd);
 m_pMiniB2C->get_TangramMiniCtrl(&m_pMiniCtrl);

 VARIANT_BOOL bSucceed;
 m_pMiniCtrl->LoadFile(L"test.xtml",&bSucceed);
 m_pMiniCtrl->SetMDIClient(
  L"Page1_S0001_S0000",
  (LONG)theApp.m_pClientView->m_hWnd,
  0,&bSucceed);
}

其中CoInitialize(NULL)为初始化,然后调用CoCreateInstance()函数创建TangramMiniB2C组件并保存在m_pMiniB2C成员变量中,创建TangramMiniB2C组件之后,开始由TangramMiniB2C组件辅助创建TangramMiniCtrl控件,在这里我先说明下一下TangramMiniB2C的TargetHandle与TangramMiniCtrl两个属性,其中TargetHandle表示要创建的TangramMiniCtrl控件的父窗口,这里设置为m_hWnd,表示将TangramMiniCtrl控件创建在主框架窗口上,成为主框架窗口的一个子窗口。TangramMiniB2C的TangramMiniCtrl属性表示为创建后的TangramMiniCtrl控件的引用,在这里我们用get_TangramMiniCtrl(&m_pMiniCtrl)得到创建后的TangramMiniCtrl控件的引用并返回给成员变量m_pMiniCtrl。
得到TangramMiniCtrl控件的引用之后,我们就像之前在对话框程序中使用TangramMiniCtrl控件了,首先调用LoadFile()方法加载框架文件,然后调用SetMDIClient(…)方法安装框架以及客户区。其中theApp.m_pClientView变量保存了当前视图的指针,关键在哪保存此值,大家可以查看源代码,使用SetMDIClient的方法表示将TangramMiniCtrl控件填充当前视图的位置,并将当前视图平移到名为Page1_S0001_S0000(你也可以用别的有效空白视图名称)的Tangram空白视图区域中。

BOOL SetMDIClient(BSTR strObjName, LONG nMDIHandle, LONG nMDIStyle);

由于TangramMini组件最初的设计目的是针对MDI应用程序而设计的,所以存在这个SetMDIClient方法,此方法存在三个参数,第一个参数就是像其它方法一样,为Tangram空白视图的名称,第二个为MDI客户区窗口句柄,第三个参数为MDI客户区风格,其中nMDIStyle在本篇中无效果,不必关心。虽然这个方法是针对MDI应用程序而存在的,但是在普通的程序中也可以利用此方法,像现在在这个SDI中就要使用此方法。此方法的功能是将TangramMiniCtrl控件填充nMDIHandle句柄对应的位置,并将nMDIHandle窗口定位到strObjName区域中。也就是说TangramMiniCtrl自动适用nMDIHandle窗口的大小,并且平移nMDIHandle窗口的位置,有点难理解,也许是我自己也说不清,大家看最终效果就可以明白。

经过上面几个简单的步骤之后,最终的效果图如下。由于是在SDI应用程序中,为了视觉效果更好,我这里将之前设计的框架文件(test.xtml)文件用XTML Designer修改了一下,将之前介绍的3号Tangram空白视图区域重新设计为一个三页的Tab分页(分别为:Output、Building与Debug)。



有上图可见,TangramMiniCtrl控件填充了整个客户区,其实并不是TangramMiniCtrl控件自动填充了整个客户区,而是因为当前视图m_pClientView对象填充整个客户区,而调用SetMDIClient方法之后,TangramMiniCtrl控件就会自动适应m_pClientView对象的窗口位置,而且平移m_pClientView对象到指定的Tangram空白视图位置。我自己认为自己很难用文字上来解释清楚,也许大家已经明白了,我就不啰嗦了。

可以看出我们在一个简单的SDI程序中利用TangramMini组件就很快速的建立了一个复杂框架,我相信大家通过之前几篇关于对话框程序的了解,应该可以自行的在其余的Tangram空白视图中安装自己感兴趣的窗口对象,在这里我就安装一个简单的CEdit box窗口到名为Output的Tangram空白视图区域中,效果如下图所示,具体细节请查看源代码。

好了,关于TangramMini组件在SDI应用程序中的使用就简单介绍到这里,从下一篇我将开始介绍TangramMini组件在MDI(多文档界面)应用程序中的使用,由于刚开始我说明了TangramMini组件最初的设计是为MDI程序而设计的,所以TangramMini组件在MDI应用程序中功能最为强大,表现形式也最好,另外非常感谢大家的关注。

下载本文示例代码
阅读(1361) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~