MFC中使用COleVariant获取CMFCPropertyGridProperty属性窗口某个属性值

MFC中使用COleVariant获取CMFCPropertyGridProperty属性窗口某个属性值  获取MFC属性窗口CMFCPropertyGridProperty中某个item的值时,如果不小心写错了类型,就会导致获取的结果不正确,原因就是COleVariant其实继承自一个特殊的结构体tagVARIANT。COleVariant类声明···C++classCOleVariant:publictagVARIANT{//Constructorspubli…

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

  获取MFC属性窗口CMFCPropertyGridProperty中某个item的值时,如果不小心写错了类型,就会导致获取的结果不正确,原因就是COleVariant其实继承自一个特殊的结构体tagVARIANT。

  • COleVariant类声明
class COleVariant : public tagVARIANT
{
// Constructors
public:

    COleVariant();
 ...

    COleVariant(BYTE nSrc);
    COleVariant(short nSrc, VARTYPE vtSrc = VT_I2);
    COleVariant(long lSrc, VARTYPE vtSrc = VT_I4);
    COleVariant(const COleCurrency& curSrc);

    COleVariant(LONGLONG nSrc);
    COleVariant(ULONGLONG nSrc);

    COleVariant(float fltSrc);
    COleVariant(double dblSrc);
    COleVariant(const COleDateTime& timeSrc);

    COleVariant(const CByteArray& arrSrc);
    COleVariant(const CLongBinary& lbSrc);
    COleVariant(LPCITEMIDLIST pidl);
public:

    const COleVariant& operator=(BYTE nSrc);
    const COleVariant& operator=(short nSrc);
    const COleVariant& operator=(long lSrc);
    const COleVariant& operator=(const COleCurrency& curSrc);

    const COleVariant& operator=(LONGLONG nSrc);
    const COleVariant& operator=(ULONGLONG nSrc);

    const COleVariant& operator=(float fltSrc);
    const COleVariant& operator=(double dblSrc);
    const COleVariant& operator=(const COleDateTime& dateSrc);

// Implementation
public:
    ~COleVariant();
};
  • tagVARIANT定义
struct tagVARIANT
    {
    union 
        {
        struct __tagVARIANT
            {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union 
                {
                LONGLONG llVal;
                LONG lVal;
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;
                VARIANT_BOOL boolVal;
                _VARIANT_BOOL bool;
                SCODE scode;
                CY cyVal;
                DATE date;
                BSTR bstrVal;
                IUnknown *punkVal;
                IDispatch *pdispVal;
                SAFEARRAY *parray;
                BYTE *pbVal;
                SHORT *piVal;
                LONG *plVal;
                LONGLONG *pllVal;
                FLOAT *pfltVal;
                DOUBLE *pdblVal;
                VARIANT_BOOL *pboolVal;
                _VARIANT_BOOL *pbool;
                SCODE *pscode;
                CY *pcyVal;
                DATE *pdate;
                BSTR *pbstrVal;
                IUnknown **ppunkVal;
                IDispatch **ppdispVal;
                SAFEARRAY **pparray;
                VARIANT *pvarVal;
                PVOID byref;
                CHAR cVal;
                USHORT uiVal;
                ULONG ulVal;
                ULONGLONG ullVal;
                INT intVal;
                UINT uintVal;
                DECIMAL *pdecVal;
                CHAR *pcVal;
                USHORT *puiVal;
                ULONG *pulVal;
                ULONGLONG *pullVal;
                INT *pintVal;
                UINT *puintVal;
                struct __tagBRECORD
                    {
                    PVOID pvRecord;
                    IRecordInfo *pRecInfo;
                    }   __VARIANT_NAME_4;
                }   __VARIANT_NAME_3;
            }   __VARIANT_NAME_2;
        DECIMAL decVal;
        }   __VARIANT_NAME_1;
    } ;

可以看到tagVARIANT内部是一个union,union的大小是里面成员最大的一个的大小,union是共享内存的,在某个时刻只能有一个值是有效的。
因此在用COleVariant获取属性值时,最初的属性值设置为什么类型就要用tagVARIANT对应的成员去获取,如果short用double去获取,获取出来的结果是错误的。

    // float类型
    CMFCPropertyGridProperty* pPropItem1; 
    pPropItem1 = new CMFCPropertyGridProperty(_T("float类型"), (_variant_t)(float)12.3, _T(""));
    COleVariant val1 = pPropItem1->GetValue();
    float fValue = val1.fltVal;
    // double类型
    CMFCPropertyGridProperty* pPropItem2; 
    pPropItem2 = new CMFCPropertyGridProperty(_T("double类型"), (_variant_t)(double)212.3, _T(""));
    COleVariant val2 = pPropItem2->GetValue();
    double dValue = val2.dblVal;
    // long类型
    CMFCPropertyGridProperty* pPropItem3; 
    pPropItem3 = new CMFCPropertyGridProperty(_T("long类型"), (_variant_t)(long)100, _T(""));
    COleVariant val3 = pPropItem3->GetValue();
    long lValue = val3.lVal;
  • union
union MyUnion
{
    int n;
    float f;
    double d;
};

int main(int argc, _TCHAR* argv[])
{

    MyUnion un;
    un.n = 10;    // 此时联合体中n为10
    un.d = 3.14;  // 此时联合体中d为3.14,而n为0
    int n;
    n = un.n;
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

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


相关推荐

  • USB 驱动彻底删除「建议收藏」

    USB 驱动彻底删除「建议收藏」最近做USB自定义设备开发,遇到以下问题,应该算是解决了,特地写出来和大家分享。在进行USB设备开发的时候,经常需要更改USB设备的名称或者pid、vid等,特别是进行自定义USB设备,自己写驱动程序的时候,会出现一个问题就是:设计了一个USB设备,插到电脑上通过安装驱动可以正常试用。后来修改了USB设备的设备名称pid、vid,再插上电脑,还是显示原来的设备名称

    2022年10月20日
    2
  • 01-越狱环境搭建

    01-越狱环境搭建学习基础学习条件建议至少iOS8完美越狱版本也不能太高,要保证能够完美越狱检查手机是否可以越狱iOSJailbreak(iOS越狱)什么是iOSJailbreak?iOS系统的漏洞,获取iOS系统的最高权限(Root),解开之前的各种限制(合法行为)完美越狱和不完美越狱完美越狱越狱后的iPhone可以正常关机和重启不完美越狱iPhone一旦关机后再开机…

    2022年6月10日
    24
  • cmd命令怎么切换盘符_windows切换盘符命令

    cmd命令怎么切换盘符_windows切换盘符命令转载于:https://www.cnblogs.com/QMM2008/p/4003039.html

    2022年10月3日
    5
  • path是什么意思啊_globalmapper转换投影

    path是什么意思啊_globalmapper转换投影投影投影是JMESPath的关键特性之一。它允许您将表达式应用于元素集合。有五种投影:列表投影切片投影对象投影展平投影过滤投影处理投影需要注意的点投影分为两个步骤。左侧(LHS)创建一

    2022年7月31日
    7
  • 台式硬盘接口详解_台式机主板硬盘接口

    台式硬盘接口详解_台式机主板硬盘接口2016-12-1612:16:44扩展分区类似于一个完整的硬盘,必须进一步分区才能使用。但每个扩展分区中只能存在一个其他分区。此分区在DOS/Windows环境中即为逻辑盘。因此每一个扩展分区的分区表(同样存储在扩…2016-12-2413:34:30你好这个简单方法如下:1、把SATA数据线的一头,插在主板的SATA接口上。如果有多块硬盘,要把启动盘接在第一个口上。如果硬盘是sat…

    2025年6月14日
    2
  • 华为数通hcie_通融理赔后需要签协议吗

    华为数通hcie_通融理赔后需要签协议吗Internet组管理协议称为IGMP协议(InternetGroupManagementProtocol),是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间。IGMP包含了IGMPv1、IGMPv2、IGMPv3三个版本,目前正处于由IGMPv2向IGMPv3的过渡阶段。本篇将按照IGMP基本原理、IGMP三个版本、IGMPSnooping几部分对IGMP协议进行介绍。

    2025年11月16日
    2

发表回复

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

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