H helloqiner Unregistered / Unconfirmed GUEST, unregistred user! 2005-12-21 #1 现在要实现在一幅图像上加一个固定大小的选框,这个选框要求能够实时拖动,在拖动选框的时候,右侧预览Image上能显示出选区中图像的内容。 就这个功能不太会做,大家说说思路,有源码更好,可以另开贴加分。
H helloqiner Unregistered / Unconfirmed GUEST, unregistred user! 2005-12-21 #2 现在要实现在一幅图像上加一个固定大小的选框,这个选框要求能够实时拖动,在拖动选框的时候,右侧预览Image上能显示出选区中图像的内容。 就这个功能不太会做,大家说说思路,有源码更好,可以另开贴加分。
D djptony Unregistered / Unconfirmed GUEST, unregistred user! 2005-12-21 #4 在图像是用异或画一个边框,用ptinrect判断鼠标位置是否在框中,当鼠标按下滑动的时候重画边框,用Canvas.Copyrect取得,框内的图像
H helloqiner Unregistered / Unconfirmed GUEST, unregistred user! 2005-12-21 #5 djptony兄讲得很有道理,不过我对图形图像处理没怎么接触过,劳驾能否写几行核心代码出来,谢谢。
寻 寻路 Unregistered / Unconfirmed GUEST, unregistred user! 2005-12-23 #11 使用DrawFocusRect函数绘制虚线框,在WM_LBUTTONDOWN/WM_LBUTTONUP/WM_MOUSEMOVE消息中画.然后利用StretchBlt函数来拷贝区域,下面有一段使用DrawFocusRect的代码: procedure TPowerCustomTreeNode.DoDrawFocusRect; var dc: HDC; begin //绘制焦点。这里不能使用Self.Canvas.Handle,不知道为什么 //DrawFocusRect函数是一个异或函数,再次调用清除绘制的虚线框 dc := GetDC(Handle); DrawFocusRect(dc, ClientRect); ReleaseDC(Handle, dc); end;
使用DrawFocusRect函数绘制虚线框,在WM_LBUTTONDOWN/WM_LBUTTONUP/WM_MOUSEMOVE消息中画.然后利用StretchBlt函数来拷贝区域,下面有一段使用DrawFocusRect的代码: procedure TPowerCustomTreeNode.DoDrawFocusRect; var dc: HDC; begin //绘制焦点。这里不能使用Self.Canvas.Handle,不知道为什么 //DrawFocusRect函数是一个异或函数,再次调用清除绘制的虚线框 dc := GetDC(Handle); DrawFocusRect(dc, ClientRect); ReleaseDC(Handle, dc); end;
还 还是朋友 Unregistered / Unconfirmed GUEST, unregistred user! 2005-12-23 #12 djptony的做法可以。 不过我还有一个较为简单的做法,你在Image上放一个矩形的shape。 在Shape的Mouse里事件里处理Shape移动。 至于预览,知道了Shape的坐标,把相应的Image上的图像CopyRect到 预览的Image上就可以了。
djptony的做法可以。 不过我还有一个较为简单的做法,你在Image上放一个矩形的shape。 在Shape的Mouse里事件里处理Shape移动。 至于预览,知道了Shape的坐标,把相应的Image上的图像CopyRect到 预览的Image上就可以了。
H helloqiner Unregistered / Unconfirmed GUEST, unregistred user! 2005-12-23 #13 嗯,我现在是在一张底图上放了另一个小的 Image 控件,在上面这个 Image 控件里画出一个类似于选框的东东,然后允许在运行期拖动 Image。 但有个问题,假如底图很大,是有滚动条的,那么用 Image 控件要怎么样才能获取它在底图上具体的坐标呢,怎样才能将选中的区域截取下来?
嗯,我现在是在一张底图上放了另一个小的 Image 控件,在上面这个 Image 控件里画出一个类似于选框的东东,然后允许在运行期拖动 Image。 但有个问题,假如底图很大,是有滚动条的,那么用 Image 控件要怎么样才能获取它在底图上具体的坐标呢,怎样才能将选中的区域截取下来?
H happy_boy Unregistered / Unconfirmed GUEST, unregistred user! 2005-12-26 #14 告诉你一个简单的方法 在image上放一个shape控件,将shape控件的shape属性设置为stRectangle,Brush的Style设置为bsClear 就是矩形选择框了。 然后在Image2中预览你选择的部分 R1 := Shape1.BoundsRect ; R.TopLeft.X := 0; R.TopLeft.Y := 0 ; R.BottomRight.X := R1.BottomRight.X -Shape1.Left ; R.BottomRight.Y := R1.BottomRight.Y -Shape1.Top ; Image2.Canvas.CopyRect(R,Image1.Canvas,R1); 就是这样。很好用。:)
告诉你一个简单的方法 在image上放一个shape控件,将shape控件的shape属性设置为stRectangle,Brush的Style设置为bsClear 就是矩形选择框了。 然后在Image2中预览你选择的部分 R1 := Shape1.BoundsRect ; R.TopLeft.X := 0; R.TopLeft.Y := 0 ; R.BottomRight.X := R1.BottomRight.X -Shape1.Left ; R.BottomRight.Y := R1.BottomRight.Y -Shape1.Top ; Image2.Canvas.CopyRect(R,Image1.Canvas,R1); 就是这样。很好用。:)
H happy_boy Unregistered / Unconfirmed GUEST, unregistred user! 2005-12-26 #15 忘记了Shape控件的移动下面给出Shape中两个事件的代码还有两个全局变量 //以下代码实现Shape的拖动 OldX,OldY:Integer; procedure TFrmVideo.Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin OldX := X; OldY := Y; end; end; procedure TFrmVideo.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var NewX,NewY:Integer; begin if Shift=[ssLeft] then begin NewX := Shape1.Left + X - OldX; NewY := Shape1.Top + Y - OldY; Shape1.Left := NewX; Shape1.Top := NewY; end; end;
忘记了Shape控件的移动下面给出Shape中两个事件的代码还有两个全局变量 //以下代码实现Shape的拖动 OldX,OldY:Integer; procedure TFrmVideo.Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin OldX := X; OldY := Y; end; end; procedure TFrmVideo.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var NewX,NewY:Integer; begin if Shift=[ssLeft] then begin NewX := Shape1.Left + X - OldX; NewY := Shape1.Top + Y - OldY; Shape1.Left := NewX; Shape1.Top := NewY; end; end;