我定义了一个类ClassA直接继承自CWnd,在上面画了一些东西。ClassA的作用是显示View上一个Block的属性。
现在在View上画了多个ClassA的对象时,它们有重叠,这时碰到一个问题,我鼠标移动到哪个上,哪个就被前端显示,而不是鼠标点击哪个,哪个被前端显示,后者是我想要的效果。 如何实现那种效果? 是否需要在Create时设置什么Style。
另一个是拖动和缩放的问题,如果我希望ClassA能直接被拖动和缩放,是否应该让它继承哪个类?而不是直接继承CWnd。我要的不是对话框。

解决方案 »

  1.   

    自动的。
    我在ClassA中有捕捉鼠标移动的函数,Object1先被创建,Object2后被创建,不知道为什么鼠标一移动到重叠区域,这个事件就被Object1捕捉到了。
      

  2.   

    问题基本解决了
    创建窗体的时候加上 WS_CLIPSIBLING参数,然后在鼠标点击时间里调用SetWindowsPos把窗体提到z坐标最前面
    加上WS_THICKFRAME,然后处理一下OnSize把缩放的问题也解决了  
    就剩下拖动的问题了
      

  3.   

    1、子窗口在覆盖时一般都是鼠标移到哪个上面哪个就显示出来,因为它要整体重画,只有加上WS_CLIPSIBLING属性后才不会重画重叠部分。
    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的大小来实现。
      

  4.   

    每个子窗口只能接收自己窗口上所发生的事件,所以找个让子窗口自动实现前端显示只能有主框架来完成。
    1。让主框架接收所有鼠标事件,无论鼠标当前在哪个子窗口上,都将其事件发往主框架。
       主框架必须记录创建的子窗口的句柄,在主框架OnCreate()中添加
        this->SetCapture(); //设置捕获鼠标事件2. 将客户坐标转换位屏幕坐标,在查找窗口时需要
        this->ClientToScreen();3. 在主框架OnMouseMove() //鼠标移动事件中
        得到当前鼠标坐标,::WindowFromPoint(); //API函数
      此函数用于将鼠标当前的坐标查找其所在的子窗口4. 比较得到的子窗口句柄是否与自己对应的子窗口句柄相等,相等就前置。
       CWnd.SetForegroundWindow(); //CWnd为对应的子窗口坐标。5. 在程序退出时,必须使用
       this->Release(); //此函数名不是很确定,用于释放鼠标捕获的。可查询API函数或MFC类