自己写的类MyStatic继承CStatic, 在MyStatic的WM_PAINT消息中显示了一幅图片。现在:
需要在单击MyStatic时,希望MyStatic能显示一个被选中的边框,使得拖动这个边框调节MyStatic的大小。
调整MyStatic的大小时,使得图片跟着MyStatic大小的变化而缩放(图片始终填满整个MyStatic)。该如何做, MyStatic是new+Create出来的。
我只知道创建时,样式要加上SS_NOTIFY. 有没有那个样式,可以使MyStatic可以停留焦点(显示那个虚线框)。
需要在单击MyStatic时,希望MyStatic能显示一个被选中的边框,使得拖动这个边框调节MyStatic的大小。
调整MyStatic的大小时,使得图片跟着MyStatic大小的变化而缩放(图片始终填满整个MyStatic)。该如何做, MyStatic是new+Create出来的。
我只知道创建时,样式要加上SS_NOTIFY. 有没有那个样式,可以使MyStatic可以停留焦点(显示那个虚线框)。
CRectTracker m_rcPicture;//changed size
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不是这么用的。
{
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是用来记录边框矩形大小改变时用的。。 哎。大错特错啊。。