SetCapture怎么用啊?得不到我想要的效果

red-fly 2006-02-24 02:26:50
问题,可以收到窗口外的消息,但本窗口的控件无法操作。

过程:
对话框工程A,在其头文件中声明对话框B的变量b_dlg,在CA::OnInitDialog中调用 b_dlg.Create(xxx),在需要的时候,会让B显示:
b_dlg.ShowWindow( SW_SHOW );
然后再在B.h中声明对话框C的变量c_dlg,然后在CB:OnInitDialog中调用 c_dlg.Create(xxx)。

到此框架结束。下面是SetCapture的用法:
在B中有一个按钮BBtn,在其Click事件中显示C:
c_dlg.ShowWindow( SW_SHOW );
c_dlg.SetCapture();
在C中,效果达到了一半,即当点击C之外的地方时,我在C的WM_LBUTTONUP消息中释放并隐藏C窗口,这是正确的:
void CC::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
POINT pt;
CRect rect;
GetWindowRect( &rect );
GetCursorPos( &pt );
if ( rect.PtInRect( pt ) == FALSE )
{
ReleaseCapture();
ShowWindow( SW_HIDE );
}
CDialog::OnLButtonUp(nFlags, point);
}

但是,C中的其它任何控件都无法操作,比如上边有几个文本框我却无法输入,有ok和cancel按钮但我无法点击。在Ok和cancel的click事件中下断点,但根本就执行不到里边,怎么办?我直接按回车就能跑到Ok的click中
...全文
526 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ringphone 2006-03-02
  • 打赏
  • 举报
回复
任何窗口SetCapture以后,所有鼠标操作消息都是发给该窗口的,窗口上控件不会收到消息,所以有你那个现象。
要实现你说的功能,应该处理WM_ACTIVATE消息,发现不活动就隐藏。
red-fly 2006-03-02
  • 打赏
  • 举报
回复
ringphone(临风) 说得不错,但是我又有一个问题(:)问题真多啊)

如果按这种方法的话,是可以了,但是如果我在确认对话框上的值是否正确时,就有问题了,如果中间有错误,我就弹出MessageBox来提示用户错误信息,这个时候,C对话框就隐藏了,有没有什么办法了吗?
我自己倒有个办法,就是有点麻烦罢了。我在弹出MessageBox之前,设置一类内的全局变量为标志,在隐藏窗口时就检查这个标记。
danielzhu 2006-02-28
  • 打赏
  • 举报
回复
UP
red-fly 2006-02-27
  • 打赏
  • 举报
回复
我只在C失去焦点中隐藏C就行了,但是根本就进入不了C失去焦点的处理函数中
qybao 2006-02-27
  • 打赏
  • 举报
回复
两个目的:1.我就是想只有在用户输入完之后点击确定确定或者取消来决定用户的输入是否有效,即是否提交,2. 另外就是如果用户想终止输入,则点击窗口之外的任何地方都可以达到目的.
-------------------------------------------------
我觉得你应该在C对话框获得焦点时SetCapture,失去焦点时ReleaseCapture
red-fly 2006-02-27
  • 打赏
  • 举报
回复
C中的控件不能用,是因为我在在C中添加了一个SetCapture函数,我去掉就行了

但是,我想要的还是不行啊:
操作过程和我第一次的一样。C上的控件可以用键盘来控制,但鼠标全都无效,如果再不行,我要用另一种方式来实现了,但相当麻烦啊
red-fly 2006-02-25
  • 打赏
  • 举报
回复
我现在是不管怎么样,C中的控件就是不能用

我把有关SetCapture的语句都去掉了,哎...


说明:
B为A的子窗口,C则是独立的窗口
然后我就变啊变得,还是不行:把C设为B的子窗口不行,把C的父窗口设为桌面不行
xing_xing_xing 2006-02-24
  • 打赏
  • 举报
回复
应该处理C的WM_KILLFOCUS消息,当窗口失去焦点的时候,退出
点击OK/Cancel验证输入
vcmute 2006-02-24
  • 打赏
  • 举报
回复
鼠标UP的时候会自动ReleaseCapture
所以一般在DOWN时SetCapture,在UP时处理
red-fly 2006-02-24
  • 打赏
  • 举报
回复
WM_SETCURSOR ?
如何用?
在每次显示C后直接发送这个消息到C对话框吗?

我在C的WM_LBUTTONDOWN中,写一个AfxMessageBox(xxx),这样我第一次按鼠标时,就弹出这个对话框,然后,C上的控件都可以用了,但是当点击C之外的地方时,C就不会再消失了,即void CC::OnLButtonUp(UINT nFlags, CPoint point)里边的相关代码就没有执行
aa3000 2006-02-24
  • 打赏
  • 举报
回复
你应该用 WM_SETCURSOR 实现你的功能,不应该用 SetCapture
qybao 2006-02-24
  • 打赏
  • 举报
回复
不用SetCapture();的时候上边的控件可以操作吗
现在我怀疑你的对话框无法获得焦点
red-fly 2006-02-24
  • 打赏
  • 举报
回复
这里肯定只会执行一次,因为执行一次就会隐藏了
如果想执行第二次,则还需要在B中显示(实际操作就是这样,会多次这样反复操作)
当然,不管执行多少次,每次都是一样的:开始显示的时候就SetCapture,在终止输入或者点确定、取消按钮时就隐藏并ReleaseCapture

现在关键是上边的控件根本无法操作
qybao 2006-02-24
  • 打赏
  • 举报
回复
设断点,看看时不是每次都ReleaseCapture了,如果是,那你的对话框就不能获得焦点了,自然上面的控件也就无法操作了

if ( rect.PtInRect( pt ) == FALSE )
{
ReleaseCapture(); //看看这里是不是每次都执行到了
ShowWindow( SW_HIDE );
}
red-fly 2006-02-24
  • 打赏
  • 举报
回复
切换焦点自动ReleaseCapture,还没有切换焦点,其上的控件根本就无法点击,怎能切换焦点?
就算能切换焦点,但如果切换了焦点就自动ReleaseCapture的话,那我用SetCapture不是没有用处了吗?两个目的:1.我就是想只有在用户输入完之后点击确定确定或者取消来决定用户的输入是否有效,即是否提交,2. 另外就是如果用户想终止输入,则点击窗口之外的任何地方都可以达到目的. 目前只是第2个目的达到了,即可以终止输入,但问题是根本 就无法输入


说明:
B为A的子窗口,C则是独立的窗口
cpio 2006-02-24
  • 打赏
  • 举报
回复
切换焦点了就自动ReleaseCapture了吧

15,979

社区成员

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

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