关于scroll canvas |
尚未結案
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
|
sam_000
一般會員 發表:27 回覆:47 積分:14 註冊:2003-09-15 發送簡訊給我 |
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
引言: 您可以在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 發送簡訊給我 |
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
引言: 我根據您的設定,水平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 發送簡訊給我 |
horzscrollbar.range可以依據您的需要改變,想要多大就看您的程式需求了, 拖动scrollbox也无法完全显示整张图,总有一部分没有画出来 : 這個問題表示您的image的長寬與horzscrollbar.range與verticalscrollbar.range的大小沒有成比例,調整成相同比例即可. horzscrollbar.size是scrollbar高度的大小值 scrollbar用trackbar将图形放大时比不加scrollbar 时慢多:這是很正常的,圖形大時畫的時間會比較長,aotocad可以放大圖形幾萬倍似乎也不會慢,因為它只顯示要放大的那一部份,不是將整張圖面全部比例放大繪製,所以要加快繪製速度
需要在繪製前就計算出哪個部份要放大,畢竟用算的比畫的速度快的多.
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
引言: 您的長寬並不成比例,例如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 發送簡訊給我 |
在 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 發送簡訊給我 |
引言: 在 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 發送簡訊給我 |
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
|
sam_000
一般會員 發表:27 回覆:47 積分:14 註冊:2003-09-15 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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, 谢谢你的热心帮助与提示。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |