首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

请问一个关于CListCtrl控件的有关问题

2014-06-09 
请教一个关于CListCtrl控件的问题。请教一个关于CListCtrl控件的问题:我的目的是这样的,list控件内有3个大

请教一个关于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();
}

[解决办法]
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

热点排行