簡體   English   中英

如何讓 CMFCPropertyGridProperty 支持 64bit int?

[英]How can make CMFCPropertyGridProperty support 64bit int?

我正在使用 MFC CMFCPropertyGridProperty編寫屬性編輯器。 它似乎不支持int64_t / uint64_t 當我推送int64_t / uint64_t值時,UI 顯示 *** error ***。

int64_t val = 123456;
COleVariant varValue = (_variant_t)val;

CMFCPropertyGridProperty* pGrid = new CMFCPropertyGridProperty("Int64Val", varValue);
_pParentGrid->AddSubItem(pGrid);

varValue是正確的,它的vtVT_I8 值也是正確的。 有沒有人成功地做到過?

@dxiv 是的,我檢查了CString CMFCPropertyGridProperty::FormatProperty()代碼( atlmfc\src\mfc\afxpropertygridctrl.cpp ),它不支持VT_I8 / VT_UI8 所以我自己導出了一個,現在顯示很好。 但不能編輯它。 在閱讀了afxpropertygridctrl.cpp中的更多代碼后,我發現需要做更多的工作才能使CMFCPropertyGridPropertyInteger64正常工作。

virtual CString FormatProperty() override
{
    ASSERT_VALID(this);
    ASSERT_VALID(m_pWndList);

    COleVariant& var = m_varValue;
    ASSERT(var.vt == VT_I8 || var.vt == VT_UI8);

    CString strVal;

    switch (var.vt)
    {
    case VT_I8:
        strVal.Format(_T("%I64d"), var.llVal);
        break;

    case VT_UI8:
        strVal.Format(_T("%I64u"), var.ullVal);
        break;
    }

    return strVal;
}

為了使它 function 好,我做了一個完整的。 分享下面的代碼(使用一些作弊來簡化代碼)。

class CMFCPropertyGridInt64Property : public CMFCPropertyGridProperty
{
public:
    CMFCPropertyGridInt64Property(const CString& strName, const COleVariant& varValue, LPCTSTR lpszDescr = NULL, DWORD_PTR dwData = 0,
        LPCTSTR lpszEditMask = NULL, LPCTSTR lpszEditTemplate = NULL, LPCTSTR lpszValidChars = NULL);

    virtual ~CMFCPropertyGridInt64Property();

public:
    void EnableSpinControl(BOOL bEnable, int nMin, int nMax);
    virtual CWnd* CreateInPlaceEdit(CRect rectEdit, BOOL& bDefaultFormat);

    virtual BOOL OnSetCursor() const;
    virtual BOOL PushChar(UINT nChar);
    virtual CString FormatProperty();

protected:

    virtual BOOL TextToVar(const CString& strText);
    virtual BOOL IsValueChanged() const;
    virtual HBRUSH OnCtlColor(CDC* pDC, UINT nCtlColor);
};

#include "stdafx.h"
#include "MFCPropertyGrid.h"


CMFCPropertyGridInt64Property::CMFCPropertyGridInt64Property(const CString& strName, const COleVariant& varValue
    , LPCTSTR lpszDescr /*= NULL*/, DWORD_PTR dwData /*= 0*/, LPCTSTR lpszEditMask /*= NULL*/
    , LPCTSTR lpszEditTemplate /*= NULL*/, LPCTSTR lpszValidChars /*= NULL*/)
    : CMFCPropertyGridProperty(strName, varValue, lpszDescr, dwData, lpszEditMask, lpszEditTemplate, lpszValidChars)
{

}

CMFCPropertyGridInt64Property::~CMFCPropertyGridInt64Property()
{

}

void CMFCPropertyGridInt64Property::EnableSpinControl(BOOL bEnable, int nMin, int nMax)
{

    VARTYPE backVT = m_varValue.vt;
    m_varValue.vt = VT_I4;

    CMFCPropertyGridProperty::EnableSpinControl(bEnable, nMin, nMax);

    m_varValue.vt = backVT;

    return;
}

BOOL CMFCPropertyGridInt64Property::TextToVar(const CString& strText)
{
    CString strVal = strText;

    switch (m_varValue.vt)
    {
    case VT_I8:
#ifdef _UNICODE
        m_varValue.llVal = wcstoll(strText, NULL, 10);
#else
        m_varValue.llVal = _strtoi64(strText, NULL, 10);
#endif
        return TRUE;

    case VT_UI8:
#ifdef _UNICODE
        m_varValue.ullVal = wcstoull(strText, NULL, 10);
#else
        m_varValue.ullVal = _strtoui64(strText, NULL, 10);
#endif
        return TRUE;
    }

    return FALSE;
}

BOOL CMFCPropertyGridInt64Property::IsValueChanged() const
{
    ASSERT_VALID(this);

    if (m_varValueOrig.vt != m_varValue.vt)
    {
        return FALSE;
    }

    const COleVariant& var = m_varValue;
    const COleVariant& var1 = m_varValueOrig;

    switch (m_varValue.vt)
    {
    case VT_I8:
        return var.llVal != var1.llVal;

    case VT_UI8:
        return var.ullVal != var1.ullVal;
    }

    return FALSE;
}

CWnd* CMFCPropertyGridInt64Property::CreateInPlaceEdit(CRect rectEdit, BOOL& bDefaultFormat)
{
    VARTYPE backVT = m_varValue.vt;
    m_varValue.vt = VT_I4;

    CWnd* pWnd = CMFCPropertyGridProperty::CreateInPlaceEdit(rectEdit, bDefaultFormat);

    m_varValue.vt = backVT;

    return pWnd;
}

BOOL CMFCPropertyGridInt64Property::OnSetCursor() const
{
    if (m_bInPlaceEdit)
    {
        return FALSE;
    }

    if (m_bIsValueList)
    {
        SetCursor(AfxGetApp()->LoadStandardCursor(IDC_IBEAM));
        return TRUE;
    }

    switch (m_varValue.vt)
    {
    case VT_I8:
    case VT_UI8:
        SetCursor(AfxGetApp()->LoadStandardCursor(IDC_IBEAM));
        return TRUE;
    }

    return FALSE;
}

BOOL CMFCPropertyGridInt64Property::PushChar(UINT nChar)
{
    VARTYPE backVT = m_varValue.vt;
    m_varValue.vt = VT_I4;

    BOOL b = CMFCPropertyGridProperty::PushChar(nChar);

    m_varValue.vt = backVT;

    return b;
}


HBRUSH CMFCPropertyGridInt64Property::OnCtlColor(CDC* pDC, UINT nCtlColor)
{
    VARTYPE backVT = m_varValue.vt;
    m_varValue.vt = VT_I4;

    HBRUSH b = CMFCPropertyGridProperty::OnCtlColor(pDC, nCtlColor);

    m_varValue.vt = backVT;

    return b;
}

CString CMFCPropertyGridInt64Property::FormatProperty()
{
    ASSERT_VALID(this);
    ASSERT_VALID(m_pWndList);

    COleVariant& var = m_varValue;
    ASSERT(var.vt == VT_I8 || var.vt == VT_UI8);

    CString strVal;

    switch (var.vt)
    {
    case VT_I8:
        strVal.Format(_T("%I64d"), var.llVal);
        break;

    case VT_UI8:
        strVal.Format(_T("%I64u"), var.ullVal);
        break;
    }

    return strVal;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM