模拟combo box快成功了。解决方案
模拟combo box快成功了。
想模拟combo box,比如我想让他弹出个树列表。
通过跟踪发现,combo box下拉时,弹出List box,其实这个list box的父窗口是桌面,怪不得这个list box总是在最上,不会被其它控件挡住,看验证代码:
跟踪发现hwndParen和hwndDesktop的值是一样的。所以:
基本上成功了,但m_tree无法获得焦点,点击后,选择项是失去焦点的颜色,滚动条当然也不支持鼠轮滚轮滚动了。
难道桌面的子控件无法获得焦点吗?不过我想,combo box弹出的list box其实也是没有获得焦点的,因为combobox内的edit没有失去焦点,但微软还是做到了让选中项高亮和支持鼠标滚轮,但我如何做都达不到目的。
------解决方案--------------------
恩 好样的
------解决方案--------------------
mark,很有意义,看能否解决
------解决方案--------------------
犀利啊
------解决方案--------------------
分享??
------解决方案--------------------
原来这个贴是最新的,我说怎么眼熟。
------解决方案--------------------
------解决方案--------------------
LZ自己搞定与大家分享,顶一个,祝LZ新年快乐!
------解决方案--------------------
很不错,自己实现控件。
------解决方案--------------------
楼主过年了也不休息啊,呵呵。。。
------解决方案--------------------
小小的建议:做成ActiveX,让大家直接用吧。
想模拟combo box,比如我想让他弹出个树列表。
通过跟踪发现,combo box下拉时,弹出List box,其实这个list box的父窗口是桌面,怪不得这个list box总是在最上,不会被其它控件挡住,看验证代码:
- C/C++ code
COMBOBOXINFO cbi = {sizeof(COMBOBOXINFO), 0}; GetComboBoxInfo(m_hWnd, &cbi); HWND hwndParent = ::GetParent(cbi.hwndList); HWND hwndDesktop = ::GetDesktopWindow();
跟踪发现hwndParen和hwndDesktop的值是一样的。所以:
- C/C++ code
CMyTreeCtrl m_tree; void CMyCombo::PreSubclassWindow() { m_tree.Create(TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_CHECKBOXES | TVS_INFOTIP | TVS_FULLROWSELECT|TVS_SHOWSELALWAYS | TVS_NONEVENHEIGHT | WS_CHILD | WS_BORDER | WS_TABSTOP, CRect(0,0,0,0), GetDesktopWindow(), 333); m_tree.ModifyStyleEx(0, WS_EX_TOOLWINDOW); TVINSERTSTRUCT tvis = {0, 0, TVIF_TEXT}; int n = 5; for (int i = 0; i < n; i ++) { tvis.item.pszText = "sss"; HTREEITEM hItem = m_tree.InsertItem(&tvis); m_tree.SetItemData(hItem, i); } CComboBox::PreSubclassWindow(); } void CMyCombo::OnDropdown() { CRect rc; GetWindowRect(&rc); rc.top = rc.bottom; rc.bottom = rc.top + 50; m_tree.SetWindowPos(&wndTop, rc.left, rc.top, rc.Width(), rc.Height(), SWP_SHOWWINDOW); m_tree.SetFocus();//感觉没起作用 m_tree.SetCapture();//感觉没起作用 }
基本上成功了,但m_tree无法获得焦点,点击后,选择项是失去焦点的颜色,滚动条当然也不支持鼠轮滚轮滚动了。
难道桌面的子控件无法获得焦点吗?不过我想,combo box弹出的list box其实也是没有获得焦点的,因为combobox内的edit没有失去焦点,但微软还是做到了让选中项高亮和支持鼠标滚轮,但我如何做都达不到目的。
- C/C++ code
void CMyTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point) { SetFocus(); //感觉没起作用 SetCapture();//感觉没起作用 UINT uFlag; //接收有关点击测试的信息的整数 HTREEITEM hTree = HitTest(point,&uFlag); //返回与CtreeCtrl关联的光标的当前位置和句柄 if (hTree && (TVHT_ONITEMSTATEICON & uFlag)) //点中复选框 { Select(hTree, TVGN_TVGN_CARET); //int id = GetItemData(hTree); } //CTreeCtrl::OnLButtonUp(nFlags, point); }
------解决方案--------------------
恩 好样的
------解决方案--------------------
mark,很有意义,看能否解决
------解决方案--------------------
犀利啊
------解决方案--------------------
分享??
------解决方案--------------------
原来这个贴是最新的,我说怎么眼熟。
------解决方案--------------------
------解决方案--------------------
LZ自己搞定与大家分享,顶一个,祝LZ新年快乐!
------解决方案--------------------
很不错,自己实现控件。
------解决方案--------------------
楼主过年了也不休息啊,呵呵。。。
------解决方案--------------------
小小的建议:做成ActiveX,让大家直接用吧。