【问题标题】:How can I set position of edit control when EditFilter on CHeaderCtrl如何在 CHeaderCtrl 上的 EditFilter 时设置编辑控件的位置
【发布时间】:2016-02-15 09:58:11
【问题描述】:

我有从 CListCtrl 派生的自定义类。

当用户单击列标题时,我想让他输入文本值。 我发现我可以通过:CHeaderCtrl::EditFilter 来做到这一点。 我预计编辑将与列标签的文本位于同一位置。事实上它是波纹管,所以只有部分控件和文本是可见的。列标签的一部分也是可见的。 如何设置编辑位置被 CHeaderCtrl::GetItemRect 读取的 rect 覆盖

void Data_list::OnHdnItemclickpointslist(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);
    CHeaderCtrl* header = this->GetHeaderCtrl();
    CRect rect;
    header->GetItemRect(phdr->iItem , rect );
    int iFilter = header->EditFilter(phdr->iItem , TRUE);

    // how to set position of edit
    *pResult = 0;
}

【问题讨论】:

  • 我猜,ListView 的左上角距离父窗口的左上角大约 4 像素 x 10 像素。您必须使用 ClientToScreen 来找到该偏移量。或者确保 ListView 控件是 Edit 控件的父级。
  • 好的,我可以做到,但计算正确位置不是我需要的。对我来说更重要的是找出如何获得指向此编辑的任何指针。
  • 其实我没有看错问题,我之前的评论没有意义。我不熟悉HDM_EDITFILTER 消息以及它为什么这样做。
  • 您是否尝试为用户提供更新特定“单元格”(行和列)值的机制?
  • 是的,用户只想输入一个值,并且此列中的每个单元格都会根据输入值计算出新值。

标签: mfc clistctrl


【解决方案1】:

根据您的评论回复,您应该考虑采用不同的方法来收集您想要的数据。我使用以下方法做了非常相似的事情。

  • 创建将用于收集用户的 Edit 控件类 数据。该类应该是 CListCtrl 的子成员变量。
  • 处理来自列表控件的左按钮按下消息。在那里面 处理程序,使用列表控件的 GetItemRect 函数来确定 用户点击了哪一行和哪一列。
  • 在单元格边界的顶部创建一个动态编辑控件 用户点击。这将为用户提供一个编辑控件 输入数据。
  • 检测用户何时通过丢失的 专注于编辑控件,或者某个键序列(例如 Enter 键)。
  • 通知父 List 控件编辑已完成。这个可以 通过消息传递或直接方法调用来完成。确保 将更新后的值传递给父 List 控件。
  • 父列表控件应收集传递的更新值和 销毁子编辑控件。
  • 然后父列表控件应该遍历列表控件 更新所选列中的所有“单元格”。

我没有为此提供实际代码,因为有很多方法可以完成上述方法。这应该为您实现编辑机制提供一个起点。

【讨论】:

  • 我也考虑了类似的解决方案,可能我会这样做。前段时间我尝试对其进行编码,但遇到了另一个问题:在用户将鼠标移动到列表标题上方之前,会显示动态创建的编辑。在这种情况下,标题是“刷新”并隐藏我的编辑。
猜你喜欢
  • 2011-06-10
  • 2023-03-10
  • 2013-12-27
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多