Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > глюк с ресайзом


Автор: CompWorm 9.8.2006, 22:36
Вновь приветствую!

помогите плиз решить проблему... вот код

Код


procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
var n: string;
begin

PageControl1.Width:=form1.Width;
PageControl1.Height:=form1.Height;

image1.Top:=0;
image1.Left:=0;
Image1.Width := screen.Width;
Image1.Height:= screen.Height;

image7.Top     :=round(65/(600/TabSheet2.Height));
image7.left      :=round(10/(785/TabSheet2.Width ));
image7.Height :=round(100*(TabSheet2.Height/600));
image7.Width  :=round(320*(TabSheet2.Width/800));



...



FImage:= Tbitmap.create;

n:=ExtractFilePath(Application.ExeName)+'skins/'+MySkin+'\'+'backg1.bmp';
Fimage.LoadFromFile(n);
image1.Canvas.StretchDraw(Rect(0, 0,  PageControl1.Width-12, PageControl1.Height-51), FImage);

n:=ExtractFilePath(Application.ExeName)+'skins/'+MySkin+'\'+'i7.bmp';
Fimage.LoadFromFile(n);
image7.Canvas.StretchDraw(Rect(0, 0,  image7.Width, image7.Height), FImage);

end;




короче, этот код правильным (я надеюсь) образом перераспредиляет картинки, кнопки итд
на форме в зависимости от ее размера. то есть в процентном отношении. (если это можно сделать проще, подскажите мне дураку)

проблема в том, что image1 и картинка на нем растягивается без проблем, в зависимости от размеров пайдж контрола. 
а вот image7 не совсем верно.
нарисованная на нем картинка image7.Canvas.StretchDraw растянута верно, а вот сам 
image7 не растягивается вообще и остается с виду статичным, отрезая часть правельно настянутой картинки на нем smile ! 

установка автосайза вообще приводит к полному исчезновению.
подскажите, в чем я не прав  smile 

Автор: Alexeis 10.8.2006, 00:15
При использовании 
Цитата(CompWorm @  9.8.2006,  22:36 Найти цитируемый пост)
image7.Canvas.StretchDraw

или любых других функций рисования, свойство Stretch у TImage автоматически переходит из true в false, и картинка не растягивается по всей поверхности канвы. После любых операций рисования желатедьно заново устанавливать Stretch.

Автор: CompWorm 10.8.2006, 00:44
похоже, Вы правы.
Большое спасибо. smile 

Автор: CompWorm 10.8.2006, 05:45
как-то я рано обрадовался... этот Stretch уж слишком растягивает.

рассмотрим пример:

Код

procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
var n: string;
begin
PageControl1.Width:=form1.Width;
PageControl1.Height:=form1.Height;

image1.Top:=0;
image1.Left:=0;
Image1.Width := TabSheet2.Width;
Image1.Height:= TabSheet2.Height;

FImage:= Tbitmap.create;

n:=ExtractFilePath(Application.ExeName)+'skins/'+MySkin+'/'+'backg1.bmp';
Fimage.LoadFromFile(n);
image1.Canvas.StretchDraw(Rect(0, 0,  Image1.Width, Image1.Height), FImage);



итак, еще раз... на табконтроле растягиваем имэйдж и рисуем на нем картинку в первый раз. все рисует правильно, при форме 800х600.
растягиваем форму во весь экран и картинка перерисовывается. правильно. но сам имайдж при этом остается с неизменными размерами, отризая часть правильно отмасштабированной картинки. 
если добавить в конце

Код

image2.Stretch:=true;


все растягивается в полтора (!) раза. примерно. 
что конечно неверно. 

нужно ли делать еще какие-нибудь настройки? 
неужели Вы никогда не масштабировали изображение?

Автор: Alexeis 10.8.2006, 09:03
можно начать с того что рисовать можно не на всей область Imgae, а только на ее клиентской части Image1.ClientWidth вместо, Image1.Width
Цитата(CompWorm @  10.8.2006,  05:45 Найти цитируемый пост)
image1.Canvas.StretchDraw(Rect(0, 0,  Image1.Width, Image1.Height), FImage);

Кроме того на самом деле рисование производится на, BitMap, Image, только отобажает битмап. Поэтому во избежание трудно уловимых ошибок, я бы посоветовал рисовать но Image1.Picture.Bitmap.Canvas, и использовать только его размеры. Кроме того после любого ресайза меняются размеры только Имаги, но не встроеного битмапа, поэтому для коррекной работы требуется установка 
Код

Image1.Picture.Bitmap.Width := Image1.ClientWidth
 (анологично высота).
После установки правельных размеров битмапа, на нем можно рисовать изображение. Поскольку битмап и так имеет размеры имаги, то необходимость в Stretch отпадает. Другой вариант состоит, в том чтобы не менять размер битмапа, но всеже для рисования использовать именно его размеры, а не имаги. Тогда Stretch растянет битмап до размеров Image.

Автор: CompWorm 11.8.2006, 05:42
во оказывается скока тонкостей!
спасибо. пойду поработаю над этим.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)