Mfc 在CHeaderCtrl上设置EditFilter时,如何设置编辑控件的位置
我有从CListCtrl派生的自定义类 当用户单击列标题时,我想让他输入文本值。 我发现我可以通过以下方法实现:CHeaderCtrl::EditFilter。 我希望编辑将位于列标签文本的相同位置。事实上,它是下面的,所以只有部分控件和文本可见。列标签的一部分也是可见的。 如何设置CHeaderCtrl::GetItemRect读取的rect覆盖的编辑位置Mfc 在CHeaderCtrl上设置EditFilter时,如何设置编辑控件的位置,mfc,clistctrl,Mfc,Clistctrl,我有从CListCtrl派生的自定义类 当用户单击列标题时,我想让他输入文本值。 我发现我可以通过以下方法实现:CHeaderCtrl::EditFilter。 我希望编辑将位于列标签文本的相同位置。事实上,它是下面的,所以只有部分控件和文本可见。列标签的一部分也是可见的。 如何设置CHeaderCtrl::GetItemRect读取的rect覆盖的编辑位置 void Data_list::OnHdnItemclickpointslist(NMHDR *pNMHDR, LRESULT *pRes
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;
}
void Data_list::OnHdnItemclickpointslist(NMHDR*pNMHDR,LRESULT*pResult)
{
LPNMHEADER phdr=重新解释铸件(pNMHDR);
CHeaderCtrl*header=this->GetHeaderCtrl();
正确无误;
header->GetItemRect(phdr->iItem,rect);
int-iFilter=header->EditFilter(phdr->iItem,TRUE);
//如何设置编辑位置
*预设值=0;
}
根据您的注释响应,您应该考虑采用不同的方法来收集所需的数据。我使用以下方法做了一些非常类似的事情
- 创建将用于收集用户的编辑控件类
数据。该类应该是CListCtrl的子成员变量
- 处理来自列表控件的左键向下消息。因为
处理程序,使用列表控件的GetItemRect函数确定
用户单击的行和列
- 在单元格边界的顶部创建动态编辑控件
用户单击。这将为用户提供一个编辑控件
输入数据
- 检测用户何时完成数据输入(通过丢失的
关注编辑控件,或某个键序列(例如Enter键)
- 通知父列表控件编辑已完成。这个可以
可以通过消息传递或直接方法调用来完成。确保
将更新后的值传递给父列表控件
- 父列表控件应收集传递的更新值和
销毁子编辑控件
- 然后,父列表控件应在列表控件上迭代
更新所选列中的所有“单元格”
我没有为此提供实际的代码,因为有许多方法可以实现上述方法。这应该为您实现编辑机制提供一个起点。我猜,ListView的左上角距离父窗口的左上角大约4像素x 10像素。您必须使用ClientToScreen
查找该偏移量。或者确保ListView控件是编辑控件的父控件。好的,我可以这样做,但我不需要计算正确的位置。对我来说,更重要的是,我发现如何才能找到指向此编辑的任何指针。事实上,我没有正确阅读问题,我之前的评论没有意义。我不熟悉HDM_EDITFILTER
消息及其原因。您是否试图为用户提供更新特定“单元格”(行和列)值的机制?是的,用户只想输入一个值,此列中的每个单元格都将根据输入值计算新值。我还考虑了Similar解决方案,也许我会这样做。不久前,我试图对其进行编码,但遇到了另一个问题:在用户将鼠标移到列表标题上方之前,将显示“编辑动态”创建的内容。在这种情况下,标题是“刷新”并隐藏我的编辑。