【问题标题】:MFC Property Grid Formatted FloatsMFC 属性网格格式化浮点数
【发布时间】:2013-01-26 03:24:33
【问题描述】:

所以我正在使用 Visual Studio 2008 中的 C++/MFC 开发一个编辑器风格的应用程序。

Visual Studio 风格应用程序的默认向导项目充满了有用的优点,但并没有解决所有问题,甚至我发现的一些 MFC 书籍也没有提到这个特殊问题。

如何使用CMFCPropertyGridProperty 获得一个属性查看器,该查看器显示一个浮点值以限制它显示的小数位数?现在,您似乎在浮点值上获得了 6 位小数(使用浮点 _variant_t 构造)。有什么办法可以改变吗?

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    CMFCPropertyGridProperty 类有一个名为FormatProperty() 的虚函数。此函数返回一个 CString 对象,其中包含属性值的字符串表示形式。当需要显示属性值时,由框架调用。

    由于该函数是虚拟的,您可以从CMFCPropertyGridProperty 派生您自己的属性类并覆盖该函数,以便在一般情况下调用基类的实现,而当 对应的变体类型为VT_R4 (float) 或VT_R8 (double)。

    类似这样的:

    class CMyProperty : CMFCPropertyGridProperty
    {
        ...
        virtual CString FormatProperty()
        {
            CString str;
            if (GetValue().vt == VT_R8)
            {
                str.Format(...); // Or whatever you want
            }
            else
            {
                str = CMFCPropertyGridProperty::FormatProperty();
            }
    
            return str;
        }
    };
    

    然后,您可以将自己的属性类CMyProperty 的实例传递给CMFCPropertyGrid 的函数AddProperty()

    【讨论】:

    • 安迪 - 谢谢你的回答,我已经让它大部分工作了。您是否知道如何让它在构造时调用“FormatProperty”?似乎在设置值之前它不会格式化属性。解决方案可能就像创建然后调用“SetValue”一样简单,但我希望有更好的东西。谢谢!
    • @James: FormatProperty() 是一个虚函数,所以你不应该尝试在构造时调用它(意思是:在你的类的构造函数中)。但也许我误解了你的真正要求?为什么你希望它被称为建筑?我以为框架会在需要显示其值的任何时候调用它,不是吗?
    • 我能弄明白,但看起来如果你通过构造函数初始化一个CMFCPropertyGridProperty并且不调用SetValue,那么这个函数永远不会被调用,你会得到默认格式.可能是因为你说的 - 它不能在构造函数中调用虚函数。
    • @James:我不确定我是否理解:如果您从未设置过值,那么您希望显示什么?我猜如果没有设置值,封装变体的类型就不是VT_R8,所以你在if语句的相应分支中的格式化代码不会被执行。您是否尝试过调试它以查看发生了什么?
    猜你喜欢
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 2014-05-08
    • 1970-01-01
    • 2016-10-05
    相关资源
    最近更新 更多