CMFCPropertyGridCtrl 中的文本位置

问题描述 投票:0回答:1

编辑时(或单击

AllowEdit
设置为
false
),文本向左移动:

但是 Visual Studio 本身并没有遇到这个问题:

文本在获得焦点之前准确地保持在原来的位置。

我们如何实现这一目标?

我应该澄清我的

CMFCPropertyGridEditProperty
正在这样做:

CWnd* CMFCPropertyGridEditProperty::CreateInPlaceEdit(CRect rectEdit, BOOL& bDefaultFormat)
{
    CEdit *pEdit = (CEdit*)CMFCPropertyGridProperty::CreateInPlaceEdit(rectEdit, bDefaultFormat);
    CString strClassName;

    // Note that CreateInPlaceEdit can also return a CMFCMaskedEdit.
    // But we are only supporting the CEdit.
    GetClassName(pEdit->GetSafeHwnd(), strClassName.GetBuffer(_MAX_PATH), _MAX_PATH);
    strClassName.ReleaseBuffer();

    if (pEdit != NULL && strClassName == _T("Edit"))
        pEdit->SetLimitText(m_iTextLimit);

    return (CWnd*)pEdit;
}

但即使我使用

CMFCPropertyGridProperty
,效果也是一样的。

为了回答评论中的问题 1,我使用

COLeVariant
重载:

auto AddProperty = [&](CMFCPropertyGridProperty* pMeeting, CString strLabel, CString strValue)
    {
        if (pMeeting != nullptr)
        {
            COleVariant vString(strValue);
            //CMFCPropertyGridEditProperty* pProperty = nullptr;
            CMFCPropertyGridProperty* pProperty = nullptr;

            //pProperty = new CMFCPropertyGridEditProperty(strLabel, vString, L"", 0, 50);
            pProperty = new CMFCPropertyGridProperty(strLabel, vString, L"", 0);
            if (pProperty != nullptr)
            {
                pProperty->AllowEdit(false);
                pMeeting->AddSubItem(pProperty);
            }
        }
    };

回答问题2,答案是否定的。这是一个拖到资源 IDE 中的

CDialog
上的属性网格控件。


如果我创建 Visual Studio 风格的 MDI,则右侧的内置道具网格会起作用。单击单元格,文本不会移动。

在“关于”对话框中添加一个道具网格并显示“关于”窗口:

在我的对话应用程序中获得与我相同的行为。

visual-c++ mfc cmfcpropertygridctrl
1个回答
0
投票

这是一个可行的解决方案(对于我在我的电脑上),但我仍然想了解有关此事的更多信息。

我决定使用我的

CMFCPropertyGridEditProperty
类,并对
CreateInPlaceEdit
进行一点小小的调整:

CWnd* CMFCPropertyGridEditProperty::CreateInPlaceEdit(CRect rectEdit, BOOL& bDefaultFormat)
{
    rectEdit.OffsetRect(3, 0);
    CEdit *pEdit = (CEdit*)CMFCPropertyGridProperty::CreateInPlaceEdit(rectEdit, bDefaultFormat);
    CString strClassName;

    // Note that CreateInPlaceEdit can also return a CMFCMaskedEdit.
    // But we are only supporting the CEdit.
    GetClassName(pEdit->GetSafeHwnd(), strClassName.GetBuffer(_MAX_PATH), _MAX_PATH);
    strClassName.ReleaseBuffer();

    if (pEdit != nullptr && strClassName == L"Edit")
        pEdit->SetLimitText(m_iTextLimit);

    return (CWnd*)pEdit;
}

我插入这条线来偏移矩形:

rectEdit.OffsetRect(3, 0);

现在,当我单击某个属性时,文本不会移动。


我学到的东西:

  • CDialog
    内使用属性网格导致文本移动。

我好奇的事情:

  • 是什么原因导致这个问题?
  • 对于所有 PC 配置来说,偏移 3 像素都是正确的吗?
  • 可以防止此问题以避免需要此解决方法吗?
© www.soinside.com 2019 - 2024. All rights reserved.