如何在对话框的状态栏中显示listbox项目的提示信息 如何在对话框的状态栏中显示listbox项目的提示信息?对话框A中已经添加了状态栏,和离歌list box控件m_listbox,m_listbox中有若干个items,请问如何在状态栏中显示items的提示信息,就像是点击菜单项时在状态栏中有提示信息一样。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 重载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; 错误修正:代码块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的那个面板上显示提示,提示信息字符串); } } 如果把代码块修改为: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"); 如果把代码块修改为: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"); 如果把代码块修改为: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"); 啊,Sorryint 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索引 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' int nHoverItemIndex=ItemFromPoint(CPoint(point.x,point.y),bOutSide);m_wndStatusBar是对话框的成员吧,你用GetParent()得到父指针,强制转化成对话框类型,然后再去得到那个m_wndStatusBar对象吧 CStatusBar* pSBar = (CStatusBar*)GetParent()->GetDlgItem(m_wndStatusBar);但是m_wndStatusBar是我在对话框类中申明的一个成员变量:public: CStatusBar m_wndStatusBar;无法用GetDlgItem() CYourDlg* pdlg=(CYourDlg*)GetParent();pdlg->m_wndStatusBar.SetPaneText(0,...); 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语句可以实现在状态栏显示提示信息了,但是程序运行之后关闭窗口的时候会有报错。 错误提示:Unhandled exception in Lcm.exe (MFC42D.DLL):0xC0000005:Access Violation.提示指针越界,如何处理 我测试了一下:重新写了一个对话框包含list box 并初始化,向对话框添加了状态栏,运行时状态栏是正常显示提示信息的,没有错误。但是原来的那个程序却提示:Unhandled exception in Lcm.exe (MFC42D.DLL):0xC0000005:Access Violation.而且还有警告:Warning: no listbox item selected.怎么回事呢? 我进行单步调试时:有显示到这个位置: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; } 跟进去,显示m_pchData 的this指针错误:CXX0030:Error:expression cannot be evoluated 同楼主,Warning: no listbox item selected这个警告是由DDX_LBString这个函数抛出的,是因为控件关联了一个CString类型的变量,但不知道怎么去掉这个警告,望高手回复 vs2008 opengl stl 反注册DLL不成功? VC2005 如何操作word 如何将xml文件转换成access 数据库中的一个表(wplpwj) 虚函数与纯虚函数有什么区别??? 菜农求救:请不要告诉我这是VC的bug:~! 高分相送:在OnPrint中分页打印怎样实现? CString类的AssignCopy函数初始化有问题 关于Combobox SetItemData与GetItemData 将ogre导入mfc的问题 SQL Server 不存在或访问被拒绝 RTP的视频流中,client如何回复server(格式)
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;
代码块
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的那个面板上显示提示,提示信息字符串);
}
}
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");
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");
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");
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索引
{
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'
int nHoverItemIndex=ItemFromPoint(CPoint(point.x,point.y),bOutSide);
m_wndStatusBar是对话框的成员吧,你用GetParent()得到父指针,强制转化成对话框类型,然后再去得到那个m_wndStatusBar对象吧
但是m_wndStatusBar是我在对话框类中申明的一个成员变量:
public:
CStatusBar m_wndStatusBar;
无法用GetDlgItem()
pdlg->m_wndStatusBar.SetPaneText(0,...);
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语句可以实现在状态栏显示提示信息了,但是程序运行之后关闭窗口的时候会有报错。
Unhandled exception in Lcm.exe (MFC42D.DLL):0xC0000005:Access Violation.提示指针越界,如何处理
但是原来的那个程序却提示:Unhandled exception in Lcm.exe (MFC42D.DLL):0xC0000005:Access Violation.
而且还有警告:Warning: no listbox item selected.
怎么回事呢?
这个文件的如下代码有黄色箭头提示:
// CString
_AFX_INLINE CStringData* CString::GetData() const
{ ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }