如何在对话框的状态栏中显示listbox项目的提示信息?
对话框A中已经添加了状态栏,和离歌list box控件m_listbox,m_listbox中有若干个items,请问如何在状态栏中显示items的提示信息,就像是点击菜单项时在状态栏中有提示信息一样。

解决方案 »

  1.   

    重载CListBox,在OnMouseMove函数中添加如下:
    TRACKMOUSEEVENT evtMouse;
    evtMouse.cbSize=sizeof(evtMouse);
    evtMouse.dwFlags=TME_HOVER | TME_LEAVE;
    evtMouse.dwHoverTime=1;
    evtMouse.hwndTrack=this->GetSafeHwnd();
    _TrackMouseEvent(&evtMouse);
    if(m_bHover)
    {
         int nHoverItemIndex=ItemFromPoint(point);
         if(nHoverItemIndex>=0 && nHoverItemIndex<this->GetItemCount())
         {//根据当前鼠标悬停在哪个Item上组织你的提示信息
               StatusBar.SetPaneText(你要在StatusBar的那个面板上显示提示,提示信息字符串);
         }
    }
    CListBox::OnMouseMove(nFlags, point);然后重载CListBox的DefWindowProc,添加如下:
    switch(message)
    {
    case WM_MOUSELEAVE:
    if(m_bHover)
    {
    m_bHover=FALSE; //重置悬停
    }
    return 0;
    case WM_MOUSEHOVER:
    if(!m_bHover)
    {
    m_bHover=TRUE; //鼠标进入,绘制窗体
    }
    return 0;
    }
    其中m_bHover是重载类中的一个成员,用于指示鼠标是否悬停在ListBox窗口上,初始值为FALSE;
      

  2.   

    错误修正:
    代码块
    if(m_bHover) 

        int nHoverItemIndex=ItemFromPoint(point); 
        if(nHoverItemIndex>=0 && nHoverItemIndex <this->GetItemCount()) 
        {//根据当前鼠标悬停在哪个Item上组织你的提示信息 
              StatusBar.SetPaneText(你要在StatusBar的那个面板上显示提示,提示信息字符串); 
        } 

    应当放置于case WM_MOUSEHOVER: 中
    case WM_MOUSEHOVER: 
    if(!m_bHover) 

    m_bHover=TRUE; //鼠标进入,绘制窗体 
    }
    if(m_bHover) 

        int nHoverItemIndex=ItemFromPoint(point); 
        if(nHoverItemIndex>=0 && nHoverItemIndex <this->GetItemCount()) 
        {//根据当前鼠标悬停在哪个Item上组织你的提示信息 
              StatusBar.SetPaneText(你要在StatusBar的那个面板上显示提示,提示信息字符串); 
        } 
    }
      

  3.   

    如果把代码块修改为:
    case WM_MOUSEHOVER: 
    if(!m_bHover) 

    m_bHover=TRUE; //鼠标进入,绘制窗体 

    if(m_bHover) 

        int nHoverItemIndex=ItemFromPoint(point); 
        if(nHoverItemIndex>=0 && nHoverItemIndex <this->GetItemCount()) 
        {//根据当前鼠标悬停在哪个Item上组织你的提示信息 
              StatusBar.SetPaneText(你要在StatusBar的那个面板上显示提示,提示信息字符串); 
        } 

    那么int nHoverItemIndex=ItemFromPoint(point); 这里的point要怎么获取呢?提示没有定义。
    listbox中有多个items,鼠标移动到不同的项目上如何显示不同的信息呢?
    是这样吗?
    m_wndStatusBar.SetPaneText(0,"str1"); 
    m_wndStatusBar.SetPaneText(0,"str2"); 
      

  4.   

    如果把代码块修改为:
    case WM_MOUSEHOVER: 
    if(!m_bHover) 

    m_bHover=TRUE; //鼠标进入,绘制窗体 

    if(m_bHover) 

        int nHoverItemIndex=ItemFromPoint(point); 
        if(nHoverItemIndex>=0 && nHoverItemIndex <this->GetItemCount()) 
        {//根据当前鼠标悬停在哪个Item上组织你的提示信息 
              StatusBar.SetPaneText(你要在StatusBar的那个面板上显示提示,提示信息字符串); 
        } 

    那么int nHoverItemIndex=ItemFromPoint(point); 这里的point要怎么获取呢?提示没有定义。
    listbox中有多个items,鼠标移动到不同的项目上如何显示不同的信息呢?
    是这样吗?
    m_wndStatusBar.SetPaneText(0,"str1"); 
    m_wndStatusBar.SetPaneText(0,"str2"); 
      

  5.   

    如果把代码块修改为:
    case WM_MOUSEHOVER: 
    if(!m_bHover) 

    m_bHover=TRUE; //鼠标进入,绘制窗体 

    if(m_bHover) 

        int nHoverItemIndex=ItemFromPoint(point); 
        if(nHoverItemIndex>=0 && nHoverItemIndex <this->GetItemCount()) 
        {//根据当前鼠标悬停在哪个Item上组织你的提示信息 
              StatusBar.SetPaneText(你要在StatusBar的那个面板上显示提示,提示信息字符串); 
        } 

    那么int nHoverItemIndex=ItemFromPoint(point); 这里的point要怎么获取呢?提示没有定义。
    listbox中有多个items,鼠标移动到不同的项目上如何显示不同的信息呢?
    是这样吗?
    m_wndStatusBar.SetPaneText(0,"str1"); 
    m_wndStatusBar.SetPaneText(0,"str2"); 
      

  6.   

    啊,Sorry
    int nHoverItemIndex=ItemFromPoint(point);中的point这么获得POINTS point;
    point=MAKEPOINTS(lParam);我来说下原理好了
    你需要重载一个CListBox,在鼠标移动的响应函数中要求它追踪鼠标的悬停和离开事件,当鼠标悬停时,根据鼠标悬停的位置来的到相应的Item索引,也就是鼠标悬停在那一个Item上,然后你自己根据需要来设置你的提示信息。TRACKMOUSEEVENT evtMouse; 
    evtMouse.cbSize=sizeof(evtMouse); 
    evtMouse.dwFlags=TME_HOVER | TME_LEAVE; 
    evtMouse.dwHoverTime=1; 
    evtMouse.hwndTrack=this->GetSafeHwnd(); 
    _TrackMouseEvent(&evtMouse); 要求追踪鼠标悬停和离开事件int nHoverItemIndex=ItemFromPoint(point); 根据悬停点来得到相应的Item索引
      

  7.   

    if(m_bHover) 

    POINTS point; 
    BOOL bOutSide = TRUE;
    point=MAKEPOINTS(lParam); 
    int nHoverItemIndex=ItemFromPoint(point,bOutSide); 
    if(nHoverItemIndex>=0 && nHoverItemIndex < this->GetCount()) 
    {//根据当前鼠标悬停在哪个Item上组织你的提示信息 
    m_wndStatusBar.SetPaneText(0,"str"); 


    提示错误:error C2664: 'ItemFromPoint' : cannot convert parameter 1 from 'struct tagPOINTS' to 'class CPoint'
            No constructor could take the source type, or constructor overload resolution was ambiguouserror C2065: 'm_wndStatusBar' : undeclared identifier  在该函数中应该如何引用之前定义好的'm_wndStatusBar' 
      

  8.   


    int nHoverItemIndex=ItemFromPoint(CPoint(point.x,point.y),bOutSide);
    m_wndStatusBar是对话框的成员吧,你用GetParent()得到父指针,强制转化成对话框类型,然后再去得到那个m_wndStatusBar对象吧
      

  9.   

    CStatusBar* pSBar = (CStatusBar*)GetParent()->GetDlgItem(m_wndStatusBar);
    但是m_wndStatusBar是我在对话框类中申明的一个成员变量:
    public:
    CStatusBar m_wndStatusBar;
    无法用GetDlgItem()
      

  10.   

    CYourDlg* pdlg=(CYourDlg*)GetParent();
    pdlg->m_wndStatusBar.SetPaneText(0,...);
      

  11.   

    CLcmDlg* pdlg = (CLcmDlg*)GetParent();
    switch (nHoverItemIndex)
    {
    case 0:
    pdlg->m_wndStatusBar.SetPaneText(0,"str");
    break;
    case 1:
    pdlg->m_wndStatusBar.SetPaneText(0,"str1");
    break;
    case 2:
    pdlg->m_wndStatusBar.SetPaneText(0,"str2");
    break;
    case 3:
    pdlg->m_wndStatusBar.SetPaneText(0,"str3");
    break;
    .....
    }
    list box中有若干个items,使用switch语句可以实现在状态栏显示提示信息了,但是程序运行之后关闭窗口的时候会有报错。
      

  12.   

    错误提示:
    Unhandled exception in Lcm.exe (MFC42D.DLL):0xC0000005:Access Violation.提示指针越界,如何处理
      

  13.   

    我测试了一下:重新写了一个对话框包含list box 并初始化,向对话框添加了状态栏,运行时状态栏是正常显示提示信息的,没有错误。
    但是原来的那个程序却提示:Unhandled exception in Lcm.exe (MFC42D.DLL):0xC0000005:Access Violation.
    而且还有警告:Warning: no listbox item selected.
    怎么回事呢?
      

  14.   

    我进行单步调试时:有显示到这个位置:C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include\AFX.INL 
    这个文件的如下代码有黄色箭头提示:
    // CString
    _AFX_INLINE CStringData* CString::GetData() const
    { ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }
      

  15.   

    跟进去,显示m_pchData 的this指针错误:CXX0030:Error:expression cannot be evoluated
      

  16.   

    同楼主,Warning: no listbox item selected这个警告是由DDX_LBString这个函数抛出的,是因为控件关联了一个CString类型的变量,但不知道怎么去掉这个警告,望高手回复