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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • nginx 转发_nginx转发文件流

    nginx 转发_nginx转发文件流前后分离模式减少域名寻址时间,直接走静态html文件的域名请求,服务器做转发location/api/{proxy_passhttp://api.domain.com;#http://api.domain.com/api/}location/api/{proxy_passhttp://api.domain.com/;http://api.domain.com/}hosts127.0.0.1api.domain.com

    2022年10月19日
  • Android源码学习之环境搭建(Ubuntu下载Android源码)

    Android源码学习之环境搭建(Ubuntu下载Android源码)已经有一个多月没有看Android的知识了,之前在杭州时就买了邓凡平的《深入理解Android卷I》一直没来得及研究。后来因为公司要求,要为新的项目做准备,做各种业务的KT和技术的training,虽然新技术本身的难度不大,但是业务知识很是复杂,搞的头大,到现在终于有了一些头绪。趁现在有时间来研究下Android的源码。之前没有接触过Linux系统,我的本本现在用的是Windows系统,已经用习

  • Java stream groupby_javadoop

    Java stream groupby_javadoopgroupingBy()是StreamAPI中最强大的收集器Collector之一,提供与SQL的GROUPBY子句类似的功能。使用形式如下: .collect(groupingBy(…)); 需要指定一个属性才能使用,通过该属性执行分组。我们通过提供功能接口的实现来实现这一点-通常通过传递lambda表达式。例如,如果我…

  • OV7725寄存器配置_i2c总线通信距离

    OV7725寄存器配置_i2c总线通信距离OV7725寄存器配置(为了替换NT99141研究了很长一段时间)部分参考链接:OV7725电器特性和时序图:https://www.cnblogs.com/raymon-tec/p/5087088.htmlOV7725摄像头的彩色图像采集原理与液晶显示(有必要了解框图):https://blog.csdn.net/huzhoudaxia/article/details/75269392…

  • phpstorm 比较修改过的代码 version control

    phpstorm 比较修改过的代码 version control

    2021年11月10日
  • python3基础:操作mysql数据库

    python3基础:操作mysql数据库mysql登陆基本操作:登陆:mysql-uroot-h127.0.0.1-P3306-pmysql-uroot-p(本机不用写host)退出mysql:ctrl+z+回车,或者exit端口号默认是3306,但是可以通过安装目录下的配置文件修改。使用流程引用API模块获取与数据库的连接执行sql语句与存储过程关闭数据库连接安装pymysqlpython3与…

发表回复

您的电子邮箱地址不会被公开。

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