请问一个关于CListCtrl控件的有关问题
请教一个关于CListCtrl控件的问题。
请教一个关于CListCtrl控件的问题:
我的目的是这样的,list控件内有3个大图标,鼠标放到控件内的第一个图标上会弹出一个窗口,窗口内有个static控件显示“1”;第2个第3个相同。 在图标以外的地方就将窗口隐藏掉。
我的问题是,现在可以在鼠标停留在图标上的时候弹出窗口 但是光标一直都在闪烁,弹出的窗口也是在闪,我知道可能是因为鼠标一直在list控件内 所以OnHover一直在被调用的原因,我想请教一个好点的解决办法,麻烦各位高手稍微详细点给讲解一下。以下是代码:
BOOL CTestDlg::OnInitDialog()
{
.....
dlg1 = new CADlg();
dlg1->Create(IDD_DIALOG1,0);
dlg1->SetFocus();
dlg1->ShowWindow(SW_HIDE);
m_ImageList.Create(32, 32, ILC_COLOR24|ILC_MASK, 1, 0);
m_ImageList.Add(LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1)));
m_ImageList.Add(LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1)));
m_ImageList.Add(LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1)));
m_List1.SetImageList(&m_ImageList, LVSIL_NORMAL);
m_List1.SetExtendedStyle(m_List1.GetStyle() | LVS_EX_TRACKSELECT);
m_List1.InsertItem(0, "1", 0);
m_List1.InsertItem(1, "2", 1);
m_List1.InsertItem(2, "3", 2);
}
void CTestDlg::OnHover(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint point;
GetCursorPos(&point);
for(int i = 0; i < 3; i++)
{
m_List1.GetItemRect(i,re[i],LVIR_ICON);
ClientToScreen(re[i]);
if(re[i].PtInRect(point))
{
HCURSOR m_hCursor;
m_hCursor = ::LoadCursor(NULL, MAKEINTRESOURCE(32649)); //将鼠标变成小手的形状
::SetCursor(m_hCursor);
dlg1->SetWindowPos(NULL,80,80,0,0,SWP_NOZORDER | SWP_NOSIZE);
dlg1->ShowWindow(SW_SHOW);
}
else if(!re[i].PtInRect(point))
{
dlg1->ShowWindow(SW_HIDE);
}
SetForegroundWindow(); //这个是为了在窗口弹出的时候让list继续拥有焦点 好可以继
// 响应 OnHover
}
}
鼠标悬停在大图标上的时候 就是频率非常快的闪动,请教下各位高手 是不是我的方法用的不对?应该用怎样的方法?
------解决方案--------------------
可以判断一下窗口是否已经存在,如果已经存在就不做显示。在MFC程序中,可以通过CWnd::GetSafeHwnd()来获取窗口句柄,使用IsWindow(wnd.GetSafeHwnd())来判断wnd对象是否存在
------解决方案--------------------
你应该判断窗口是否显示了,如果已经显示就不在显示,如果没有再显示,语法:
------解决方案--------------------
void CTestDlg::OnHover(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint point;
GetCursorPos(&point);
for(int i = 0; i < 3; i++)
{
m_List1.GetItemRect(i,re[i],LVIR_ICON);
ClientToScreen(re[i]);
if(re[i].PtInRect(point))
{
//━━━━━━━━━━━━━如果这次和上次是在同一个rect里,do nothing━━━━━━━━━
static PreIndex=-1; //一定要定义为静态变量
if (i==PreIndex)
break;
PreIndex=i; //保存这一次item的索引
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
HCURSOR m_hCursor;
m_hCursor = ::LoadCursor(NULL, MAKEINTRESOURCE(32649)); //将鼠标变成小手的形状
::SetCursor(m_hCursor);
//dlg1->SetWindowPos(NULL,80,80,0,0,SWP_NOZORDER
------解决方案--------------------
SWP_NOSIZE);
//dlg1->ShowWindow(SW_SHOW);
//使用SWP_NOACTIVATE激活窗口无焦点,那你的clistctrl就不会失去焦点了,下面的SetForegroundWindow也就不需要了
dlg1->SetWindowPos(NULL,80,80,0,0,SWP_NOZORDER
------解决方案--------------------
SWP_NOSIZE
------解决方案--------------------
SWP_NOACTIVATE
------解决方案--------------------
SWP_SHOWWINDOW);
}
else if(!re[i].PtInRect(point))
{
dlg1->ShowWindow(SW_HIDE);
}
SetForegroundWindow(); //这个是为了在窗口弹出的时候让list继续拥有焦点 好可以继
// 响应 OnHover
}
}
------解决方案--------------------
我没理解错的话你就是想做tooltip吧?
http://blog.csdn.net/shen_wei/article/details/5631427
请教一个关于CListCtrl控件的问题:
我的目的是这样的,list控件内有3个大图标,鼠标放到控件内的第一个图标上会弹出一个窗口,窗口内有个static控件显示“1”;第2个第3个相同。 在图标以外的地方就将窗口隐藏掉。
我的问题是,现在可以在鼠标停留在图标上的时候弹出窗口 但是光标一直都在闪烁,弹出的窗口也是在闪,我知道可能是因为鼠标一直在list控件内 所以OnHover一直在被调用的原因,我想请教一个好点的解决办法,麻烦各位高手稍微详细点给讲解一下。以下是代码:
BOOL CTestDlg::OnInitDialog()
{
.....
dlg1 = new CADlg();
dlg1->Create(IDD_DIALOG1,0);
dlg1->SetFocus();
dlg1->ShowWindow(SW_HIDE);
m_ImageList.Create(32, 32, ILC_COLOR24|ILC_MASK, 1, 0);
m_ImageList.Add(LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1)));
m_ImageList.Add(LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1)));
m_ImageList.Add(LoadIcon(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1)));
m_List1.SetImageList(&m_ImageList, LVSIL_NORMAL);
m_List1.SetExtendedStyle(m_List1.GetStyle() | LVS_EX_TRACKSELECT);
m_List1.InsertItem(0, "1", 0);
m_List1.InsertItem(1, "2", 1);
m_List1.InsertItem(2, "3", 2);
}
void CTestDlg::OnHover(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint point;
GetCursorPos(&point);
for(int i = 0; i < 3; i++)
{
m_List1.GetItemRect(i,re[i],LVIR_ICON);
ClientToScreen(re[i]);
if(re[i].PtInRect(point))
{
HCURSOR m_hCursor;
m_hCursor = ::LoadCursor(NULL, MAKEINTRESOURCE(32649)); //将鼠标变成小手的形状
::SetCursor(m_hCursor);
dlg1->SetWindowPos(NULL,80,80,0,0,SWP_NOZORDER | SWP_NOSIZE);
dlg1->ShowWindow(SW_SHOW);
}
else if(!re[i].PtInRect(point))
{
dlg1->ShowWindow(SW_HIDE);
}
SetForegroundWindow(); //这个是为了在窗口弹出的时候让list继续拥有焦点 好可以继
// 响应 OnHover
}
}
鼠标悬停在大图标上的时候 就是频率非常快的闪动,请教下各位高手 是不是我的方法用的不对?应该用怎样的方法?
------解决方案--------------------
可以判断一下窗口是否已经存在,如果已经存在就不做显示。在MFC程序中,可以通过CWnd::GetSafeHwnd()来获取窗口句柄,使用IsWindow(wnd.GetSafeHwnd())来判断wnd对象是否存在
------解决方案--------------------
你应该判断窗口是否显示了,如果已经显示就不在显示,如果没有再显示,语法:
if (!IsWindowVisible(dlg1->GetSafeHwnd()))
{
dlg1->ShowWindow();
}
------解决方案--------------------
void CTestDlg::OnHover(NMHDR *pNMHDR, LRESULT *pResult)
{
CPoint point;
GetCursorPos(&point);
for(int i = 0; i < 3; i++)
{
m_List1.GetItemRect(i,re[i],LVIR_ICON);
ClientToScreen(re[i]);
if(re[i].PtInRect(point))
{
//━━━━━━━━━━━━━如果这次和上次是在同一个rect里,do nothing━━━━━━━━━
static PreIndex=-1; //一定要定义为静态变量
if (i==PreIndex)
break;
PreIndex=i; //保存这一次item的索引
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
HCURSOR m_hCursor;
m_hCursor = ::LoadCursor(NULL, MAKEINTRESOURCE(32649)); //将鼠标变成小手的形状
::SetCursor(m_hCursor);
//dlg1->SetWindowPos(NULL,80,80,0,0,SWP_NOZORDER
------解决方案--------------------
SWP_NOSIZE);
//dlg1->ShowWindow(SW_SHOW);
//使用SWP_NOACTIVATE激活窗口无焦点,那你的clistctrl就不会失去焦点了,下面的SetForegroundWindow也就不需要了
dlg1->SetWindowPos(NULL,80,80,0,0,SWP_NOZORDER
------解决方案--------------------
SWP_NOSIZE
------解决方案--------------------
SWP_NOACTIVATE
------解决方案--------------------
SWP_SHOWWINDOW);
}
else if(!re[i].PtInRect(point))
{
dlg1->ShowWindow(SW_HIDE);
}
SetForegroundWindow(); //这个是为了在窗口弹出的时候让list继续拥有焦点 好可以继
// 响应 OnHover
}
}
------解决方案--------------------
我没理解错的话你就是想做tooltip吧?
http://blog.csdn.net/shen_wei/article/details/5631427