zoukankan      html  css  js  c++  java
  • 转: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.         } ;  
  • 相关阅读:
    XML案例
    4.6Java数组的遍历
    4.3Java多态(polymorphism)
    XML文档的标准
    4.6Java数组的定义
    4.6Java数组初始化的方式
    XML介绍
    4.6Java对象转型(casting)
    HelloWorld之MyBatis
    Hibernate查询方法比较
  • 原文地址:https://www.cnblogs.com/yfz0/p/5862089.html
Copyright © 2011-2022 走看看