如何在按下回车时结束对树控件的标签的编辑? 我已经创建编辑控件的子类,并调用SubClassWindow关联了标签编辑,但是下一步应怎样做?先谢了! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 重载树状控件的PreTranslateMessage()。BOOL CMyTree::PreTranslateMessage(MSG *pMsg){ BOOL b = false; if(pMsg->message == WM_KEYDOWN) if(pMsg->wParam == VK_RETURN) { b = true; // do anything you like. } return (b?TRUE:CTreeCtrl::PreTranslateMessage(pMsg));} 楼上的代码我看着别扭,就顺手写了一个BOOL CPage1::PreTranslateMessage(MSG* pMsg) { if( (pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_RETURN) ) { return TRUE; } return CDialog::PreTranslateMessage(pMsg);} 不对呀。在编辑标签时树控件接受不到任何消息。我想知道的是编辑控件收到 VK_RETURN 时应对树控件做何操作。是发送 TVN_ENDLABELEDIT 通知消息吗? 1.编辑标签时树控件接受不到任何消息因为你编辑控件的派生类没有TranslateMessage(),从而拦截了所有击键消息。2.编辑控件收到 VK_RETURN 时应对树控件做何操作记得PostMessage时设hWnd为树控件的hWnd。 编辑控件的派生类是可以正常接收消息的。我的问题是:"do anything you like" 应该做什么?以下是我的部分代码:class CLabelEdit : public CEdit{ DECLARE_DYNAMIC(CLabelEdit)public: CLabelEdit(); virtual ~CLabelEdit();protected: DECLARE_MESSAGE_MAP() virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);}; . . .class CProjectTree : public CTreeCtrl{ DECLARE_DYNAMIC(CProjectTree)public: CProjectTree(); virtual ~CProjectTree();public: CImageList m_imglst; CLabelEdit m_edit;protected: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); DECLARE_MESSAGE_MAP()public: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnTvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnTvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnDestroy();}; . . .void CProjectTree::OnTvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult){ LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR); HTREEITEM htiItem = pTVDispInfo->item.hItem; DWORD_PTR dwData = GetItemData(htiItem); if (dwData == NULL) return; CObject* pObject = (CObject*)dwData; if (pObject->IsKindOf(RUNTIME_CLASS(CProjectItem))) { CProjectItem* pPrjItem = (CProjectItem*)pObject; if (pPrjItem->m_Type == CProjectItem::FILTER) { HWND hWnd = GetEditControl()->GetSafeHwnd(); m_edit.SubclassWindow(hWnd); *pResult = 0; return; } } *pResult = 1;} . . .// CLabelEdit 消息处理程序LRESULT CLabelEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){ switch (message) { case WM_GETDLGCODE: if (wParam == _T('\r')) // TODO: break; case WM_KEYUP: if (wParam == 27) // TODO: 这里应做什么? break; } return CEdit::WindowProc(message, wParam, lParam);} 删掉CLabelEdit::WindowProc(),重载PreTranslateMessage()CLabelEdit::PreTranslateMessage(MSG *pMsg){ if( (pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_RETURN) ) { ::TranslateMessage(pMsg); ::DispathMessage(pMsg); return TRUE; } return CEdit::PreTranslateMessage(pMsg);}//此时树状控件应该能收到按回车键的消息了,当树状控件收到回车时会自动调用OnEndlabeledit(),你需要重载它。void CMyTree::OnEndLabelEdit (NMHDR* pNMHDR, LRESULT* pResult){ *pResult = 1;} 谢谢 icelight(icelight) 这么有耐心的给我解答。开始放分! 动态按钮显示1半 关于CDoument类的一个问题 对于Format函数的使用 求助:VC6操作EXCEL XP,启动EXCEL服务器失败,急!!! 动态建立CEdit 和 CComboBox 的问题 帮帮我解决这个问题 今晚能给我答复吗? 数据类型 高手替我看下这个数据源设置该如何写 请问如何自己写文件格式 avi问题,答对100分 急! 关于char* 的小问题,送分!!!
BOOL CMyTree::PreTranslateMessage(MSG *pMsg)
{
BOOL b = false;
if(pMsg->message == WM_KEYDOWN)
if(pMsg->wParam == VK_RETURN)
{
b = true;
// do anything you like.
}
return (b?TRUE:CTreeCtrl::PreTranslateMessage(pMsg));
}
BOOL CPage1::PreTranslateMessage(MSG* pMsg)
{
if( (pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_RETURN) )
{
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
我想知道的是编辑控件收到 VK_RETURN 时应对树控件做何操作。
是发送 TVN_ENDLABELEDIT 通知消息吗?
因为你编辑控件的派生类没有TranslateMessage(),从而拦截了所有击键消息。2.编辑控件收到 VK_RETURN 时应对树控件做何操作
记得PostMessage时设hWnd为树控件的hWnd。
我的问题是:"do anything you like" 应该做什么?
以下是我的部分代码:class CLabelEdit : public CEdit
{
DECLARE_DYNAMIC(CLabelEdit)public:
CLabelEdit();
virtual ~CLabelEdit();protected:
DECLARE_MESSAGE_MAP() virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
};
.
.
.
class CProjectTree : public CTreeCtrl
{
DECLARE_DYNAMIC(CProjectTree)public:
CProjectTree();
virtual ~CProjectTree();public:
CImageList m_imglst;
CLabelEdit m_edit;protected:
virtual BOOL PreCreateWindow(CREATESTRUCT& cs); DECLARE_MESSAGE_MAP()
public:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnTvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnTvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnDestroy();
}; .
.
.
void CProjectTree::OnTvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR); HTREEITEM htiItem = pTVDispInfo->item.hItem;
DWORD_PTR dwData = GetItemData(htiItem);
if (dwData == NULL)
return;
CObject* pObject = (CObject*)dwData; if (pObject->IsKindOf(RUNTIME_CLASS(CProjectItem)))
{
CProjectItem* pPrjItem = (CProjectItem*)pObject; if (pPrjItem->m_Type == CProjectItem::FILTER)
{
HWND hWnd = GetEditControl()->GetSafeHwnd();
m_edit.SubclassWindow(hWnd); *pResult = 0;
return;
}
} *pResult = 1;
}
.
.
.
// CLabelEdit 消息处理程序
LRESULT CLabelEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_GETDLGCODE:
if (wParam == _T('\r'))
// TODO:
break;
case WM_KEYUP:
if (wParam == 27)
// TODO: 这里应做什么?
break;
} return CEdit::WindowProc(message, wParam, lParam);
}
CLabelEdit::PreTranslateMessage(MSG *pMsg)
{
if( (pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_RETURN) )
{
::TranslateMessage(pMsg);
::DispathMessage(pMsg);
return TRUE;
}
return CEdit::PreTranslateMessage(pMsg);
}
//此时树状控件应该能收到按回车键的消息了,当树状控件收到回车时会自动调用OnEndlabeledit(),你需要重载它。
void CMyTree::OnEndLabelEdit (NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult = 1;
}
开始放分!