我想重载CEdit默认弹出的菜单,于是新建了一个CListEdit继承CEdit,重载OnContextMenu函数,当右键点击编辑框内容除,弹出我想显示的LIST BOX,但是总是显示不正常,但是可以点选list box中的内容,或者是显示正常,但是不能点选list box中的内容,求解    CRect rect;
    ((CEdit*)GetDlgItem(IDC_EDT_PLACE))->GetWindowRect(&rect);
    ScreenToClient(&rect);
    g_pPlace = new CListEdit;
    g_pPlace->Create(WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_LEFT | WS_BORDER,rect, this, 1);
    __CHEK_NULL(g_pPlace);
    g_pPlace->nID = IDC_LIST_PLACE;
//生成的一个新的list edit控件,覆盖在原有的一个edit(IDC_EDT_PLACE)控件上(方便调整位置,IDC_EDT_PLACE是隐藏的)
//然后重载了OnContextMenu函数,当SetWindowPos参数设为wndTop时,nID控件不能正常显示,但是可以正常点击,如图1//参数设为wndBotton或者this时,nID控件可以正常显示,但是不能正常点击(响应list edit的点击函数),如图2void CListEdit::OnContextMenu(CWnd* pWnd, CPoint pos)
{
    extern CWnd* pMainWnd;
    CListBox* pList = ((CListBox*)(pMainWnd->GetDlgItem(nID)));
    
    pMainWnd->ScreenToClient(&pos);  
    if (pList){
        bool f = pList->SetWindowPos(&wndTop,pos.x ,pos.y  ,0,0,SWP_NOSIZE | SWP_NOCOPYBITS);
        //pList->BringWindowToTop();
        //pList->SetParent(this);
        
        //pList->SetSel(0);
        pList->ShowWindow(true);
    }
}我觉得很奇怪,按理来说top是最高层,但是为什么反而不显示呢?不知道是我哪里搞错了,求解惑
图1:图2:MFC

解决方案 »

  1.   

    你的listbox是WS_CHILD样式,所以不能拥有wndTop属性。
    你的想法是 用listbox来替换edit自带的右键默认菜单?
    我很奇怪,为什么你要用listbox而不用菜单呢?
      

  2.   


    我以为listbox设置成top后,可以点选就说明它正常设置成top了,难道不是么?
    那请问该怎么修改?
    用list box因为我是想做一个下拉框的东西,可能输入很多条数据,而程序中只要取到它所显示的字符串
      

  3.   

    像 百度首页 那样 输入关键词 后下面出现的那个一样吧
    你可以创建一个popup样式的listbox。注意用CreateEx来创建
      

  4.   

    是的,我试试,O(∩_∩)O谢谢~
    不过原理还是不明白,为什么设置成wndBotton反倒能显示了,但是不能点击它,它上面的控件我没设置成透明的..
      

  5.   

    DWORD dwStyle = WS_POPUP|WS_BORDER;
    LPCTSTR lpszClassName = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,LoadCursor(NULL,IDC_ARROW),NULL);g_pListBox = new CListBox;
    g_pListBox->CreateEx(NULL,lpszClassName, "",dwStyle, rect, this, 0);
    int i = g_pListBox->AddString("123");
    i = g_pListBox->AddString("123");
    创建顶级窗口成功了,但是AddString添加不了数据...
      

  6.   

    看看我写的一个小测试程序:
    CButton ctrl;成员变量
    CListBox lbx;        CRect rc;
    ctrl.GetWindowRect(&rc);
    rc.top = rc.bottom;
    rc.bottom = rc.top + 150; lbx.CWnd::CreateEx(0,"listbox",NULL,WS_VISIBLE|WS_POPUP|WS_BORDER,rc,&ctrl,0);
    lbx.AddString("CListBox");
    lbx.AddString("CListBox");
    lbx.AddString("CListBox");
    lbx.AddString("CListBox");
    lbx.AddString("CListBox");测试OK