Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Растягивание Canvas как в Paint 
:(
    Опции темы
IvanoffAndrey
Дата 11.5.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 8.7.2006
Где: СГАУ

Репутация: нет
Всего: 2



Здравствуйте.
Может кто знает как увеличивать площадь занимаемую канвой в компоненте TImage?
Вот в Pointe чтобы увеличить площадь доступную для рисования достаточно потянуть за правый нижний уголок и белый листок станет нужных размеров.
Подскажите как это реализуется для Delphi?
--------------------
Размерность пространства есть число Pi и в каждой точке вселенной оно стремиться к этому числу.
PM MAIL   Вверх
Crw
Дата 11.5.2009, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 25.2.2008

Репутация: нет
Всего: 4



Цитата(IvanoffAndrey @  11.5.2009,  17:03 Найти цитируемый пост)
Вот в Pointe чтобы увеличить площадь

Как в Pаinte ?
Можно добавить небольшой компонент (типа панельку) в правый нижний угол TImage, сделать эту панельку перетаскиваемой, и при ее перемещении изменять размеры TImage.
PM MAIL   Вверх
Keeper89
Дата 11.5.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 1
Всего: 58



Просто увеличить размер Image (Width и Height) нельзя?


--------------------
PM MAIL WWW   Вверх
AntonN
Дата 11.5.2009, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



"просто" изменить размеры Timage можно, но толку от этого будет немного.
кроме размеров контрола нужно менять размены "внутренностей" smile
Код

image1.picture.bitmap.width:=image1.width;
image1.picture.bitmap.height:=image1.height;


PS надеюсь я правильно стелепатировал smile


--------------------
user posted image
PM MAIL WWW   Вверх
Alexeis
Дата 12.5.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Можно сделать как в книге Григорьева, то чуток переделать не для дырки, а просто для изменения размеров панели
Код

unit WHMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls;

type
  TFormHole = class(TForm)
    PanelHole: TPanel;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
  private
    FOldPanelWndProc: TWndMethod;
    procedure PanelWndProc(var Msg: TMessage);
    procedure WMSize(var Msg: TWMSize);message WM_SIZE;
  //  procedure SetRegion;
  end;

var
  FormHole: TFormHole;

implementation

{$R *.DFM}

const
  // Минимальное расстояние от края дырки до края окна.
  HoleDistance = 40;
  // Зона чувствительности рамки панели - насколько пикселей
  // может отстоять курсор вглубь от края панели, чтобы его
  // положение расценивалось как попадание в рамку.
  BorderMouseSensivity = 3;
  // Зона чувствительности угла рамки панели - насколько пикселей
  // может отстоять курсор от угла панели, чтобы его
  // положение расценивалось как попадание в угол рамки.
  CornerMouseSensivity = 15;
  // Толщина рамки дырки, использующаяся при вычислении региона
  HoleBorder = 3;
  // Минимальная ширина и высота дырки
  MinHoleSize = 10;
  // Смещение стрелки относительно соответствующего угла

procedure TFormHole.FormCreate(Sender: TObject);
begin
  FOldPanelWndProc := PanelHole.WindowProc;
  PanelHole.WindowProc := PanelWndProc;
  Image1.Picture.Bitmap.Height := Image1.Height;
  Image1.Picture.Bitmap.Width  := Image1.Width;
end;

procedure TFormHole.PanelWndProc(var Msg: TMessage);
var
  Pt: TPoint;
  R: TRect;
begin
 FOldPanelWndProc(Msg);
 if Msg.Msg = WM_NCHITTEST then
 begin
   Pt := PanelHole.ScreenToClient(Point(Msg.LParamLo, Msg.LParamHi));
   if Pt.X < BorderMouseSensivity then
     Msg.Result := 0
   else if Pt.X >= PanelHole.Width - BorderMouseSensivity then
     if Pt.Y < CornerMouseSensivity then
       Msg.Result := 0
     else if Pt.Y >= PanelHole.Height - CornerMouseSensivity then
       Msg.Result := HTBOTTOMRIGHT
     else
      Msg.Result := HTRIGHT
   else if Pt.Y < BorderMouseSensivity then
      Msg.Result := 0
   else if Pt.Y >= PanelHole.Height - BorderMouseSensivity then
     if Pt.X < CornerMouseSensivity then
       Msg.Result := 0
     else if Pt.X >= PanelHole.Width - CornerMouseSensivity then
       Msg.Result := HTBOTTOMRIGHT
    else
       Msg.Result := HTBOTTOM;
 end
 else if Msg.Msg = WM_SIZE then
 begin
   // Устанавливаем новые ограничения для размеров окна,
   // учитывающие новое положение дырки
   Constraints.MinWidth := Width - ClientWidth + PanelHole.Left + MinHoleSize + HoleDistance;
   Constraints.MinHeight := Height - ClientHeight + PanelHole.Top + MinHoleSize + HoleDistance;
   Image1.Picture.Bitmap.Height := Image1.Height - 1;
   Image1.Picture.Bitmap.Width  := Image1.Width - 1;
   Image1.Invalidate;
   Image1.
 end
 else if Msg.Msg = WM_SIZING then
 begin
   // Копируем переданный прямоугольник в переменную R,
   // одновременно пересчитывая координаты из экранных
   // в клиентские
   R.TopLeft := ScreenToClient(PRect(Msg.LParam)^.TopLeft);
   R.BottomRight := ScreenToClient(PRect(Msg.LParam)^.BottomRight);
   // Если ширина слишком мала, проверяем, за какую
   // сторону тянет пользователь. Если за левую -
   // корректируем координаты левой стороны, если за
   // правую - её координаты
   if R.Right - R.Left < MinHoleSize then
     if Msg.WParam in [WMSZ_BOTTOMLEFT, WMSZ_LEFT, WMSZ_TOPLEFT] then
       R.Left := R.Right - MinHoleSize
     else
       R.Right := R.Left + MinHoleSize;
   // Аналогично действуем, если слишком мала высота
   if R.Bottom - R.Top < MinHoleSize then
     if Msg.WParam in [WMSZ_TOP, WMSZ_TOPLEFT, WMSZ_TOPRIGHT] then
       R.Top := R.Bottom - MinHoleSize
     else
       R.Bottom := R.Top + MinHoleSize;
   // Сдвигаем стороны, слишком близко подошедшие
   // к границам окна
   if R.Left < HoleDistance then
     R.Left := HoleDistance;
   if R.Top < HoleDistance then
     R.Top := HoleDistance;
   if R.Right > ClientWidth - HoleDistance then
     R.Right := ClientWidth - HoleDistance;
   if R.Bottom > ClientHeight - HoleDistance then
     R.Bottom := ClientHeight - HoleDistance;
   // Копируем прямоугольник R, переводя его координаты
   // обратно в экранные
   PRect(Msg.LParam)^.TopLeft := ClientToScreen(R.TopLeft);
   PRect(Msg.LParam)^.BottomRight := ClientToScreen(R.BottomRight);
  end;
end;
 
procedure TFormHole.WMSize(var Msg: TWMSize);
begin
  inherited;
  // При уменьшении размеров окна уменьшаем размер дырки,
  // если границы окна подошли слишком близко к ней
  if PanelHole.Left + PanelHole.Width > ClientWidth - HoleDistance then
    PanelHole.Width := ClientWidth - HoleDistance - PanelHole.Left;
  if PanelHole.Top + PanelHole.Height > ClientHeight - HoleDistance then
    PanelHole.Height := ClientHeight - HoleDistance - PanelHole.Top;
end;

end.


проект в атаче

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  WndHole.zip 3,03 Kb


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
IvanoffAndrey
Дата 12.5.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 8.7.2006
Где: СГАУ

Репутация: нет
Всего: 2



Спасибо всем большое, буду разбираться пока.
--------------------
Размерность пространства есть число Pi и в каждой точке вселенной оно стремиться к этому числу.
PM MAIL   Вверх
Staruha
Дата 22.5.2009, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: нет
Всего: 27



Цитата

"просто" изменить размеры Timage можно, но толку от этого будет немного.
кроме размеров контрола нужно менять размены "внутренностей" 

 толк будет,если изменишь свойство Stretch в true. И тяни с помощью отслеживания координат мышки


--------------------
Возмездие настигнет
PM MAIL   Вверх
AntonN
Дата 22.5.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



Staruha, 
костыль. хромированный.


--------------------
user posted image
PM MAIL WWW   Вверх
Staruha
Дата 25.5.2009, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: нет
Всего: 27



AntonN 
Не поняла. Предлагаю то же что и ты менять размеры smile 


--------------------
Возмездие настигнет
PM MAIL   Вверх
AntonN
Дата 25.5.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



Staruha, не то. Stretch масштабирует исходное изображение до размеров контрола, просто растягивая его. Не трудно предположить, что если исходное изображение будет меньше "контрольного", то нарисованное "как в пейнте" не будет отличаться тонкими прямыми линиями. Более того, если автор рисует "как в пейнте", то уменьшенное исходное изображение может вместить в себя куда меньше информации, нежели бОльшего размера. Проще говоря, на битмапе с шириной 100 пикселей можно нарисовать 5 квадратов по 20 пикселей шириной, а на битмапе в 40 пикселей они будут по 10 пикселей шириной, при растяжении толщина линий будет нефиговой.
PS "комодератор" с такими познаниями? фшоке  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Alexeis
Дата 25.5.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(AntonN @  25.5.2009,  12:37 Найти цитируемый пост)
PS "комодератор" с такими познаниями? фшоке

Staruha, комодератор в другом разделе, я например 0 в вижуал бейсике и совсем не знаю как там работает VBA с документами офиса. Ничего удивительного. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AntonN
Дата 25.5.2009, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



Alexeis, вот уже повозмущацо нельзя smile


--------------------
user posted image
PM MAIL WWW   Вверх
Staruha
Дата 25.5.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: нет
Всего: 27



 smile Alexeis спасибо что заступился.
AntonN я за простые решения. 
IvanoffAndrey  не сказал для чего ему надо так издеваться над программой
Я так крашу все что под руку попадется.Может ему это надо?
Код

img:=TImage.Create(Form1);
   img.Parent:=panel;
   img.Picture.LoadFromFile('fon5.bmp');
   img.Stretch:=True;
   img.Align:=alClient;



--------------------
Возмездие настигнет
PM MAIL   Вверх
AntonN
Дата 25.5.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



Staruha, но это действительно не решение, просто сохрани в файл битмап и увидишь, что он маленького размера. более того, например чтобы на нем рисовать "как в пейнте" нужно будет постоянно пересчитывать координаты клика (картинка ведь масштабируется) - это никак не путь к простоте smile


--------------------
user posted image
PM MAIL WWW   Вверх
Staruha
Дата 26.5.2009, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: нет
Всего: 27



Ну, если он будет заниматься реставрацией уже готового изображения,тогда придется масштабировать несомненно.Он же не сказал какую идею он хочет реализовать.А я стем что описываешь сталкивалась(заливаемый объект был крупнее,чем панелька) ,только не знала как это исправить.Теперь знаю  smile 


--------------------
Возмездие настигнет
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.