如何在 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 时设置编辑控件的位置的主要内容,如果未能解决你的问题,请参考以下文章