我已经创建编辑控件的子类,并调用SubClassWindow关联了标签编辑,但是下一步应怎样做?先谢了!

解决方案 »

  1.   

    重载树状控件的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));
    }
      

  2.   

    楼上的代码我看着别扭,就顺手写了一个
    BOOL CPage1::PreTranslateMessage(MSG* pMsg) 
    {
    if( (pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_RETURN) )
    {
    return TRUE;
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  3.   

    不对呀。在编辑标签时树控件接受不到任何消息。
    我想知道的是编辑控件收到 VK_RETURN 时应对树控件做何操作。
    是发送 TVN_ENDLABELEDIT 通知消息吗?
      

  4.   

    1.编辑标签时树控件接受不到任何消息
    因为你编辑控件的派生类没有TranslateMessage(),从而拦截了所有击键消息。2.编辑控件收到 VK_RETURN 时应对树控件做何操作
    记得PostMessage时设hWnd为树控件的hWnd。
      

  5.   

    编辑控件的派生类是可以正常接收消息的。
    我的问题是:"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);
    }
      

  6.   

    删掉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;
    }
      

  7.   

    谢谢 icelight(icelight) 这么有耐心的给我解答。
    开始放分!