转:MFC之COleVariant[通俗易懂]

转:MFC之COleVariant[通俗易懂]COleVariant本质上是一个枚举,用同一种类型来表达不同的子类型。如同boost中的variant。例子[cpp]viewplaincopyCOleVariantvar(3.6f);floatv=var.fltVal;CStringstr(“testCOleVariant”);COleVariantvar2(st…

大家好,又见面了,我是你们的朋友全栈君。

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.         } ;  

转载于:https://www.cnblogs.com/yfz0/p/5862089.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161074.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 简易频谱分析仪_罗德与施瓦茨频谱仪使用指南

    简易频谱分析仪_罗德与施瓦茨频谱仪使用指南头部导航end中间1简易频谱分析仪[2005年电子大赛二等奖]文章来源:凌阳科技教育推广中心作者:国防科技大学李楠刘亮李俊发布时间:2006-8-2912:14:43摘要:本设计以凌阳16位单片机SPCE061A为核心控制器件,配合XilinxVirtex-IIFPGA及Xil

    2022年8月11日
    3
  • ostringstream的使用

    ostringstream的使用在std中还有个ostringstream这么方便的格式化输出的工具 std::stringgenerate(){ostringstreamosm;osm<<"xxxx"<<1111;returnosm.str();}

    2022年6月18日
    23
  • oracle修改用户密码的方法「建议收藏」

    oracle修改用户密码的方法「建议收藏」修改oracle用户的密码有以下方法:普通用户(1)通过alteruser语法来进行修改,这也是最常见的方式:(2)第二种方式,是通过password命令来…

    2022年7月28日
    4
  • java watchdog_Watchdog实现分析

    java watchdog_Watchdog实现分析系统启动过程图:Framework层所有的Service都是运行在SystemServer进程中;SystemServer进程是由Zygote进程创建。SystemServer进程启动分两个过程init1创建Service和进程状态对象;init2创建Framework层的Service,将其加入到ServiceManager中,最后启动launcher;Android提供了Watchdog类,用…

    2022年10月31日
    0
  • offsetof 例子「建议收藏」

    offsetof 例子「建议收藏」
    /*offsetofexample*/
    #include”stdafx.h”
    #include
    #include
    /************************************************************************/
    /*MacroOBJECT_HEAD_ADDRESS:calculatethestruct’saddress

    2022年8月22日
    1
  • 特立独行的理解_特立独行的感觉

    特立独行的理解_特立独行的感觉原题链接对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数。1 是一个幸福数。此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。则 19 就是幸福数。显然,在一个幸福数迭代到 1 的过程中经过的数字都是幸福数,它们的幸福是依附于初始数字的。例如 82、68、100 的幸福是依附于 19 的。而一个特立独行的幸福数,是在一个有限的区间内不依附于任何其它数字的;其独立性就是依附于它的的幸福数

    2022年8月9日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号