我现在在做一个自定义控件 CMyButton::CButton 。要实现的需求大概是这样的:
1、单击会弹出一个窗口
2、鼠标放在上边时会有浮动提示窗口显示按钮属性
3、按“delete”键可把按钮删除每个单独的响应我都做好了,都没有问题,但是同时放在一个程序里时就有响应冲突。
1、2同时存在时可以正常响应。
1、3同时存在,或2、3同时存在时,3就不会响应。我的响应代码如下:
void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
dlg1 dlg;
dlg.DoModal();
}
BOOL CMyButton::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam == VK_DELETE)
{
DestroyWindow();
delete this;
return TRUE;
}
} tip.RelayEvent(pMsg); //CMyButton类成员 CToolTipCtrl CMyButton::tip
return CButton::PreTranslateMessage(pMsg);
}
需要怎么改才能让这些事件可以同时响应呢?
1、单击会弹出一个窗口
2、鼠标放在上边时会有浮动提示窗口显示按钮属性
3、按“delete”键可把按钮删除每个单独的响应我都做好了,都没有问题,但是同时放在一个程序里时就有响应冲突。
1、2同时存在时可以正常响应。
1、3同时存在,或2、3同时存在时,3就不会响应。我的响应代码如下:
void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
dlg1 dlg;
dlg.DoModal();
}
BOOL CMyButton::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam == VK_DELETE)
{
DestroyWindow();
delete this;
return TRUE;
}
} tip.RelayEvent(pMsg); //CMyButton类成员 CToolTipCtrl CMyButton::tip
return CButton::PreTranslateMessage(pMsg);
}
需要怎么改才能让这些事件可以同时响应呢?
解决方案 »
- 弱问模态对话框弹出后对主线程的影响具体有哪些方面?
- unsigned char数组内容如何以16进制形式显示在editbox控件中
- 问jason_wentzel :接着上次的问题,怎么知道当前所在的窗口是哪个窗口呢?
- 模拟内存分配
- 客户端的本机通信的小代码总是一闪而过,我加了system("pause");还是不行,代码没报错,我贴出来了
- 特郁闷的一个问题,在线等!
- 留着没用 , 散分
- 在CListView中怎样在某行(例如第3行)的某一列中加入图标或位图?
- 如何用MFC写一个屏幕保护?
- 在VC++中,有没有相当于VB6中TYPENAME的指令?
- 0菜鸟请教,如何让我的VC程序支持脚本!!
- activex中不能创建activex吗?
是个很笨的办法,写出来也很丑,一大堆switch-case,不过确实有效。暂时不结贴,如果谁有更好的办法请告诉我。
ONCHAR事件确实好像没有相应。
但是ONKEWDOWN事件单独存在的时候是可以响应的,不过一加入其它的事件,它就不会响应了,一定要用PreTranslateMessage。
我再去找找其它资料吧。
其余的事件直接 return CButton::PreTranslateMessage(pMsg);
应该就行了,别的事件该写哪儿写哪儿
意思是这样么?
BOOL CMyButton::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN )
{
if(pMsg->wParam == VK_DELETE)
{
DestroyWindow();
delete this;
return TRUE;
}
}
if(pMsg->message == WM_MOUSEMOVE)
{
tip.RelayEvent(pMsg);
}
return CButton::PreTranslateMessage(pMsg);
}我试了一下,还是不能响应键盘事件。
而且,我的OnMouseMove是有自己的处理代码的,我为了简化问题所以就把它省略掉了。
所以,这个方法好像不能用啊。
还是说我的理解有问题?
{
if(pMsg->message == WM_KEYDOWN )
{
if(pMsg->wParam == VK_DELETE)
{
DestroyWindow();
delete this;
return TRUE; // 这里有VK_LBUTTON之类的键
//改为 return CButton::PreTranslateMessage(pMsg); 或者不RETRUN }
}
if(pMsg->message == WM_MOUSEMOVE)
{
tip.RelayEvent(pMsg);
}
return CButton::PreTranslateMessage(pMsg);
}
怪 再看看
第一次单击控件之前,在对话框的其他部分单击鼠标,是正常的(这里没有响应事件,所以就应该是什么也没有)。
单击了控件之后,控件也正常响应了单击事件。
然后,再单击对话框的其它部分,也只会响应控件的单击事件,而不会响应窗口的事件或者窗口上其它控件的事件。我加了判断: if( ID_BN == GetDlgCtrlID()) , ID_BN是我的控件的ID。
但在单击控件后再单击对话框其它部分时,GetDlgCtrlID()返回的仍是ID_BN。这个可能就是出现问题的原因。
这时它不是应该返回对话框的ID么? 谁能帮我解释一下?或者提供一个解决方法?
if ( this->WindowFromPoint(pMsg->pt) == this )就算这个问题最后全部是我自己解决的,但是给我帮助或者提出建议的人的分还是不会少的。
写出了解决过程应该也可以对别人有点帮助吧。