在 CTreeView 标签中复制粘贴
Posted
技术标签:
【中文标题】在 CTreeView 标签中复制粘贴【英文标题】:Copy paste in CTreeView labels 【发布时间】:2015-07-27 07:52:03 【问题描述】:我在 MFC SDI 应用程序中有一个源自 CTreeView
的控件(基本上包含分离器、CTreeView
和 CDetailsView
)。对我有用的是通过处理编辑结束来编辑树视图节点中的标签
ON_NOTIFY_REFLECT(TVN_ENDLABELEDIT, &CNavigationView::OnTvnEndlabeledit)
我想用Ctrl+C
和Ctrl+V
添加复制/粘贴功能。我认为这涉及TVN_BEGINLABELEDIT
和TVN_KEYDOWN
,但我不知道如何使其正常工作,可能是一些想法或样本?
void CNavigationView::OnTvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult)
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
if (pTVDispInfo && pTVDispInfo->item.pszText)
当我尝试从记事本粘贴文本时,根据调试器,pTVDispInfo->item.pszText
是 NULL
。
我正在使用 Visual Studio 2013,Windows 8。
【问题讨论】:
“添加复制/粘贴功能”是什么意思?当有人按下 ctrl-p 并专注于您的控件时,一次添加多个项目?如果它只是通过复制/粘贴处理编辑项目,则无需任何特殊代码即可工作(即,当有人开始编辑项目并按 ctrl-v 时,剪贴板的内容将被粘贴到编辑控件中显示何时开始编辑)。 @Roel 不,我的意思是例如从记事本复制字符串并将其粘贴到正在树视图中编辑的标签中。然后向后,复制树视图项目中标签的内容并粘贴到记事本(任何其他应用程序) 那么我不确定问题出在哪里 - 处理复制/粘贴与处理其他编辑相同。在其最基本的形式中,您执行 tree.SetItemText(pTVDispInfo->item.hItem, pTVDispInfo->item.pszText);从 TVN_ENDLABELEDIT 中。复制/粘贴没什么特别的 - 这是由编辑控件处理的。 问题是当我从另一个应用程序粘贴文本时 pTVDispInfo->item.pszText 为 NULL 粘贴时标签上的文字有变化吗?因为 item.pszText 的内容是你在“结束编辑”之前看到的。您是否尝试过从记事本粘贴?也许其他应用程序没有将 CF_TEXT 格式的内容放入剪贴板。只是在这里推测,我尝试了一个新的测试应用程序,只有一个树控件(Win8.1,VS2013)并且它适用于我(TM)。 【参考方案1】:我想您已经在您的应用程序中定义了一个也使用 Ctrl-V 的加速器。因此,在就地编辑控件中,您按 Ctrl+V 但这会导致从加速器生成 WM_COMMAND 消息。加速器执行的操作会中止就地编辑作业。
在这种情况下,您需要一个 PreTranslateMessage 处理程序来检查键盘输入是否通过 Ctrl+C/Ctrl+V 到达,并将此输入定向到打开的编辑控件,而不是让框架窗口加速器来处理它。
只需设置一个断点并查看调用堆栈并检查就地编辑停止时执行的内容。
【讨论】:
以上是关于在 CTreeView 标签中复制粘贴的主要内容,如果未能解决你的问题,请参考以下文章