[英]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
是正確的,它的vt
是VT_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.