如何在CHeaderCtrl上的EditFilter时设置编辑控件的位置

时间:2016-02-15 09:58:12

标签: mfc clistctrl

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

当用户点击列标题时,我想让他输入文本值。 我发现我可以通过以下方式实现:CHeaderCtrl :: EditFilter。 我希望编辑与列标签的文本位于同一位置。实际上它是下面的,因此只有部分控件和文本可见。列标签的一部分也是可见的。 如何通过CHeaderCtrl :: GetItemRect

设置由rect读取的编辑位置

example preview

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;
}

1 个答案:

答案 0 :(得分:0)

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

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

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