一个CListCtrl继承类的左键点击的问题 我用了一个在codeproject上面的CQuickList类,它是继承CListCtrl,我把它放到一个MDI窗口的一个DockingPane上,当我左键点击的时候发现一开始的时候要点两次(第二次才进NM_CLICK消息里面),才可以选择里面的内容,后来发现是焦点没有到那个CQuickList类里面,但我怎样才能使当我焦点不在这个控件的时候,点击的这个控件的时候,进入NM_CLICK,也就是只要点击一次就可以选中里面的内容了. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 lbottondown也一样,都要点两次才进去,估计也使没有焦点到控件 响应控件的OnFocus事件好了,在这个事件中调用NM_CLICK事件要做的事情 奇怪那你得先找到第一次点击相应了哪个消息然后原地mouseevent应该就能收到NM_CLICK了吧 把你NM_CLICK的代码贴出来。我想,应该是多了一句或者是少了一句什么代码的问题。不难解决 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;} 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返回的值, 没有得到焦点的时候,根本没有触发 OnClickEx函数 onfocus触发了,但我怎样想前面的大哥说的,"响应控件的OnFocus事件好了,在这个事件中调用NM_CLICK事件要做的事情",但在onfocus做不了NM_CLICK事件要做的事情,BOOL CQuickList::OnClickEx(NMHDR* pNMHDR, LRESULT* pResult) 里面的两个指针在onfocus怎样传呀? 响应onfocus用mouseevent让它原地再点一次 POINT pt;GetCursorPos(&pt);::mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 1);::mouse_event(MOUSEEVENTF_LEFTUP, pt.x, pt.y, 0, 1);试试看.. 大哥按照你的发现,还是不行,虽然做了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事件根本没有触发,函数没有进去 看来得用postmessage的方式 postmessage也很难传NM_CLICK事件,里面需要两个参数,onfocus获取不了这两个参数 只用::mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 1);呢?不要up了 只用::mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 1); 也不行 何苦呢。你把CLICK要执行的程序,在OnFocus中执行一遍不就行了嘛。如果需要判断点击的行和列,可以用SubItemHitTest来获得 可以了,要做两次::mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 1); ::mouse_event(MOUSEEVENTF_LEFTUP, pt.x, pt.y, 0, 1); 谢谢,shakaqrj 大哥! 你在CQuickList中再添加一个WM_SETFOCUS事件,在其中执行CQuickList::OnClickEx,这应该是可行的 做个采集程序,有一个按钮第一次点击是采样,第二次是停止,但是采样过程的时间不确定,除了使用多线程,怎么响应停止按钮? listcontrol怎么进行互相拖拽 请教:以太网帧首部中没有长度信息,网卡是如何知道该帧已经结束了的呢? 请问如何从文件句柄得到文件名? 请问有发短信的代码吗? 读取truetype 字体的源代码 提问,提问,怎样重画客户区~~ 粘了一下午了!难道就没有人给回答吗?(VC出错提示) 怎样获取IOCTL 菜鸟问题,怎么才能做一个静态库的工程。 不能让自己所画的图象保持 怎么写能CUI又能GUI的程序
那你得先找到第一次点击相应了哪个消息
然后原地mouseevent
应该就能收到NM_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;
}
{
//First, try to navigate to the column
TryNavigate(clickinfo.m_subitem); ::SendMessage( GetParent()->GetSafeHwnd(),
WM_QUICKLIST_CLICK,
(WPARAM) GetSafeHwnd(),
(LPARAM) &clickinfo);
} 看看HitTest返回的值,
里面的两个指针在onfocus怎样传呀?
用mouseevent让它原地再点一次
GetCursorPos(&pt);
::mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 1);
::mouse_event(MOUSEEVENTF_LEFTUP, pt.x, pt.y, 0, 1);
试试看..
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事件根本没有触发,函数没有进去
不要up了
::mouse_event(MOUSEEVENTF_LEFTDOWN, pt.x, pt.y, 0, 1);
::mouse_event(MOUSEEVENTF_LEFTUP, pt.x, pt.y, 0, 1);
谢谢,shakaqrj 大哥!