我定义了一个类ClassA直接继承自CWnd,在上面画了一些东西。ClassA的作用是显示View上一个Block的属性。
现在在View上画了多个ClassA的对象时,它们有重叠,这时碰到一个问题,我鼠标移动到哪个上,哪个就被前端显示,而不是鼠标点击哪个,哪个被前端显示,后者是我想要的效果。 如何实现那种效果? 是否需要在Create时设置什么Style。
另一个是拖动和缩放的问题,如果我希望ClassA能直接被拖动和缩放,是否应该让它继承哪个类?而不是直接继承CWnd。我要的不是对话框。
现在在View上画了多个ClassA的对象时,它们有重叠,这时碰到一个问题,我鼠标移动到哪个上,哪个就被前端显示,而不是鼠标点击哪个,哪个被前端显示,后者是我想要的效果。 如何实现那种效果? 是否需要在Create时设置什么Style。
另一个是拖动和缩放的问题,如果我希望ClassA能直接被拖动和缩放,是否应该让它继承哪个类?而不是直接继承CWnd。我要的不是对话框。
我在ClassA中有捕捉鼠标移动的函数,Object1先被创建,Object2后被创建,不知道为什么鼠标一移动到重叠区域,这个事件就被Object1捕捉到了。
创建窗体的时候加上 WS_CLIPSIBLING参数,然后在鼠标点击时间里调用SetWindowsPos把窗体提到z坐标最前面
加上WS_THICKFRAME,然后处理一下OnSize把缩放的问题也解决了
就剩下拖动的问题了
2、鼠标点击时SetWindowsPos,楼主正解,或者BringWindowToTop
3、WS_THICKFRAME也正解,至于拖动的话可以这样:void CTestWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
// 实现无标题栏窗口拖动
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM (point.x, point.y));
CWnd::OnLButtonDown(nFlags, point);
}以上是在窗口任意位置都可拖动,如果想控制可拖动范围,可通过判断point的大小来实现。
1。让主框架接收所有鼠标事件,无论鼠标当前在哪个子窗口上,都将其事件发往主框架。
主框架必须记录创建的子窗口的句柄,在主框架OnCreate()中添加
this->SetCapture(); //设置捕获鼠标事件2. 将客户坐标转换位屏幕坐标,在查找窗口时需要
this->ClientToScreen();3. 在主框架OnMouseMove() //鼠标移动事件中
得到当前鼠标坐标,::WindowFromPoint(); //API函数
此函数用于将鼠标当前的坐标查找其所在的子窗口4. 比较得到的子窗口句柄是否与自己对应的子窗口句柄相等,相等就前置。
CWnd.SetForegroundWindow(); //CWnd为对应的子窗口坐标。5. 在程序退出时,必须使用
this->Release(); //此函数名不是很确定,用于释放鼠标捕获的。可查询API函数或MFC类