您的位置:逆风者 VC++ 正文
 添加时间:2007-09-01 原文发表:2007-08-31 人气:80 来源:vckbase.com

本文章共2509字,分2页,当前第1页,快速翻页:
 

控件如何传递自定义struct

作者:GongXiang

下载源代码

逆风编程精品

一、开发工具
  我本来想用的是.ocx控件,最后发现,对于自定义struct,它似乎是无能为力(有谁知道.ocx可以的话请联系我)。最后采用的是vc 6.0中的ATL。下面给出了如何调用含自定义结构的组件函数senddata,ReceiveData。组件中的参数传递与下面的代码是一模一样的 ,这里不再重复。(该组件是应用于配电自动化中的,用以实现馈线自动化FA功能,本人自己设计开发)。

二、源码 这里介绍如何向控件传递自己的结构。调用组件函数的源代码如下:

int result;

VARIANT LineVal;

VARIANT DotVal;

SAFEARRAY FAR * pLSA = NULL;

SAFEARRAYBOUND dimension[1];

dimension[0].lLbound =0;

dimension[0].cElements = MAX*10;

pLSA = SafeArrayCreate( VT_BSTR,1,dimension );

Line FAR *pLineData=NULL;

::SafeArrayAccessData(pLSA,( void HUGEP* FAR*) &pLineData );

for (i=0;i<MAX;i  )

{

	pLineData[i].StaPoint_x=LineData[i].StaPoint_x;

	pLineData[i].StaPoint_y=LineData[i].StaPoint_y;

	pLineData[i].EndPoint_x=LineData[i].EndPoint_x;

	pLineData[i].EndPoint_y=LineData[i].EndPoint_y;

	pLineData[i].EndType=LineData[i].EndType;

	pLineData[i].id=LineData[i].id;

	pLineData[i].LineName=LineData[i].LineName;

	pLineData[i].Longth=LineData[i].Longth;

	pLineData[i].Power=LineData[i].Power;

	pLineData[i].ShCirFlag=LineData[i].ShCirFlag;

}



::SafeArrayUnaccessData(pLSA);

LineVal.vt = VT_ARRAY;

LineVal.parray = pLSA;



SAFEARRAY FAR * pDSA = NULL;

Dot FAR *pDotData=NULL;

pDSA = SafeArrayCreate( VT_BSTR , 1, dimension );

::SafeArrayAccessData(pDSA, ( void HUGEP* FAR*) &pDotData );



for (i=0;i<MAX;i  )

{	

	pDotData[i].CutFlag=DotData[i].CutFlag;	

	pDotData[i].DotName=DotData[i].DotName;

	pDotData[i].DotType=DotData[i].DotType;

	pDotData[i].StaPoint_x=DotData[i].StaPoint_x;

	pDotData[i].StaPoint_y=DotData[i].StaPoint_y;

	pDotData[i].EndPoint_x=DotData[i].EndPoint_x;

	pDotData[i].EndPoint_y=DotData[i].EndPoint_y;

	pDotData[i].HighCurrent=DotData[i].HighCurrent;

	pDotData[i].id=DotData[i].id;

	pDotData[i].Power=DotData[i].Power;

}



::SafeArrayUnaccessData(pDSA);



DotVal.vt = VT_ARRAY;

DotVal.parray = pDSA;



// qfa是控件,

// senddata, ReceiveData是控件中的函数, 

// LineVal和DotVal都是自己声明的结构

result=qfa.SendData(LineVal,DotVal,3);



long LineCount,DotCount;



//以下为接收数据

SAFEARRAY FAR * pReLSA = NULL;

SAFEARRAY FAR * pReDSA = NULL;

pReLSA = SafeArrayCreate( VT_BSTR , 1, dimension );

pReDSA = SafeArrayCreate( VT_BSTR , 1, dimension );



Line *pLData=NULL;

Dot *pDData=NULL;

qfa.ReceiveData(&LineVal,&LineCount,&DotVal,&DotCount);



pReLSA = LineVal.parray;

pReDSA = DotVal.parray;



::SafeArrayAccessData(pReDSA, ( void HUGEP* FAR*) &pDotData );

::SafeArrayUnaccessData(pReDSA);



for (int j=0;j<MAX;j  )

{

	DotData[j].HighCurrent=-1;

}



for (i=0;i<DotCount;i  )

{

	for (j=0;j<MAX;j  )

	{

		if (pDotData[i].id==DotData[j].id)

		{

			DotData[j].Power=pDotData[i].Power;

		}

	}

}



//Line 和Dot声明如下

struct Line

{

	long id;//id号

	BOOL Power;//有电标志

	BSTR LineName;//线路名称

	long StaPoint_x;//起点x

	long StaPoint_y;//起点y

	long EndPoint_x;//终点x

	long EndPoint_y;//终点y

	short EndType;//1 负荷 2 电源 0 其它

	long Longth;

	BOOL ShCirFlag;//短路标志

};



struct Dot

{

	long id;

	BOOL Power;//开合标志

	BSTR DotName;//线路名称

	long StaPoint_x;//起点x

	long StaPoint_y;//起点y

	long EndPoint_x;//终点x

	long EndPoint_y;//终点y

	short DotType;//可操作标志0 断路器不可遥控 1 断路器可遥控 2 刀闸 3 线路节点 4 变压器

	short HighCurrent;//过流标志    -1未有过流数据 >=0有过流数据

	BOOL CutFlag;//跳闸标志

};



//在ATL的idl文件中需要声明如下:

typedef

[

uuid(D124B04A-C5F9-4a16-9671-1E67B75DB1A1),

helpstring("NetWork Node Struct")

]



struct Line

{

	long id;//id号

	BOOL Power;//有电标志

	BSTR LineName;//线路名称

	long StaPoint_x;//起点x

	long StaPoint_y;//起点y

	long EndPoint_x;//终点x

	long EndPoint_y;//终点y

	short EndType;//1 负荷 2 电源 0 其它

	long Longth;

	BOOL ShCirFlag;//短路标志

}Line;



typedef

[

uuid(D124B04A-C5F9-4a16-9671-1E67B75DB1A2),

helpstring("NetWork Node Struct")

]



struct Dot

{

	long id;

	BOOL Power;//开合标志

	BSTR DotName;//线路名称

	long StaPoint_x;//起点x

	long StaPoint_y;//起点y

	long EndPoint_x;//终点x

	long EndPoint_y;//终点y

	short DotType;//可操作标志0 断路器不可遥控 1 断路器可遥控 2 刀闸 3 线路节点 4 变压器

	short HighCurrent;//过流标志

	BOOL CutFlag;//跳闸标志

}Dot;



 
 
本文章更多内容1 - 2 - 下一页>>
相关文章

文件系统识别器
用 ATL ActiveX 绘制任意平面函数的曲线
软件框架的利器、TangramMini组件应用教程四
如何让一个打开的文档成为活动文档
消息值,托管字符串,扰乱代码及其它
修改一个完全颜色的CListCtrl类
编程之道
更新MFC中的视图,跟踪.NET Framework中的事
常用编码详解
在List Control中实现列表项目的上下移动
完美实现真彩自绘菜单
VC 6.0 中如何使用 CRT 调试功能来检测内
软件开发专业相关的英文简历及其资源
定制调试诊断工具和实用程序——摆脱DLL“地
发掘 C# 特性赋予科学计算项目以威力
《系统飞狐》中获取系统信息的方法
使用 Http 在线自动升级程序
UTF-8与GB2312之间的互换
在VC中调用DirectShow全屏播放视频
案例研究:If-Trader 订单流程处理系统

相关评论


本文章所属分类:首页 VC++

  热门关键字: