我用MFC做一个控件,然后在这个控件中用CEDIT Create的方法创建一个CEDIT框,创建成功也显示出来,但是EDIT有些功能则没有实现 ,消息也捕捉不到,比如右键弹出菜单功能,CEDIT根本捕捉不到WM_RBUTTONDOWN等消息,但又可以输入。而且我在控件中重载PreTranslateMessage函数,发现控件的一些消息这个函数也捕捉不到,比如控件有WM_MOUSEMOVE消息,可以触发WM_MOUSEMOVE消息,但我在PreTranslateMessage设断点却没有捕捉到。
现在想请教高手:
1.为什么控件的PreTranslateMessage函数没法捕捉到WM_MOUSEMOVE等消息(有些消息又可以,我在迷个函数设了断点)?
2.怎样让CEDIT能够像一个正常的CEDIT一样?
谢谢!!解决后另开贴送100分!
现在想请教高手:
1.为什么控件的PreTranslateMessage函数没法捕捉到WM_MOUSEMOVE等消息(有些消息又可以,我在迷个函数设了断点)?
2.怎样让CEDIT能够像一个正常的CEDIT一样?
谢谢!!解决后另开贴送100分!
你是在容器里创建一个EDIT的吧?
那当然收不到消息,因为消息都被你的容器收去了
EDIT自己没有消息循环难道就不能输入东西了吗?
让你的EDIT子类化就可以了,所有消息就都流进来了。
在我看来,只要比我强的就是我贴中的高手,你会这个问题,我不会,那你就是我所谓的高手,所以没有贬低任何人的意思。
请问你可以详细点吗?因为我在控件的PreTranslateMessage中设断点,也没法捕捉 一定的消息,Edit是放在控件中的。
根据你的理解,我将EDIT子类化了,还是接受不到消息呀!!!!
void CMyEdit::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
this->GetParent()->SendMessage(WM_RBUTTONDOWN, nFlags, point.y*65536+point.x);
CEdit::OnRButtonDown(nFlags, point);
}
请问如何消息反射?
举个例子,需要做一个BUTTON的ActiveX控件,我用你的方法,会发现点BUTTON容器根本收不到WM_LBUTTONDOWN消息,那我做一个OnLick事件就没办法做出来了。容器永远不会收到WM_LBUTTONDOWN,因为客户区全被你的BUTTON占据了。消息反射也就是说当你的容器收到WM_COMMAND的时候去HIWORD(wParam)判断是否是BN_CLICKED,如果是,那就调用你的内部Click函数,去向外引发一个Click事件。
明白了吗?我学VC也就1个多月,别急,我刚学COM几天,大家一起进步。
You must override this function and return TRUE if your OLE control subclasses a Windows control
重载 COleControl::IsSubClassControl 函数 返回True
//
也不管用呀!
{
cs.lpszClass = _T("EDIT");
return COleControl::PreCreateWindow(cs);
}
BOOL CSampleCtrl::IsSubclassedControl( )
{
return TRUE;
}
谢谢你的热心,我想你没搞清楚,我是做一个控件,但这个控件大部份是我画的,只是在其中某处要用一个EDIT,不是把整个控件都变成EDIT的子类。不知这样你是否能解决?
注意在OnDraw里MoveWindow的时候用GetSafeHwnd判断一下。
我现在就是派生了一个CEDIT,也知道要响应我需要的消息,可惜的是我要的消息不会到派生的CEDIT类中,也就是说派生的CEDIT捕捉不到一些消息(比如WM_RBUTTONDOWN),请问如何解决?
一般地,只有OnClick收不到吧?
郁闷ing .......