这是一个CSDN出问题之后消失的帖子,好在我备份了^_^帖子大家不用回答了,因为我已经在那个时候得到满意的答案并且结贴了.希望A_QIAO(),kongyunzhongque(云雀),_foo(void)进来领分,相信我以前给你们的分,被这次的冲击都搞没了...
我以前给你们少了(每个人少于10分的*-*),今天给你们每人10分.
我以前给你们少了(每个人少于10分的*-*),今天给你们每人10分.
解决方案 »
- VC中嵌入式SQL操作oracle数据库
- 子句消解
- TAB问题
- 如何利用(vc6.0)ADO来改变oracle数据库密码
- 那些所谓的高手MPV们过来解释一下
- CrazyAzreal过来接分
- static bool ThreePTDirect(const AgmWorld2& pos1,....) 中的static 有什么具体含义?
- 三年了,第一次跳槽找工作,明天去面试。大家给点意见,支持一下。分不多,只有60分了。
- 高分寻求点子,一经采纳搞分相赠!!!!!
- 请问怎样从myskin.zip的皮肤压缩包里获取图片资源用于各个BUTTON按钮上
- DirectDraw的问题,请高手看看:
- 菜鸟请问:“句柄是什么?”
CSDN - 专家门诊 - VC/MFC 界面问题
回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 保存 | 关闭窗口
主 题: 如何在MDI客户区窗口响应鼠标双击消息?
作 者: huyoo (空格键)
等 级:
信 誉 值: 100
所属论坛: VC/MFC 界面
问题点数: 20
回复次数: 15
发表时间: 2004-5-15 4:48:26 大家知道,在PhotoShop中的客户区双击鼠标的话,将会弹出打开文件对话框;按住CTRL并双击鼠标的话,会执行新建命令.
我的目的就是,在MDI窗口的客户区中响应鼠标双击消息.
看了《深入MDI客户窗口编程》(在CSDN中有)之后, 我重载了PreTranslateMessage(MSG* pMsg)函数.使它能够在消息发送到TranslateMessage()和DispatchMessage() 函数以前预先解释消息.
可以重载该函数截获MDI客户窗口WM_LBUTTTONDBLCLK消息,我是这样做的:
1.在BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CMDIFrameWnd::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}
中添加cs.style|=CS_DBLCLKS;以防MDI窗口不响应双击消息.
2.重载PreTranslateMessage(MSG* pMsg)函数
添加代码如下:
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
//if(pMsg->hwnd==m_hWndMDIClient && pMsg->message==WM_LBUTTONDOWN)
//PostMessage(WM_LBUTTONDOWN);
//我在这里注释掉拦截鼠标单击的消息,是因为客户区响应了鼠标单击的消息
//而没有响应鼠标双击的消息 if(pMsg->hwnd==m_hWndMDIClient && pMsg->message==WM_LBUTTONDBLCLK)
PostMessage(WM_LBUTTONDBLCLK);
return CMDIFrameWnd::PreTranslateMessage(pMsg);
}
3.在CMainFrame中添加WM_LBUTTONDOWN和WM_LBUTTONDBLCLK消息的响应:
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxMessageBox("客户区单击鼠标了!");
CMDIFrameWnd::OnLButtonDblClk(nFlags, point);
}
void CMainFrame::OnLButtonDblClk(UINT nFlags, CPoint point)
{
AfxMessageBox("客户区双击鼠标了!");
CMDIFrameWnd::OnLButtonDblClk(nFlags, point);
}
4.编译,通过了!
>>>>>>>执行,关掉新建的文档,测试结果:
#单击鼠标左键:没反应
#双击鼠标左键:没反应
5.将CMainFrame::PreTranslateMessage(MSG* pMsg)中取消对WM_LBUTTONDOWN的注释,编译通过并执行,关掉新建的文档,测试结果:
#单击鼠标左键:弹出对话框
#双击鼠标左键:没反应我不知道该怎么办了,请大家帮助我!!!!!SOS!!!
谢谢大家里!!!
huyoo@2004/5/15
---------------------------------------------------
回复人: enoloo(行者无疆) ( ) 信誉:102 2004-5-15 8:15:59 得分:0
if(pMsg->hwnd==GetActiveFrame() ->GetActiveView()->m_hWnd && pMsg->message==WM_LBUTTONDBLCLK)
正常childframe是不接收dbclick的,他的视图接收。你可以处理视图的dbclick,然后发消息给app,通知建立新文档。//我搜了,找不到,楼主可否给个连接,谢谢~
---------------------------------------------------
回复人: huyoo(空格键) ( ) 信誉:100 2004-5-15 10:23:04 得分:0
测试中...childframe的视图View是接收DBClick,但是我要的不是这个,因为一个childframe就是一个新文档,而不是MDI窗口的客户区.哇,像 enoloo(行者无疆) 所说,在第二步中那样改,结果在进行第四步:4.编译,
>>>>>>>执行,关掉新建的文档,测试结果:一点ChildFrame的关闭按钮,就出现MDIClientMSG.exe发生错误需要关闭,问我要不要发送报告.$%^$^&*(省去若干抱怨字数...)我要的效果就是无论在MainFrame中有没有ChildFrame(子文档窗口),只要露出一部分MDIClient客户区,双击那灰色的MDIClient客户区,就弹出打开文件对话框.^_~//我搜遍了CodeProject和CodeGURU,没有发现有这方面的文章和例子.(!_!)
//中国的网站就更不用说了.@_@你说它(MDIClient客户区)为什么就能够响应鼠标单击(无论左右键)呢,就是不肯响应左键单击(也是无论左右键)呢?期待那位大侠解决ing...huyoo@2004/5/15/10:10:18---------------------------------------------------