我想重载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
((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
解决方案 »
- 已知一个IWebBrowser2的指针,如何捕获它的DISPID_DOCUMENTCOMPLETE消息 ?不用MFC
- 如何修改其他进程中的edit内容,已经获得该edit句柄
- 组织一个学生开发团队(要求:上海,C#||VB.net,ASP.NET,SQL2000 )
- 请教关于多张静态图合成一张GIF格式的动态图的方法
- 请问可以让spy++检测不到程序中的主窗口和子窗口吗?
- 郁闷,GetWindowText怎么不行了?
- 请问有什么标准方法 可以分析URL 以得到URL中带的参数的个数及具体值!
- win2000中如何配置数据源
- 我们都知道数据库的优点,但数据库的缺点是什么??
- 菜鸟求救:如何实时监控一个文件是否被修改过,即如何判断一个文件内容有变化........
- 天王盖地虎
- 请教大家一个socket编程方面的问题
你的想法是 用listbox来替换edit自带的右键默认菜单?
我很奇怪,为什么你要用listbox而不用菜单呢?
我以为listbox设置成top后,可以点选就说明它正常设置成top了,难道不是么?
那请问该怎么修改?
用list box因为我是想做一个下拉框的东西,可能输入很多条数据,而程序中只要取到它所显示的字符串
你可以创建一个popup样式的listbox。注意用CreateEx来创建
不过原理还是不明白,为什么设置成wndBotton反倒能显示了,但是不能点击它,它上面的控件我没设置成透明的..
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添加不了数据...
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