線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2583
推到 Plurk!
推到 Facebook!

关于scroll canvas

尚未結案
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-01 23:27:29 IP:211.147.xxx.xxx 未訂閱
请问有没有可以滚动的绘图构件? 我用 TImage 来显示图片, 但图片太大, 只有部分能显示。而且我有一段代码是直接读取鼠标当前相对于左上角的坐标以及该点下的颜色值,如果没有滚动, 图像中没有显示的部分就无法用鼠标读出其颜色值了
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-02 07:31:35 IP:211.147.xxx.xxx 未訂閱
我再把问题说清楚一点, 我利用TImage来绘图, 但我不是将图片读入到picture中, 而是直接利用TImage.Canvas中的函数来绘图。由于所绘图像太大(已起过整个screen) 只有约一半的图可以看到,我只好将TImage放在TScrollbox中, 希望可以滚动看到下部分的图。 但不知为什么scrollbar总是不出来。
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-02 10:41:30 IP:61.60.xxx.xxx 未訂閱
您可以在scrollbox的horzscrollbar內的range設一個寬度,這樣就可以滾動了
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-02 14:56:43 IP:211.147.xxx.xxx 未訂閱
引言: 您可以在scrollbox的horzscrollbar內的range設一個寬度,這樣就可以滾動了
谢谢, 但还是不行。我写了一段很简单的测试代码,只有一个TImage,一个TScrollBox及一个TButton, 将TScrollBox加入到TImage中, TButton按下时在TImage上画一条很垂直方向超过两倍屏幕高度的线并在水平方向画一条长度超过两倍屏幕宽度的线, 但这时TScrollBox还是不出现scrollbar。各控件的属性如下, TImage: Align = alClient AutoSize = False DragMode = dmManual Stretch = False IncrementalDisplay = False Height = 396 Width = 581 TScrollBox: Align = alNone AutoScroll = False AutoSize = False Width = 585 Height = 400 HorzScrollBar: ButtonSize = 0 Increment = 8 Range = 200 Size = 0 Style = ssRegular Tracking = False; VertScrollBar: ButtonSize = 0 Increment = 8 Range = 200 Size = 0 Style = ssRegular Tracking = False; 再请大家帮忙
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-02 15:17:48 IP:61.60.xxx.xxx 未訂閱
scrollbox的horzscrollbar內的range要大於scrollbox的寬度scrollbar才能顯示出來,我看你的range小於scrollbox的寬度,把它改成大於585即可.
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-02 15:49:53 IP:211.147.xxx.xxx 未訂閱
引言: scrollbox的horzscrollbar內的range要大於scrollbox的寬度scrollbar才能顯示出來,我看你的range小於scrollbox的寬度,把它改成大於585即可.
谢谢, 现在TScrollBox和TTmage的大小都是400x400, 而且HorzScrollBar中的Range设为600, VectScrollBar中的Range也设为600, 垂值方向的scrollbar出来了:) 但为什么水平方向的scrollbar还是没有? 谢谢
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-10-02 16:13:16 IP:61.60.xxx.xxx 未訂閱
我根據您的設定,水平SCOLLBAR亦出現的,看看VISIBLE屬性是否是TRUE.
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-10-02 16:40:44 IP:211.147.xxx.xxx 未訂閱
引言: 我根據您的設定,水平SCOLLBAR亦出現的,看看VISIBLE屬性是否是TRUE.
谢谢, 真的是这个问题, 只是自己太大意。现在有另一个难题,以前没用过Delphi作图像处理和画图, 突然间要用起来就很多问题, 请大家勿怪。 假设我的TImage叫img, TScrollbox叫scb。两者的大小相同,假设原来都是600x600的,HorzScrollbar的range=1000, VertScrollbar的range=1000。在程序开始我在每img上画了许多的圆及正方形,这些图的半径及正方形的边都是基于某个变量(u)为单位的, 起始时u设为20,我在程序中加入了一个TrackBar, 改变TrackBar时就改变u的值,然后重画所有圆及正方形,这样就可以放大或缩小整个图形了。但是即使起始时,这个图都很大, 超出600x600 的范围,所以才要用到 scrollbox。如果利用trackbar使img中的图形变大一倍,还是可以拖动scrollbox来观看整张图, 但如果继续使img中的图形变大(增大u),那么拖动scrollbox也无法完全显示整张图,总有一部分没有画出来。我想是因为图形变大了,但img的大小还是原来的大小所致,所以每当增大u时,我也倍大img的长和宽,但还是不起效。请问有没有解决方法? 另外想问,那个horzscrollbar.range和vertscrollbar.range具体怎样定义才合理,好像随使给个值不太好。那horzscrollbar.size又是什么呢? 在拖动scrollbar, 图形很闪烁, 可以解决吗? 而且加了scrollbar以后,用trackbar将图形放大时比不加scrollbar 时慢多了, 为什么呢? 实在不好意思,问题太多。我在本论坛上找了很多资料, 但太多数关于怎样处理从文件中读入的图像的,而很少关于直接绘图的,所以请大家帮忙看看。先谢了。
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-10-02 20:04:13 IP:61.60.xxx.xxx 未訂閱
horzscrollbar.range可以依據您的需要改變,想要多大就看您的程式需求了, 拖动scrollbox也无法完全显示整张图,总有一部分没有画出来 : 這個問題表示您的image的長寬與horzscrollbar.range與verticalscrollbar.range的大小沒有成比例,調整成相同比例即可. horzscrollbar.size是scrollbar高度的大小值 scrollbar用trackbar将图形放大时比不加scrollbar 时慢多:這是很正常的,圖形大時畫的時間會比較長,aotocad可以放大圖形幾萬倍似乎也不會慢,因為它只顯示要放大的那一部份,不是將整張圖面全部比例放大繪製,所以要加快繪製速度 需要在繪製前就計算出哪個部份要放大,畢竟用算的比畫的速度快的多.
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-10-02 21:26:27 IP:211.147.xxx.xxx 未訂閱
thanks 發表人 - mchakuna 於 2005/10/02 22:04:59
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-10-02 21:27:15 IP:211.147.xxx.xxx 未訂閱
引言: horzscrollbar.range可以依據您的需要改變,想要多大就看您的程式需求了, 拖动scrollbox也无法完全显示整张图,总有一部分没有画出来 : 這個問題表示您的image的長寬與horzscrollbar.range與verticalscrollbar.range的大小沒有成比例,調整成相同比例即可. horzscrollbar.size是scrollbar高度的大小值 scrollbar用trackbar将图形放大时比不加scrollbar 时慢多:這是很正常的,圖形大時畫的時間會比較長,aotocad可以放大圖形幾萬倍似乎也不會慢,因為它只顯示要放大的那一部份,不是將整張圖面全部比例放大繪製,所以要加快繪製速度 需要在繪製前就計算出哪個部份要放大,畢竟用算的比畫的速度快的多.
谢谢, 我原来的代码就是按比例的, 如下
 
{ 初始化, 这里 u 是 Extended 类型的,是比例系数。}
procedure TForm1.FormCreate(Sender: TObject);
begin
  u := 0.2;      {ScrollBox 的初始大小}
  ImgScrollBox.Width := 300;
  ImgScrollBox.Height := 300;      {Image 的初始大小}
  ScrImage.Width  := 300;
  ScrImage.Height := 300;      {Scrollbox的滚动部分的初始范围}
  ImgScrollBox.HorzScrollBar.Range := 600;
  ImgScrollBox.VertScrollBar.Range := 600;      {在Image中画出四个圆}
  DrawImage;
end;    {放大图形}
procedure TForm1.BiggerBtnClick(Sender: TObject);
begin
  {比例系数每次增加}
  u := u   0.2;      {这里每次将图像的长宽增大200}
  with ScrImage do
  begin
    Width  := Width   200;
    Height := Height   200;
  end;      {这里每次将滚动的范围增大200, 以保证它们成比例}
  with ImgScrollBox do
  begin
    HorzScrollBar.Range := HorzScrollBar.Range   200;
    VertScrollBar.Range := VertScrollBar.Range   200;
  end;      {重画放大后的图像}
  DrawImage;
end;    procedure TForm1.DrawImage;
var
  w, h :integer;
  x, y :Integer;
  cx, cy :Integer;
  dx, dy :Integer;
  c :TColor;
begin
  w := ScrImage.Width;
  h := ScrImage.Height;
  cx := w div 2; cy := h div 2;
  dx := w div 4; dy := h div 4;      c := clWhite;      with ScrImage do
  begin
    Canvas.Brush.Style := bsSolid;
    Canvas.Brush.Color := clWhite;
    Canvas.Rectangle(ClientRect );
    c := c 3;
    Canvas.Pen.Color := c;
    x := cx - dx; y := cy - dy;
    Canvas.Ellipse(x-Round(dx*u), y-Round(dy*u), x Round(dx*u), y Round(dy*u));        c := c 3;
    Canvas.Pen.Color := c;
    x := cx   dx; y := cy - dy;
    Canvas.Ellipse(x-Round(dx*u), y-Round(dy*u), x Round(dx*u), y Round(dy*u));        c := c 3;
    Canvas.Pen.Color := c;
    x := cx   dx; y := cy   dy;
    Canvas.Ellipse(x-Round(dx*u), y-Round(dy*u), x Round(dx*u), y Round(dy*u));        c := c 3;
    Canvas.Pen.Color := c;
    x := cx - dx; y := cy   dy;
    Canvas.Ellipse(x-Round(dx*u), y-Round(dy*u), x Round(dx*u), y Round(dy*u));
  end;
end;    
但还滚动后还是无法有一部分显示不出来
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-10-02 23:17:42 IP:61.60.xxx.xxx 未訂閱
您的長寬並不成比例,例如x/y =10,(x 10)/(y 10) < >10,您可能要調整成x*c與y*c才對.
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-10-03 14:25:53 IP:211.147.xxx.xxx 未訂閱
引言: 您的長寬並不成比例,例如x/y =10,(x 10)/(y 10) < >10,您可能要調整成x*c與y*c才對.
谢了, 原来的长宽比是1:1, 我现在修改了代码, 使前后的长宽成整数比
 
  with ScrImage do
  begin
    Width  := Width*2;
    Height := Height*3;
  end;      with ImgScrollBox do
  begin
    HorzScrollBar.Range := HorzScrollBar.Range*2;
    VertScrollBar.Range := VertScrollBar.Range*2;
  end;    
但问题还是一样。我试过只在初始化时先将ScrImage 的长及宽设得很大,以致可以使放大后仍能包含整张图,这样才可以在放大后滚动时仍能观看到整张完整的图,不过这样在放大会会看到很多的空白(因为一开始图就设得很大)。为什么不能在运行时动态调整大小,而非要在初始时先调好?
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-10-03 16:18:48 IP:219.80.xxx.xxx 未訂閱
在 DrawImage內做下列修正 u := u 0.2; with ScrImage do begin Width := ROUND(Width*U); Height := ROUND(Height*U); end; {这里每次将滚动的范围比例增大, 以保证它们成比例} with ImgScrollBox do begin HorzScrollBar.Range := ROUND(HorzScrollBar.Range *U); VertScrollBar.Range := ROUND(VertScrollBar.Range *U); end;
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-10-03 21:34:05 IP:211.147.xxx.xxx 未訂閱
引言: 在 DrawImage內做下列修正 u := u 0.2; with ScrImage do begin Width := ROUND(Width*U); Height := ROUND(Height*U); end; {这里每次将滚动的范围比例增大, 以保证它们成比例} with ImgScrollBox do begin HorzScrollBar.Range := ROUND(HorzScrollBar.Range *U); VertScrollBar.Range := ROUND(VertScrollBar.Range *U); end;
谢谢, 结果也一样, 现在scrollbar的长度是随着加长, 而image的大小也会随着变大, 但显示区域似乎一直都是那么大。都试了好多次, 看来要放弃了。
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-10-04 16:11:00 IP:220.130.xxx.xxx 未訂閱
可能canvas只能在最大不超過螢幕寬度的情形下畫,建議您用tgraphiccontrol在onpaint內畫完,再由scrollbox移動
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-10-04 20:49:53 IP:211.147.xxx.xxx 未訂閱
引言: 可能canvas只能在最大不超過螢幕寬度的情形下畫,建議您用tgraphiccontrol在onpaint內畫完,再由scrollbox移動
我的图形放到最大时,image应为1200x1400, 如果在每次放大时才放大image的长宽,则不起作用。如果在初始化时就把image的大小设为1200x1400,则滚动和显示都没问题,这时不也超过screen的长宽吗!?
sam_000
一般會員


發表:27
回覆:47
積分:14
註冊:2003-09-15

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-10-05 13:48:39 IP:219.80.xxx.xxx 未訂閱
CANVAS無法畫出超過物件寬度,所以變通的方式是繼承TGRAPHIC物件畫完再移動 或是在form內設定horrizonscroll,verticalscroll完後畫,如下例 procedure TForm1.FormPaint(Sender: TObject); begin SetWindowOrgEx (Canvas.Handle, HorzScrollbar.Position, VertScrollbar.Position, nil); Canvas.MoveTo (2, 2); Canvas.LineTo (3000, 900); end;
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-10-05 14:32:56 IP:211.147.xxx.xxx 未訂閱
引言: CANVAS無法畫出超過物件寬度,所以變通的方式是繼承TGRAPHIC物件畫完再移動 或是在form內設定horrizonscroll,verticalscroll完後畫,如下例 procedure TForm1.FormPaint(Sender: TObject); begin SetWindowOrgEx (Canvas.Handle, HorzScrollbar.Position, VertScrollbar.Position, nil); Canvas.MoveTo (2, 2); Canvas.LineTo (3000, 900); end;
原来不是这样的, CANVAS也可以画出超过物件的宽度, 对于这个问题,原来要将 同时将picture的宽度也设定才会起效
 
  image.width := Round(image.width*u);
  image.height := Round(image.height*u);      image.picture.graphics.width := image.width;
  image.picture.graphics.height := image.height;      scrollbox.HorzScrollBar.range := Round(scrollbox.HorzScrollBar.range*u);
  scrollbox.VertScrollBar.range := Round(scrollbox.VertScrollBar.range*u);
这样就完全没问题了。Anyway, 谢谢你的热心帮助与提示。
系統時間:2024-05-19 13:04:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!