MFC之COleVariant

COleVariant 本质上是一个枚举,用同一种类型来表达不同的子类型。如同boost中的variant

例子

[cpp]  view plain  copy
  1. COleVariant var(3.6f);  
  2. float v = var.fltVal;  
  3. CString str("testCOleVariant");  
  4. COleVariant var2(str);  
  5. CString cpStr(var2.bstrVal);  

例子

[cpp]  view plain  copy
  1. CString CMFCPropertyGridProperty::m_strFormatChar = _T("%c");  
  2. CString CMFCPropertyGridProperty::m_strFormatShort = _T("%d");  
  3. CString CMFCPropertyGridProperty::m_strFormatLong = _T("%ld");  
  4. CString CMFCPropertyGridProperty::m_strFormatUShort = _T("%u");  
  5. CString CMFCPropertyGridProperty::m_strFormatULong = _T("%u");  
  6. CString CMFCPropertyGridProperty::m_strFormatFloat = _T("%f");  
  7. CString CMFCPropertyGridProperty::m_strFormatDouble = _T("%lf");  
  8.   
  9. CString CMFCPropertyGridProperty::FormatProperty()  
  10. {  
  11.     ASSERT_VALID(this);  
  12.     ASSERT_VALID(m_pWndList);  
  13.   
  14.     COleVariant& var = m_varValue;  
  15.   
  16.     CString strVal;  
  17.   
  18.     .............  
  19.   
  20.     switch (var.vt)  
  21.     {  
  22.     case VT_BSTR:  
  23.         strVal = var.bstrVal;  
  24.         break;  
  25.   
  26.     case VT_I2:  
  27.         strVal.Format(m_strFormatShort, (short)var.iVal);  
  28.         break;  
  29.   
  30.     case VT_I4:  
  31.     case VT_INT:  
  32.         strVal.Format(m_strFormatLong, (long)var.lVal);  
  33.         break;  
  34.   
  35.     case VT_UI1:  
  36.         if ((BYTE)var.bVal != 0)  
  37.         {  
  38.             strVal.Format(m_strFormatChar, (TCHAR)(BYTE)var.bVal);  
  39.         }  
  40.         break;  
  41.   
  42.     case VT_UI2:  
  43.         strVal.Format( m_strFormatUShort, var.uiVal);  
  44.         break;  
  45.   
  46.     case VT_UINT:  
  47.     case VT_UI4:  
  48.         strVal.Format(m_strFormatULong, var.ulVal);  
  49.         break;  
  50.   
  51.     case VT_R4:  
  52.         strVal.Format(m_strFormatFloat, (float)var.fltVal);  
  53.         break;  
  54.   
  55.     case VT_R8:  
  56.         strVal.Format(m_strFormatDouble, (double)var.dblVal);  
  57.         break;  
  58.   
  59.     case VT_BOOL:  
  60.         strVal = var.boolVal == VARIANT_TRUE ? m_pWndList->m_strTrue : m_pWndList->m_strFalse;  
  61.         break;  
  62.   
  63.     default:  
  64.         // Unsupported type  
  65.         strVal = _T("*** error ***");  
  66.     }  
  67.   
  68.     return strVal;  
  69. }  

COleVariant框架内容

[cpp]  view plain  copy
  1. class COleVariant : public tagVARIANT  
  2. {  
  3.     COleVariant(LPCTSTR lpszSrc);  
  4.     COleVariant(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set to ANSI string  
  5.     COleVariant(CString& strSrc);  
  6.   
  7.     COleVariant(BYTE nSrc);  
  8.     COleVariant(short nSrc, VARTYPE vtSrc = VT_I2);  
  9.     COleVariant(long lSrc, VARTYPE vtSrc = VT_I4);  
  10.     COleVariant(const COleCurrency& curSrc);  
  11.   
  12.     COleVariant(float fltSrc);  
  13.     COleVariant(double dblSrc);  
  14.     COleVariant(const COleDateTime& timeSrc);  
  15. ....................................  
  16.     const COleVariant& operator=(float fltSrc);  
  17.     const COleVariant& operator=(double dblSrc);  
  18.     const COleVariant& operator=(const COleDateTime& dateSrc);  
  19.   
  20.     const COleVariant& operator=(const CByteArray& arrSrc);  
  21.     const COleVariant& operator=(const CLongBinary& lbSrc);  
  22. };  
  23.   
  24.     void Clear();  
  25.     void ChangeType(VARTYPE vartype, LPVARIANT pSrc = NULL);  
  26.     void Attach(VARIANT& varSrc);  
  27.     VARIANT Detach();  
  28.    void GetByteArrayFromVariantArray(CByteArray& bytes);  
  29. void SetString(LPCTSTR lpszSrc, VARTYPE vtSrc); // used to set ANSI string  
  30.     operator LPVARIANT();  
  31.     operator LPCVARIANT() const  
  32. /  
  33. struct tagVARIANT  
  34.     {    union   
  35.         {  
  36.         struct __tagVARIANT  
  37.             {  
  38.     VARTYPE vt;  
  39.     .......................  
  40.             union   
  41.                 {  
  42.                 LONGLONG llVal;  
  43.                 LONG lVal;  
  44.                 BYTE bVal;  
  45.                 SHORT iVal;  
  46.                 FLOAT fltVal;  
  47.                 DOUBLE dblVal;  
  48.                 ...........  
  49.                 DATE date;  
  50.                 BSTR bstrVal;  
  51.                 IUnknown *punkVal;  
  52.      IDispatch *pdispVal;  
  53.     ..............  
  54.     }  
  55.       
  56. COleVariant::COleVariant(float fltSrc)  
  57.         { vt = VT_R4; fltVal = fltSrc; }  
  58. _AFXDISP_INLINE COleVariant::COleVariant(CString& strSrc)  
  59.         { vt = VT_EMPTY; *this = strSrc; }  
  60.       
  61. const COleVariant& COleVariant::operator=(const CString& strSrc)  
  62. {  
  63.     // Free up previous VARIANT  
  64.     Clear();  
  65.   
  66.     vt = VT_BSTR;  
  67.     bstrVal = strSrc.AllocSysString();  
  68.   
  69.     return *this;  
  70.     }  
  71.       
  72. typedef unsigned short VARTYPE;  
  73.   
  74. /*  
  75.  * VARENUM usage key,  
  76.  *  
  77.  * * [V] - may appear in a VARIANT  
  78.  * * [T] - may appear in a TYPEDESC  
  79.  * * [P] - may appear in an OLE property set  
  80.  * * [S] - may appear in a Safe Array  
  81.  *  
  82.  *  
  83.  *  VT_EMPTY            [V]   [P]     nothing  
  84.  *  VT_NULL             [V]   [P]     SQL style Null  
  85.  *  VT_I2               [V][T][P][S]  2 byte signed int  
  86.  *  VT_I4               [V][T][P][S]  4 byte signed int  
  87.  *  VT_R4               [V][T][P][S]  4 byte real  
  88.  *  VT_R8               [V][T][P][S]  8 byte real  
  89.  *  VT_CY               [V][T][P][S]  currency  
  90.  *  VT_DATE             [V][T][P][S]  date  
  91.  *  VT_BSTR             [V][T][P][S]  OLE Automation string  
  92.  *  VT_DISPATCH         [V][T]   [S]  IDispatch *  
  93.  *  VT_ERROR            [V][T][P][S]  SCODE  
  94.  *  VT_BOOL             [V][T][P][S]  True=-1, False=0  
  95.  *  VT_VARIANT          [V][T][P][S]  VARIANT *  
  96.  *  VT_UNKNOWN          [V][T]   [S]  IUnknown *  
  97.  *  VT_DECIMAL          [V][T]   [S]  16 byte fixed point  
  98.  .......................................  
  99.   
  100. enum VARENUM  
  101.     {   VT_EMPTY    = 0,  
  102.     VT_NULL = 1,  
  103.     VT_I2   = 2,  
  104.     VT_I4   = 3,  
  105.     VT_R4   = 4,  
  106.     VT_R8   = 5,  
  107.     VT_CY   = 6,  
  108.     VT_DATE = 7,  
  109.     VT_BSTR = 8,  
  110.     .........................................  
  111.         } ;  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值