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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • f1值准确率召回率_nt值准确率高吗

    f1值准确率召回率_nt值准确率高吗##1、混淆矩阵混淆矩阵中T、F、P、N的含义:T:真,F:假,P:阳性,N:阴性然后组合:TP:真阳性TN:真阴性FP:假阳性FN:假阴性##2、精确率(准确率):你认为对的中,有

    2022年8月2日
    6
  • SpringCloud和dubbo的区别[通俗易懂]

    SpringCloud和dubbo的区别[通俗易懂]SpringCloud跟dubbo的区别从架构层面上来说SpringCloud跟dubbo都是微服务架构在公司开发技术选型中:SpringCloud的维护成本比较高,但是SpringCloud中提供了很多框架、整合了5大组件(全家桶:Ribbon负载均衡、eureka注册中心、Hystrix熔断器、gateway网关、feign服务调用)使用都非常方便,后期便于维护,分布式单一互不影响原则…

    2022年4月30日
    71
  • 单周期CPU中的指令周期就是一个时钟周期_指令周期和时钟周期的关系

    单周期CPU中的指令周期就是一个时钟周期_指令周期和时钟周期的关系指令周期: CPU每取出并执行一条指令所需的全部时间叫指令周期,也即CPU完成一条指令的时间叫指令周期一般一条完整的指令包括:取指周期、间址周期、执行周期、中断周期。JMPX:该指令的指令周期只有取指周期。ADDX:该指令只有取指周期、执行周期。一个指令周期包含的机器周期个数亦与指令所要求的动作有关,如单操作数指令,只需要一个取操作数周期,而双操作数指令需要两个取操作数周期。实…

    2022年10月13日
    3
  • ai算法测试工程师面试_ai面试题

    ai算法测试工程师面试_ai面试题深度学习

    2022年8月11日
    13
  • OFFSet_offtheroad

    OFFSet_offtheroad#defineoffsetof(s,m)(size_t)&reinterpret_cast<constvolatilechar&>((((s*)0)->m))该宏用于求结构体中一个成员在该结构体中的偏移量。第一个参数是结构体的名字,第二个参数是结构体成员的名字。该宏返回结构体structNames中成员memberName(m)的偏移量。偏移量…

    2022年8月22日
    10
  • SpringCloud之服务网关Gateway[通俗易懂]

    SpringCloud之服务网关Gateway[通俗易懂]前言SpringCloud是微服务中的翘楚,最佳的落地方案。SpringCloudGateway是SpringCloud新推出的网关框架,之前是NetflixZuul。网关通常在项目中为了简化前端的调用逻辑,同时也简化内部服务之间互相调用的复杂度;具体作用就是转发服务,接收并转发所有内外部的客户端调用;其他常见的功能还有权限认证,限流控制等等。…

    2022年5月21日
    36

发表回复

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

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