一个有点难度的问题,让控件不响应鼠标!

cqjiang 2006-03-27 04:09:13
我在工控软件画面组态里插入一些标准控件,比如Pushbutton,check button,dropdownlist等,在组态环境下我要求这些控件不响应鼠标,也就是控件处于类似于disable状态,但不能把控件设置为disable状态,因为这样button上的字变成灰色,check button和radio button上文字颜色无法显示实际状态。
我的想法是:
1、不用设置控件为disable状态的方法
2、不用容器窗口SetCapture和ReleaseCapture 方法

有没有其他方法?
...全文
276 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
cqjiang 2006-03-29
  • 打赏
  • 举报
回复
up,请高手帮忙!
ricky460 2006-03-29
  • 打赏
  • 举报
回复
按照楼主的意思:

CView 里有个CMyWnd 窗口(就是楼主的Button) ;
当在 CMyWnd区域点击时 ,触发WM_LBUTTONDOWN 消息 , 消息的传递是这样的
1:CMyWnd::PreTranslateMessage(...)
2:CView::PreTranslateMessage(...)
3: CMyWnd::OnLButtonDown(...)

也就是说 ,楼主只需要在第二步,CView的PreTranslateMessage里做相应处理 , 把这个消息传递截断, 不让此点击消息传递到第三步就可以了 。
BOOL CView::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_LBUTTONDOWN)
{

............
return true ; // 直接return true ;消息就会被截断 ,而
// 不会被发送到CMyWnd::OnLButtonDown()

}

return CView::PreTranslateMessage(pMsg);
}
楼主同时还可以通过判断消息的目标窗口pMsg->hwnd来判断此点击消息是否是发送到控件窗口的 , 来做更细致的处理 。

思路已经有了,具体做法楼主自己根据实际情况研究研究即可。
ricky460 2006-03-29
  • 打赏
  • 举报
回复
按照楼主的意思:

CView 里有个CMyWnd 窗口(就是楼主的Button) ;
当在 CMyWnd区域点击时 ,触发WM_LBUTTONDOWN 消息 , 消息的传递是这样的
1:CMyWnd::PreTranslateMessage(...)
2:CView::PreTranslateMessage(...)
3: CMyWnd::OnLButtonDown(...)

也就是说 , 楼主只需要在CView的PreTranslateMessage里做相应处理 , 不让点击消息传递到CMyWnd就可以了 。

if(pMsg->message == WM_LBUTTONDOWN)
{

............
return true ; // 直接return true ;消息就会被截断 ,而 // 不会被发送到CMyWnd: nLButtonDown()

}

return CView::PreTranslateMessage(pMsg);

楼主也可以通过判断消息的目标窗口pMsg->hwnd来判断此点击消息是否是发送到控件窗口的 , 来做更细致的处理 。

思路已经有了,具体做法楼主自己根据实际情况研究研究即可。
cqjiang 2006-03-27
  • 打赏
  • 举报
回复
up,请高手帮忙
cqjiang 2006-03-27
  • 打赏
  • 举报
回复
ricky460(阿酷) 明白了我的意思
您的1,2方法我有点不清楚,pushbutton作为CView的子窗口,系统发送给pushbutton的鼠标事件是否先通过CView,如果是,应该可以捕获并作相应处理,我做一下试验先?

方法3,鼠标在pushbutton上时,鼠标的移动按下已经不能被CView的OnLButtonDown,OnMouseMove函数截获。我在CView里选择使用SetCapture时机不好把握,因为我要按下鼠标左健才根据坐标拾取pushbutton。
ricky460 2006-03-27
  • 打赏
  • 举报
回复
1: 重载PreTranslateMessage() , 并分析发送的目的地窗口 . 做相应处理 .
2: 定义一个变量 bool m_bDisable ; 利用这个变量来控制是否需要响应 .
即 CYourButton::OnLButtonDown(....)
{
if(m_bDisable) return ;
}

CYourButton::OnLButtonUp(....)
{
if(m_bDisable) return ;
}
3: 在控件父窗口下用SetCapture..
不知道楼主SetCapture用的不好是什么意思 ??
标准的SetCapture做法是:
OnLButtonDown(....)
{
SetCapture();
}

OnLButtonUp(.....)
{
if(GetCapture() != this) return ;
ReleaseCapture();
............
}

OnLButtonUp()
cqjiang 2006-03-27
  • 打赏
  • 举报
回复
是这样的,我在CView里放一个pushbutton,在CView里现在鼠标是 + 字状态,现在将鼠标移动到pushbutton上面,如果鼠标形状变了,那就失败了,鼠标消息已经被系统发送给了push button
如果创建pushbutton时选择了disable那么鼠标形状是不会变的(这是我要达到的目的,我可以拾取pushbutton),但我不想用pushbutton的disable状态,也不想用SetCapture
cqjiang 2006-03-27
  • 打赏
  • 举报
回复
不能让系统把鼠标消息发给控件窗口,所有的重载都是不能达到目的的。
lzzqqq 2006-03-27
  • 打赏
  • 举报
回复
重载对话框的PrepareTranslateMessage函数,发现是鼠标消息并且窗口是子控件就直接返回.
cqjiang 2006-03-27
  • 打赏
  • 举报
回复
再说清楚点
VC开发环境里在对话框设计里拖动控件布局的效果,这时控件本身是不会捕获鼠标的。
我知道用容器窗口SetCapture和ReleaseCapture 可以达到效果,但我用这两个函数用的不好,会有副作用,所以请教其他方法。
cqjiang 2006-03-27
  • 打赏
  • 举报
回复
也许我没说清楚
我的意思是不让系统给控件发送鼠标消息,如果控件PreTranslateMessage能收到消息就没有达到我说的效果。
简单的说就是控件出于disable状态,系统不给控件任何消息,也就是控件不能获得任何输入设备事件。
一个傻冒 2006-03-27
  • 打赏
  • 举报
回复
生成新类,在类中重载鼠标事件,里面什么也不做.
zwl327 2006-03-27
  • 打赏
  • 举报
回复
过载PreTranslateMessage,把WM_LBUTTONDOWN丢掉

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧