help : 当鼠标在对话框外面单击时,对话框自动关闭。

sungengyu 2004-09-21 05:22:43
实现如题的对话框:当鼠标在对话框外面单击时,对话框自动关闭。

因为对话框上面有控件,所以情况比较复杂:

如果用SetCapture,会影响到对话框上面的控件。

如果用钩子判断鼠标单击位置是否在对话框内,也有一个问题:
如果对话框上面有 ComboBox ,当ComboBox 拉出列表时(拉出的列表有可能在对话框外),如何判断?

关键是不能影响到对话框上面所有控件的正常工作。

困扰我很久了,原谅我现在还不能发200分的帖子……
谢谢!
...全文
354 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
sungengyu 2004-12-17
  • 打赏
  • 举报
回复
本来是每个回复10分的,不小心漏了一个,原谅我。
xfzzmzj 2004-12-13
  • 打赏
  • 举报
回复
可以这样,(我已经试过)
void CAaatttDlg::OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized )
{
if(nState == WA_INACTIVE)
this->PostMessage(WM_QUIT,NULL,NULL);
}
Flood1984 2004-12-13
  • 打赏
  • 举报
回复
偷偷的问:
什么是钩子?
hyamw 2004-12-13
  • 打赏
  • 举报
回复
void CTestDlg::OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized )
{
CDialog::OnActivate(nState, pWndOther, bMinimized);
HWND hWnd = ::GetForegroundWindow();
if (hWnd != this->m_hWnd && hWnd != m_Dlg.m_hWnd)
PostMessage(WM_CLOSE);
}

//m_Dlg是一个子对话框。
看看这个能不能满足要求?
sungengyu 2004-12-13
  • 打赏
  • 举报
回复
如果对话框上面再弹出对话框就不行了。……

不过似乎一般情况下也不会这么用。

不知道还有别的什么问题没 :(



sungengyu 2004-12-13
  • 打赏
  • 举报
回复
可能是我表述的不清楚。
我希望的是对话框(上面的所有控件)失去焦点的时候,对话框自动关闭。

WM_NCACTIVEATE 应该可以吧……
试试看,如果可以的话我就结贴。

谢谢大家的帮助。

解决问题最好的办法还是搜索以前的帖子。
sungengyu 2004-12-13
  • 打赏
  • 举报
回复
http://search.csdn.net/Expert/topic/2552/2552177.xml?temp=.1162226

WM_NCACTIVATE响应
wParam参数为FALSE时关闭


这种方法可以。
简单易用。
fbmsf 2004-12-13
  • 打赏
  • 举报
回复
WM_ACTIVATE
这个就可以了, 我作国。


.elseif uMsg==WM_ACTIVATE

mov eax,wParam
.if eax==WA_INACTIVE
invoke SendMessage,hDlgFace,WM_CLOSE,0,0
.endif
我防写的qq 表情的dialog
oyljerry 2004-12-13
  • 打赏
  • 举报
回复
捕获 WA_INACTIVE消息,失去焦点,PostMessagePostMessage(WM_CLOSE,NULL,NULL);关闭
dawnwinds 2004-10-14
  • 打赏
  • 举报
回复
在对话框不是当前窗体时,取得鼠标point,然后判断是不是在对话框内,不在就关闭,不过这样的话,用键盘也可以关闭对话框,而不是单击了。
lu1172101275 2004-10-14
  • 打赏
  • 举报
回复
只能up too
huaboy408 2004-10-14
  • 打赏
  • 举报
回复
是否可以获得对话框的位置坐标,然后判断鼠标点击的POINT是否在对话框所在坐标,然后执行CLOSE,不过还要牵扯到对话框是否在最前面
sungengyu 2004-10-14
  • 打赏
  • 举报
回复
给帖子加了100分,up一下。
zhucde 2004-09-21
  • 打赏
  • 举报
回复
不得不宣扬DirectX,
对于输入设备的捕捉方面,真是太方便了.
zhucde 2004-09-21
  • 打赏
  • 举报
回复
我帮你做了一个,用DirectX的方法:

(前几天我用这个方法回答过,但无人问津,我想主要还是怕动手的原因,今天我就帮大家做好了)

http://www.njchangsheng.com/mousetest.rar


前提:编译工程时必须安装了DirectX 8.0 SDK,
网上有得下载
kugou123 2004-09-21
  • 打赏
  • 举报
回复
之前先用FindWindow得到目标对话框窗口句柄。
kugou123 2004-09-21
  • 打赏
  • 举报
回复
用全局鼠标钩子,拦截左键单击消息,如果拦截到,则SendMessage(hWnd,WM_CLOSE,NULL,NULL);
lixiaosan 2004-09-21
  • 打赏
  • 举报
回复
用钩子来截获鼠标消息。。。。。
xxhfortrue 2004-09-21
  • 打赏
  • 举报
回复
可以响应LostFcous
xxhfortrue 2004-09-21
  • 打赏
  • 举报
回复
晕,,,居然没读懂,看来我的语文水平还停在初中阶段!
加载更多回复(3)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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