模拟combo box快成功了。解决方案

模拟combo box快成功了。
想模拟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,很有意义,看能否解决
------解决方案--------------------
犀利啊
------解决方案--------------------
分享??
------解决方案--------------------
原来这个贴是最新的,我说怎么眼熟。
------解决方案--------------------
探讨

因为窗口不能得到焦点,所以不能用:
OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
看来又要想招来偷梁换柱了

------解决方案--------------------
LZ自己搞定与大家分享,顶一个,祝LZ新年快乐!
------解决方案--------------------
很不错,自己实现控件。
------解决方案--------------------
楼主过年了也不休息啊,呵呵。。。
------解决方案--------------------
小小的建议:做成ActiveX,让大家直接用吧。