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

Posted

技术标签:

【中文标题】如何在 CHeaderCtrl 上的 EditFilter 时设置编辑控件的位置【英文标题】:How can I set position of edit control when EditFilter on CHeaderCtrl 【发布时间】: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 消息以及它为什么这样做。 您是否尝试为用户提供更新特定“单元格”(行和列)值的机制? 是的,用户只想输入一个值,并且此列中的每个单元格都会根据输入值计算出新值。 【参考方案1】:

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

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

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

【讨论】:

我也考虑了类似的解决方案,可能我会这样做。前段时间我尝试对其进行编码,但遇到了另一个问题:在用户将鼠标移动到列表标题上方之前,会显示动态创建的编辑。在这种情况下,标题是“刷新”并隐藏我的编辑。

以上是关于如何在 CHeaderCtrl 上的 EditFilter 时设置编辑控件的位置的主要内容,如果未能解决你的问题,请参考以下文章

listctrl调整表头高度

MFC-GetHeaderCtrl获取列头指针

MFC 保存自定义标题列宽

VC 6.0 怎样实现列表头居中,内容左对齐

MFC中CListCtrl控件怎样获取某列的列号

如何在 iPad 上的 iOS 7 上的 UITableView 单元格右侧绘制图像?