zoukankan      html  css  js  c++  java
  • 【转帖】BCGControlBar使用心得如何捕获Workspace bar类上的树控件的消息

    原帖地址:http://blog.csdn.net/rsjrj/archive/2009/02/12/3884480.aspx

    我想在MainFrame中捕获Workspace bar类上的树控件的通知消息 TVN_SELCHANGED,但是奇怪的是不能工作,而在非BCG的工程中确实可以的。
    代码如下:

     **********************************************************************
    // WorkspaceBar.cpp : implementation of the CWorkspaceBar class
    //

    BEGIN_MESSAGE_MAP(CWorkspaceBar, CBCGSizingControlBar)
    //{{AFX_MSG_MAP(CWorkspaceBar)
    ON_WM_CREATE()
    ON_WM_SIZE()
    ON_NOTIFY(TVN_SELCHANGED, 1, OnSelectTree)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()

    int CWorkspaceBar::OnCreate(LPCREATESTRUCT lpCreateStruct)
     {
    ....
    // Create tabs window:
    if (!m_wndTabs.Create (CBCGTabWnd::STYLE_3D, rectDummy, this, 1))
    {
    TRACE0("Failed to create workspace tab window");
    return -1; // fail to create
    }

    m_wndTabs.SetImageList (IDB_WORKSPACE, 16, RGB (255, 0, 255));

    // Create tree windows.
    // TODO: create your own tab windows here:
    const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES
    |

     TVS_LINESATROOT | TVS_HASBUTTONS;

    if (!m_wndTree1.Create (dwViewStyle, rectDummy, &m_wndTabs, 2) ||
    !m_wndTree2.Create (dwViewStyle, rectDummy, &m_wndTabs, 3))
    {
    TRACE0("Failed to create workspace view");
    return -1; // fail to create
    }
    ...
    }

    void CWorkspaceBar::OnSelectTree(NMHDR* pNMHDR, LRESULT* pResult)
     {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    *pResult = 0;
    }

    **********************************************************************
    // WorkspaceBar.h : interface of the CWorkspaceBar class
    //
    // Generated message map functions
    protected:
    //{{AFX_MSG(CWorkspaceBar)
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnSelectTree(NMHDR* pNMHDR, LRESULT* pResult);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };

    在BCG的网站上我看到了一个解决方法,就是你从CTreeCtrl 继承一个你自己的Tree Control类,在新类中处理消息。

    我不想这样实现。于是我去查找问题的根源,我发现BCG的CBCGTabWnd类截获了OnNotify消息,导致mainframe捕获不到。
    解决方法如下:
    1、从CBCGTabWnd 继承一个自己的类。
    2、在类中实现OnNotify虚函数。

    BOOL CMyTabCtrl::OnNotify (WPARAM wParam, LPARAM lParam, LRESULT* pResult){
     ASSERT_VALID (this);
     BOOL bRes = CBCGTabWnd::OnNotify (wParam, lParam, pResult);
     NMHDR* pNMHDR = (NMHDR*)lParam; ASSERT (pNMHDR != NULL);
    if (pNMHDR->code == TTN_SHOW && !m_bFlat) { m_ToolTip.SetWindowPos (&wndTop,
     -1, -1, -1, -1, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE); }
    if (pNMHDR->code == HDN_ITEMCHANGED) { SynchronizeScrollBar ();
    }
    if (wParam > 0) {
    CWnd* pChild = GetDlgItem(wParam);
    if (pChild)
    {
    if (IsChild(pChild))
    {
    GetOwner()->SendMessage(WM_NOTIFY,wParam,lParam);
    }
    }
    }
    return bRes;
    }
    3、在CWorkspaceBar类的OnCreate方法中确定你把CBCGTabWnd类改成你自己的类。
    4、在CWorkspaceBar类中,实现你想捕获的通知消息。

    ON_NOTIFY(NM_DBLCLK,ID_LIST,OnListDblClk)...void
     CWorkspaceBar::OnListDblClk(NMHDR* pNMHDR, LRESULT* pResult) { ... *pResult
     = 0;}

  • 相关阅读:
    1070 结绳
    1069 微博转发抽奖
    1068 万绿丛中一点红
    1067 试密码
    1066 图像过滤
    1065 单身狗
    CSS--文本溢出与换行
    css--滤镜filter
    css--flex布局
    css--table布局
  • 原文地址:https://www.cnblogs.com/carl2380/p/1915663.html
Copyright © 2011-2022 走看看