http://community.csdn.net/Expert/topic/4874/4874384.xml?temp=.988537 本贴加分 由于本人一次最多只能出100分,所以再开一贴感谢各位大虾。问题真得很急在线急等! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 说了你不能直接传递你自定义的数据类型(类)你只能通过VARIANT 来间接传递。你在为控件定义属性的时候选择VARIANT类型,然后对VARIANT类型进行封装。你能把你的那个类的定义给我看看吗?如果你的类也有方法,那就要把类写成接口,如果只是传递简单数据就可以直接进行封装。我要看了你的类 才知道具体怎么封装。 这个CCapability很简单,只有capability、CapInfo两个Short型属性,还有一个返回BOOL的方法:EnableMethod()。那么如何封装?如果没有这个方法有如何直接封装?多谢wanilyer(缘随影去) !class CCapability : public CCmdTarget{ DECLARE_DYNCREATE(CCapability) CCapability(); // protected constructor used by dynamic creation// Attributespublic:// Operationspublic:// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CCapability) public: virtual void OnFinalRelease(); //}}AFX_VIRTUAL// Implementationprotected: virtual ~CCapability(); // Generated message map functions //{{AFX_MSG(CCapability) // NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG DECLARE_MESSAGE_MAP() DECLARE_OLECREATE(CCapability) // Generated OLE dispatch map functions //{{AFX_DISPATCH(CCapability) short m_capability; afx_msg void OnCapabilityChanged(); short m_conType; afx_msg void OnConTypeChanged(); afx_msg BOOL EnableMethod(); //}}AFX_DISPATCH DECLARE_DISPATCH_MAP() DECLARE_INTERFACE_MAP()}; http://www.vckbase.com/document/viewdoc/?id=1159http://www.vckbase.com/document/viewdoc/?id=1506 //自定义结构体 typedef struct tagSNAPENVIRONMENT { CString str; int data; }SNAPENVIRONMENT, FAR* LPSNAPENVIRONMENT; //--------------------------------------- //传送自定义结构体 //--------------------------------------- //自定义结构体变量 SNAPENVIRONMENT *pSnapEnvi; SAFEARRAY FAR *pSafeArray = NULL; //SAFEARRAY(我也不知道该怎么翻译这个东西自己可以查查MSDN)范围声明 //表示这个SAFEARRAY只能最多存放32个,当然可以改变它的大小让它存的更多 SAFEARRAYBOUND dimension[1]; dimension[0].cElements = 32; dimension[0].lLbound = 0; //创建SAFEARRAY pSafeArray = SafeArrayCreate( VT_BSTR, 1, dimension ); //--------------------------------- //准备读取数据,将你要的自定义结构的数据按如下方式写入,必须这样写入 //--------------------------------- ::SafeArrayAccessData( pSafeArray, (void HUGEP* FAR*)&pSnapEnvi ); for ( long i=0; i<32; i++ ) { CString str; str.Format("%d", i); pSnapEnvi[ i].str = str; pSnapEnvi[ i].data = i; } //--------------------------------- //写入结束保存 //--------------------------------- ::SafeArrayUnaccessData( pSafeArray ); VARIANT val; val.vt = VT_ARRAY; val.parray = pSafeArray; //这样你就可以给你的控件添加这样一个VARIANT属性下面是怎么取到VARIANT中的数据 //---------------------------------------- //接收自定义结构体,也是就是把VARIANT数据类型转换成你所想要的结构体 //--------------------------------------- SAFEARRAYBOUND dimension[1]; SAFEARRAY FAR *pSafeArray = NULL; dimension[0].cElements = 32; dimension[0].lLbound = 0; pSafeArray = SafeArrayCreate( VT_BSTR, 1, dimension ); pSafeArray = val.parray; //自定义结构体变量 SNAPENVIRONMENT *pSnapEnvi; //读取自定义结构体数据 ::SafeArrayAccessData( pSafeArray, ( void HUGEP* FAR* )&pSnapEnvi ); ::SafeArrayUnaccessData( pSafeArray ); 对于你想传递既有方法 又有属性的自定义类,你可以把它写成一个COM组件。然后编译后得到*.tlb文件,然后在的控件里面导入 这个类型库文件,这样你的控件的属性就可以直接传递你的自定义接口。 对IDispatch 接口的实现 LPDispatch 属性:http://www.itcomputer.com.cn/Programs/VC/COM/200512/10656.html 将你自定义的类型转换成COM能接受的类型。 dll 中导入符号的问题 MFC checkbox/radiobox控件的字体颜色为什么不能改变 请问一个算法.如何让一个事件在5-10天内必定会发生一次? 请高手帮忙:光盘刻录出问题! 请问如何修改单一控件的背景颜色? 如何获得文件的头指针和尾指针? 用什么软件可以看见一个.exe文件里所用的函数??? 请问如何看最新300贴以外的问题?? 高分征求嗅探器(Sniffer)源代码 太简单,以至于送分,奉劝你别骄傲? 用了回调函数的类,怎样封装成DLL??? 如何定义一个返回自定义的类的类型的属性?
你只能通过VARIANT 来间接传递。你在为控件定义属性的时候选择VARIANT类型,然后对VARIANT类型进行封装。你能把你的那个类的定义给我看看吗?
如果你的类也有方法,那就要把类写成接口,如果只是传递简单数据就可以直接进行封装。
我要看了你的类 才知道具体怎么封装。
wanilyer(缘随影去) !
class CCapability : public CCmdTarget
{
DECLARE_DYNCREATE(CCapability) CCapability(); // protected constructor used by dynamic creation// Attributes
public:// Operations
public:// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCapability)
public:
virtual void OnFinalRelease();
//}}AFX_VIRTUAL// Implementation
protected:
virtual ~CCapability(); // Generated message map functions
//{{AFX_MSG(CCapability)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG DECLARE_MESSAGE_MAP()
DECLARE_OLECREATE(CCapability) // Generated OLE dispatch map functions
//{{AFX_DISPATCH(CCapability)
short m_capability;
afx_msg void OnCapabilityChanged();
short m_conType;
afx_msg void OnConTypeChanged();
afx_msg BOOL EnableMethod();
//}}AFX_DISPATCH
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
};
http://www.vckbase.com/document/viewdoc/?id=1506
typedef struct tagSNAPENVIRONMENT
{
CString str;
int data; }SNAPENVIRONMENT, FAR* LPSNAPENVIRONMENT; //---------------------------------------
//传送自定义结构体
//---------------------------------------
//自定义结构体变量
SNAPENVIRONMENT *pSnapEnvi; SAFEARRAY FAR *pSafeArray = NULL;
//SAFEARRAY(我也不知道该怎么翻译这个东西自己可以查查MSDN)范围声明
//表示这个SAFEARRAY只能最多存放32个,当然可以改变它的大小让它存的更多
SAFEARRAYBOUND dimension[1];
dimension[0].cElements = 32;
dimension[0].lLbound = 0; //创建SAFEARRAY
pSafeArray = SafeArrayCreate( VT_BSTR, 1, dimension );
//---------------------------------
//准备读取数据,将你要的自定义结构的数据按如下方式写入,必须这样写入
//---------------------------------
::SafeArrayAccessData( pSafeArray, (void HUGEP* FAR*)&pSnapEnvi ); for ( long i=0; i<32; i++ )
{
CString str;
str.Format("%d", i);
pSnapEnvi[ i].str = str;
pSnapEnvi[ i].data = i;
} //---------------------------------
//写入结束保存
//---------------------------------
::SafeArrayUnaccessData( pSafeArray );
VARIANT val;
val.vt = VT_ARRAY;
val.parray = pSafeArray; //这样你就可以给你的控件添加这样一个VARIANT属性下面是怎么取到VARIANT中的数据
//----------------------------------------
//接收自定义结构体,也是就是把VARIANT数据类型转换成你所想要的结构体
//---------------------------------------
SAFEARRAYBOUND dimension[1];
SAFEARRAY FAR *pSafeArray = NULL;
dimension[0].cElements = 32;
dimension[0].lLbound = 0;
pSafeArray = SafeArrayCreate( VT_BSTR, 1, dimension );
pSafeArray = val.parray; //自定义结构体变量
SNAPENVIRONMENT *pSnapEnvi;
//读取自定义结构体数据
::SafeArrayAccessData( pSafeArray, ( void HUGEP* FAR* )&pSnapEnvi );
::SafeArrayUnaccessData( pSafeArray );
然后编译后得到*.tlb文件,然后在的控件里面导入 这个类型库文件,这样你的控件的属性就可以直接传递你的自定义接口。