我用了一个在codeproject上面的CQuickList类,它是继承CListCtrl,我把它放到一个MDI窗口的一个DockingPane上,当我左键点击的时候发现一开始的时候要点两次(第二次才进NM_CLICK消息里面),才可以选择里面的内容,后来发现是焦点没有到那个CQuickList类里面,但我怎样才能使当我焦点不在这个控件的时候,点击的这个控件的时候,进入NM_CLICK,也就是只要点击一次就可以选中里面的内容了.

解决方案 »

  1.   

    lbottondown也一样,都要点两次才进去,估计也使没有焦点到控件
      

  2.   

    响应控件的OnFocus事件好了,在这个事件中调用NM_CLICK事件要做的事情
      

  3.   

    奇怪
    那你得先找到第一次点击相应了哪个消息
    然后原地mouseevent
    应该就能收到NM_CLICK了吧
      

  4.   

    把你NM_CLICK的代码贴出来。我想,应该是多了一句或者是少了一句什么代码的问题。不难解决
      

  5.   

    ON_NOTIFY_REFLECT_EX(NM_CLICK, OnClickEx)//On click 
    BOOL CQuickList::OnClickEx(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NMLISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; //Try to change navigation column when user clicks on an item
    CListHitInfo clickinfo;
    clickinfo.m_item = clickinfo.m_subitem = -1;
    clickinfo.m_onButton = clickinfo.m_onImage = false; if(HitTest(pNMListView->ptAction, clickinfo))
    {
    //First, try to navigate to the column
    TryNavigate(clickinfo.m_subitem); ::SendMessage( GetParent()->GetSafeHwnd(), 
    WM_QUICKLIST_CLICK, 
    (WPARAM) GetSafeHwnd(), 
    (LPARAM) &clickinfo);
    } *pResult = 0; return FALSE;
    }
      

  6.   

    if(HitTest(pNMListView->ptAction, clickinfo)) 

    //First, try to navigate to the column 
    TryNavigate(clickinfo.m_subitem); ::SendMessage( GetParent()->GetSafeHwnd(),  
    WM_QUICKLIST_CLICK,  
    (WPARAM) GetSafeHwnd(),  
    (LPARAM) &clickinfo); 
    } 看看HitTest返回的值,
      

  7.   

    没有得到焦点的时候,根本没有触发 OnClickEx函数
      

  8.   

    onfocus触发了,但我怎样想前面的大哥说的,"响应控件的OnFocus事件好了,在这个事件中调用NM_CLICK事件要做的事情",但在onfocus做不了NM_CLICK事件要做的事情,BOOL CQuickList::OnClickEx(NMHDR* pNMHDR, LRESULT* pResult) 
    里面的两个指针在onfocus怎样传呀?
      

  9.   

    响应onfocus
    用mouseevent让它原地再点一次
      

  10.   

    POINT pt;
    GetCursorPos(&pt);
    ::mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 1);
    ::mouse_event(MOUSEEVENTF_LEFTUP, pt.x, pt.y, 0, 1);
    试试看..
      

  11.   

    大哥按照你的发现,还是不行,虽然做了
    POINT pt; 
    GetCursorPos(&pt); 
    ::mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 1); 
    ::mouse_event(MOUSEEVENTF_LEFTUP, pt.x, pt.y, 0, 1); 但 NM_CLICK事件根本没有触发,函数没有进去
      

  12.   

    看来得用postmessage的方式
      

  13.   

    postmessage也很难传NM_CLICK事件,里面需要两个参数,onfocus获取不了这两个参数
      

  14.   

    只用::mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 1);呢?
    不要up了
      

  15.   

    只用::mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 1);  也不行 
      

  16.   

    何苦呢。你把CLICK要执行的程序,在OnFocus中执行一遍不就行了嘛。如果需要判断点击的行和列,可以用SubItemHitTest来获得
      

  17.   

    可以了,要做两次
    ::mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 1);  
    ::mouse_event(MOUSEEVENTF_LEFTUP, pt.x, pt.y, 0, 1);  
    谢谢,shakaqrj 大哥!
      

  18.   

    你在CQuickList中再添加一个WM_SETFOCUS事件,在其中执行CQuickList::OnClickEx,这应该是可行的