请教一个关于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对象是否存在
[解决办法]
你应该判断窗口是否显示了,如果已经显示就不在显示,如果没有再显示,语法:
if (!IsWindowVisible(dlg1->GetSafeHwnd()))
{
dlg1->ShowWindow();
}