我想做这个功能,就是界面上有一些矢量图形,用户用鼠标在图形上拖出一个矩形,我就放大矩形选中的图形到整个界面的大小,不知道说明白了没有。
现在后面的数据和算法都已经写好,就是界面上的效果做不出来。
请有做过的给些想法或代码。
现在后面的数据和算法都已经写好,就是界面上的效果做不出来。
请有做过的给些想法或代码。
解决方案 »
- 前辈们,学历重要吗?
- (100分求助)MS Project2007接口导出问题
- 请问这两种有什么不同?
- 关于全局数组的问题!!
- OPENGL中如何获得某一点的深度值?
- 简单的问题
- 病毒形成的folder.htt和desktop.ini,有什么可以杀?
- 一个控件会向主动它的祖父窗口发送通知消息吗?换言之,一个主窗口如何收到它的孙子控件的通知消息?
- http://www.csdn.net/expert/TopicView.asp?id=266362 100分请求答案?利用NotesSQL将Notes数据库作为ODBC数据源,使用VC,VB,asp等语言倒
- vc调用idl
- 有关java工程 和VC工程的交互,高分求助
- 怪事,派生类竟然不能访问基类的保护成员
if(m_bStartBoxSelect)
{
//橡皮矩形类
m_cTrack.TrackRubberBand(this,pt,true);
m_cTrack.m_rect.NormalizeRect();//正规化 //得到矩形的中点
CPoint RectCenter = m_cTrack.m_rect.CenterPoint();
ClientToLogical(RectCenter); //得逻辑坐标
double xCenter,yCenter;
LogicalToWorld(RectCenter,xCenter,yCenter); //得世界坐标 //将框选矩形转化为逻辑矩形
CRect rect;
rect = m_cTrack.m_rect;
ClientToLogical(rect); //得到客户区矩形
CRect clientRect;
GetClientRect(&clientRect); //得到矩形的世界范围
double x1,y1,x2,y2;
LogicalToWorld(rect.BottomRight(),x1,y1);
LogicalToWorld(rect.TopLeft(),x2,y2); //得到缩放比例
double xScale = fabs(x1 - x2) / clientRect.Width();
double yScale = fabs(y1 - y2) / clientRect.Height(); (yScale > xScale) ? m_dScale = yScale : m_dScale = xScale; //得到客户区中心
CPoint clientCenter = clientRect.CenterPoint();
ClientToLogical(clientCenter);
double xClientCenter,yClientCenter;
LogicalToWorld(clientCenter,xClientCenter,yClientCenter); //转成世界坐标 //得到世界坐标差
double xOffset = -(xClientCenter - xCenter);
double yOffset = (yClientCenter - yCenter); //得到逻辑差
LONG xLog = WorldToLogical(xOffset);
LONG yLog = WorldToLogical(yOffset); CPoint PosPt = GetScrollPosition(); //得到原来的滚动条位置 PosPt.Offset(xLog,yLog); int lpMinPos,lpMaxPos;
GetScrollRange(SB_HORZ,&lpMinPos,&lpMaxPos);
int lpMin,lpMax;
GetScrollRange(SB_VERT,&lpMin,&lpMax); if(PosPt.x > lpMaxPos)
{
SetScrollRange(SB_HORZ,lpMinPos,PosPt.x);
} if(PosPt.y > lpMax)
{
SetScrollRange(SB_VERT,lpMin,PosPt.y);
} SetScrollPos(SB_HORZ,PosPt.x);
SetScrollPos(SB_VERT,PosPt.y); m_bStartBoxSelect = false; Invalidate(TRUE);
}
m_cTrack.TrackRubberBand(this,pt,true);
m_cTrack.m_rect.NormalizeRect();//正规化这个就是框选的代码啊!!矩形框是透明的啊!
这样就好办了,image上画图形,paintbox上画选择框,画的时候把前一次的删除,具体代码如下:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
i:Integer;
begin
beginX:=X; beginY:=Y; lastX:=X; lastY:=Y;
moving:=True;
end;procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if moving then begin
rct.Left:=beginX;
rct.Top:=beginY;
rct.Right:=lastX;
rct.Bottom:=lastY;
DrawFocusRect(PaintBox2.Canvas.Handle,rct);
rct.Right:=X;
rct.Bottom:=Y;
DrawFocusRect(PaintBox2.Canvas.Handle,rct);
lastX:=X; lastY:=Y;
end;
end;procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
i:Integer;
zoom:Double;
begin
moving:=False;
endX:=X; endY:=Y;
if (endX=beginX) or (endY=beginY) or (endX<beginX) or (endY<beginY) then Exit;
if (endX-beginX)>(endY-beginY) then zoom:=Image1.Width/(endX-beginX)
else zoom:=Image1.Height/(endY-beginY);
ClearImg;
Image1.Canvas.MoveTo(0-round(beginX*zoom),0-round(beginY*zoom));
for i:=0 to dataLen-1 do begin
dataTmp[i,0]:=Round((dataTmp[i,0]-beginX)*zoom);
dataTmp[i,1]:=Round((dataTmp[i,1]-beginY)*zoom);
Image1.Canvas.LineTo(dataTmp[i,0],dataTmp[i,1]);
end;
end;