自己写的类MyStatic继承CStatic, 在MyStatic的WM_PAINT消息中显示了一幅图片。现在:
    需要在单击MyStatic时,希望MyStatic能显示一个被选中的边框,使得拖动这个边框调节MyStatic的大小。
    调整MyStatic的大小时,使得图片跟着MyStatic大小的变化而缩放(图片始终填满整个MyStatic)。该如何做, MyStatic是new+Create出来的。 
我只知道创建时,样式要加上SS_NOTIFY.  有没有那个样式,可以使MyStatic可以停留焦点(显示那个虚线框)。

解决方案 »

  1.   

    当然可以调整大小啦,setwindowpos嘛,一般就是你的MyStatic响应单击后,画一个边框,然后拖动时画一个框框,其实可以在static的父窗口中画,没必要实时改变大小嘛,然后松开的时候,再改变MyStatic的大小,并重画图片。
      

  2.   

    使用:
    CRectTracker m_rcPicture;//changed size
      

  3.   

    CRectTracker类,Codeproject上搜索,有个例子的
      

  4.   

    谢谢3楼和5楼提示,第一次知道还有CRectTracker这个东西。捣鼓了下,还是有些问题。1,我创建了一个对话框工程。
    2,对话框上面什么都没有,就一个CStatic控件,上面显示一行文字。
    3,自己写了一个类CTracer,继承了CStatic,将对话框上面的CStatic控件绑定一个CTracer控制变量
    4,在CTracer类中添加public变量m_CRectTracker
    5, 在CTracer构造函数中初始化m_CRectTracker m_RectTracker.m_nStyle = CRectTracker::resizeInside|CRectTracker::dottedLine; 
    m_RectTracker.m_rect = CRect(0, 0, 0, 0); 
    m_RectTracker.m_nHandleSize = 8; 
    m_RectTracker.m_sizeMin = CSize(30, 30);6,对CTracer的WM_LBUTTONDOWN消息进行处理void CTracer::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    CRect rect;
    GetWindowRect(&rect);
      ScreenToClient(&rect);
      m_RectTracker.m_rect = rect;
     
    //定义一个鼠标的点击值, 看鼠标点到了哪里.
    int nIn = m_RectTracker.HitTest(point); 
    if (nIn < 0) //不在四边形区域内.
    {}
    else if (nIn == 8) //在四边形区域内.
    {
    //显示矩形边框和控制手柄.
    m_RectTracker.Draw(GetDC());
    m_RectTracker.Track(this, point, TRUE);
    m_RectTracker.m_rect.NormalizeRect(); 
    if (m_RectTracker.m_rect == rect)
    return;
                    rect = m_RectTracker.m_rect; ClientToScreen(&rect);
    AfxGetMainWnd()->ScreenToClient(&rect);
    this->MoveWindow(&rect, TRUE);
    AfxGetMainWnd()->Invalidate();
    }
    else //在8个改变大小的控点上.
    {
        CPoint pt;
        switch (nIn)
        {
    case 0://左上控点
    pt = CPoint(rect.right, rect.bottom);
    break;
    case 1://右上控点
    pt = CPoint(rect.left, rect.bottom);
    break;
    case 2://右下控点
    pt = CPoint(rect.left, rect.top);
    break;
    case 3://左下控点
    pt = CPoint(rect.right, rect.top);
    break;
    case 4://上控点
    case 5://右控点
    case 6://下控点
    case 7://左控点
    pt = point;
    break;
    default: 
    break;
        }
        m_RectTracker.TrackRubberBand(this, pt, TRUE);
        m_RectTracker.m_rect.NormalizeRect();
                rect = m_RectTracker.m_rect;            ClientToScreen(&rect);
        AfxGetMainWnd()->ScreenToClient(&rect);
        this->MoveWindow(&rect, TRUE);
        AfxGetMainWnd()->Invalidate();
    } CStatic::OnLButtonDown(nFlags, point);
    }
    现在不知道case里面的4,5,6,7该怎么写。
    或者是不是根本CRectTracker不是这么用的。
      

  5.   

    重新试了下。解决问题了。        switch (nIn)
            {
            case 0://左上控点
                pt = CPoint(rect.right, rect.bottom);
                break;
            case 1://右上控点
                pt = CPoint(rect.left, rect.bottom);
                break;
            case 2://右下控点
                pt = CPoint(rect.left, rect.top);
                break;
            case 3://左下控点
                pt = CPoint(rect.right, rect.top);
                break;
            case 4://上控点
            case 5://右控点
            case 6://下控点
            case 7://左控点
                pt = point;
                break;
            default: 
                break;
            }
            m_RectTracker.TrackRubberBand(this, pt, TRUE);
      
    将这段代码换成m_RectTracker.Track(this, point, TRUE); 就可以了。。
    可怜,我还以为m_RectTracker.Track是用来记录边框矩形移动用的,而m_RectTracker.TrackRubberBand是用来记录边框矩形大小改变时用的。。 哎。大错特错啊。。