要做一个可以覆盖在CView上的窗口? 怎么做,各路高手请进...

chief 2002-02-01 02:32:12
要求:
1,覆盖的显示在CView上(最好还是CMainFrame的子窗口),即它的显示/隐藏不会引起CView的位置/大小变化。
2,当鼠标在该窗口上移动时,位于其下的CView/CMainFrame不会收到鼠标消息。
...全文
201 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
chief 2002-02-04
  • 打赏
  • 举报
回复
2 tief:
谢谢你,问题已基本搞定,给分
zhuang094 2002-02-02
  • 打赏
  • 举报
回复
关注
chief 2002-02-02
  • 打赏
  • 举报
回复
不好意思,开的帖子上意思说得不清楚。
我要的是MDI界面中可以显示在主窗口客户区的窗口bar.
就好像普通的工具条一样,但显示时不会使CView的位置下调

2 tief(但求中庸) 
我试了一下,在MainFrame, ChildFrame中都收不到MouseMove消息,这样的话若是CView不是最大化的情况下,怎么使窗口bar显示出来呢,我想要当鼠标移到主窗口左边一定范围内时窗口bar就出来
tief 2002-02-02
  • 打赏
  • 举报
回复
你可以用如下方法保证CMainFrame收到鼠标移动的消息:

我们可以自己发送过去嘛:)

void CSdi3View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

HWND hMainFrame = AfxGetMainWnd()->m_hWnd ;
WPARAM wParam = MAKEWPARAM(0,0) ;
WPARAM lParam = MAKEWPARAM(point.x,point.y) ;

::SendMessage(hMainFrame,WM_MOUSEMOVE,wParam,lParam) ;

CView::OnMouseMove(nFlags, point);
}
chief 2002-02-02
  • 打赏
  • 举报
回复
大家继续呀
chief 2002-02-02
  • 打赏
  • 举报
回复
2 kjijian:
O,你没看上面的吗?
zgc_7622 2002-02-02
  • 打赏
  • 举报
回复
还没OK!?
zx_sanjin 2002-02-02
  • 打赏
  • 举报
回复
To chief:
我也对分析家感兴趣, 请看看:
http://www.csdn.net/expert/topic/514/514645.shtm
请指点一二`~~
chief 2002-02-02
  • 打赏
  • 举报
回复
2 tief:
谢谢,我来试,ok了的话马上给分
tief 2002-02-02
  • 打赏
  • 举报
回复
既然收到了消息,就可以使用最上面我说的方法显示/隐藏“工具栏”了。
tief 2002-02-02
  • 打赏
  • 举报
回复
可以这样处理:

建立MouseHook.h文件,内容如下:

#include "stdafx.h"
#include <windows.h>

int SetMouseHook() ;

int ReleaseMouseHook() ;

LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam, LPARAM lParam) ;

建立MouseHook.cpp文件,内容如下:

#include "stdafx.h"
#include "MouseHook.h"

static HHOOK hHook ;

int SetMouseHook()
{
hHook = SetWindowsHookEx(WH_MOUSE,MouseProc,0,GetCurrentThreadId()) ;
return (int)hHook ;
}

int ReleaseMouseHook()
{
return UnhookWindowsHookEx(hHook) ;
}

LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam, LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMhStru = LPMOUSEHOOKSTRUCT(lParam) ;
HWND hWndMainFrame = AfxGetMainWnd()->m_hWnd ;

int x,y ;

if ( nCode==HC_ACTION )
{
x = pMhStru->pt.x ;
y = pMhStru->pt.y ;
::SendMessage(hWndMainFrame,WM_MOUSEMOVE,
MAKEWPARAM(0,0),MAKELPARAM(x,y)) ;
}

return CallNextHookEx(hHook,nCode,wParam,lParam) ;
}

在MainFrm.cpp中#include "MouseHook.h",然后处理WM_CREATE,DestoryWindow,WM_MOUSEMOVE事件,看看消息有没有收到:)

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


void CMainFrame::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

static int i = 0 ;

TRACE("Mouse x=%d y=%d\n",point.x,point.y) ;

CMDIFrameWnd::OnMouseMove(nFlags, point);
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
int iRet = SetMouseHook() ;

if ( iRet==0 )
{
MessageBox("Can not hook mouse!") ;
ExitProcess(0) ;
}

return 0;
}

BOOL CMainFrame::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class

ReleaseMouseHook() ;

return CMDIFrameWnd::DestroyWindow();
}


kissfire 2002-02-02
  • 打赏
  • 举报
回复
sign
chief 2002-02-02
  • 打赏
  • 举报
回复
2 joshua0137(joshua) 
我试过,普通的CWnd派生窗口是不行的,消息都会被CView截走,派生窗口收不到任何消息
捕鲸叉 2002-02-02
  • 打赏
  • 举报
回复
在CView的OnIntialUpdate()里写:
myWnd.Create(...)//假设你要覆盖在CView上的窗口是myWnd

在CView的OnSize()里面写:
if(this->m_hWnd) //可能是if(IsWindow())
{
CRect rect;
GetClientRect(rect);
MoveWindow(myWnd,rect) //里面参数排列可能不是这样,你查一下。
}
kjijian 2002-02-01
  • 打赏
  • 举报
回复
同意楼上的
kjijian 2002-02-01
  • 打赏
  • 举报
回复
新建一个对话框,把上面的按钮删掉先,将其Styles设置为:

Style: Child
Border: Dialog Frame

根据这个对话框模板生成新类:CDlgTool

然后在CXXXView中添加成员变量:m_pDlgTool,如下:

h中:

class CSdi3View : public CView
{
private:
CDlgTool * m_pDlgTool ;
..................

在cpp中修改构造和析构函数:

CSdi3View::CSdi3View()
{
// TODO: add construction code here
m_pDlgTool = new CDlgTool ;
}

CSdi3View::~CSdi3View()
{
delete m_pDlgTool ;
}

利用Class Wizard捕捉WM_CREATE和WM_MOUSEMOVE消息,分别做如下处理:

void CSdi3View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default

CRect rect ;

GetClientRect(&rect) ;

if ( point.x<64 )
{
::SetWindowPos(m_pDlgTool->m_hWnd,wndTop.m_hWnd,0,0,
64,rect.Height(),SWP_SHOWWINDOW) ;
}
else
{
::SetWindowPos(m_pDlgTool->m_hWnd,wndTop.m_hWnd,0,0,
0,rect.Height(),SWP_SHOWWINDOW) ;
}

CView::OnMouseMove(nFlags, point);
}

int CSdi3View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here

m_pDlgTool->Create(CDlgTool::IDD,this) ;

return 0;
}
chief 2002-02-01
  • 打赏
  • 举报
回复
2 dct1999(宇宙天空) 
你是对的。
原因是在MDI界面中是不可以放在CView中的
chief 2002-02-01
  • 打赏
  • 举报
回复
2 tief:
按你的方法在CView中是可以,但我需要放在CMainFrame中来做。
因以后会系统可能会是MDI的,如此就不可以放在CView中
这样的话,CMainFrame并不能保证受到mouse move消息,该怎么做呢
dct1999 2002-02-01
  • 打赏
  • 举报
回复
为什么你不想让cview收到消息呢?有什么特别的理由吗?上面的那位老兄没有把这点解决掉啊,只不过是完成了隐藏和出现dialogbar而已。
chief 2002-02-01
  • 打赏
  • 举报
回复
2 tief(但求中庸) 
我试试,能行的话马上给分
加载更多回复(5)

16,551

社区成员

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

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

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