Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2013, 22:10   #1
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию "Копирование частей pngimage в pngimage" или "Создание своей всеразмерной и прозрачной кнопки"

И снова я =) Дело в том, что это все касается одного проекта и я собираю его по кускам параллельно учась)
Вообщем мне надо создать свой всеразмерный контрол (кнопка) на основе картинки.
Есть картинка .png заранее нарисованная в ФШ, из нее надо сделать кнопку, которую можно растянуть хоть на весь экран, естественно, чтоб она не потеряла свой вид, т.е. углы такие же закругленые/угловатые/т.п. как в оригинале.
Рассмотрел функцию copyrect, но на tpngimage таковая не работает. Подскажите что делать, пожалуйста.
В обработчике формы repaint я сначала все стираю с tbitmap, а затем рисую на нем, после чего загружаю его в канву формы функцией draw, чтобы избежать ненужного мерцания.
Так вот если этой же функцией (draw) выводить на tbitmap tpngimage, то все отлично рисуется, и ДАЖЕ С ПРОЗРАЧНОСТЬЮ! =)
Но вот сам tpngimage изменить ручками не получается.

Вот так сделать свой прозрачный контрол пытался я.
Код:
unit buttontype;

interface

uses pngimage, System.SysUtils, System.Classes;

type tmybutton = record
  public
  png:tpngimage;
  left, top:integer;
  function create(name: string; height, width:integer): boolean;
  procedure free;
end;

var t:text;

implementation

{ tmybutton }

function tmybutton.create(name: string; height, width:integer): boolean;
var pngbuf:tpngimage; n:integer;
begin
  result:=false;
  if (fileexists(name+'.png'))and(fileexists(name+'.aff')) then
  begin
    result:=true;
    assignfile(t, name+'.aff'); //хранится всего 1 число (n) - размерность углового региона
    reset(t);
    readln(t, n);
    closefile(t);
    pngbuf:=tpngimage.Create;
    pngbuf.LoadFromFile(name+'.png');
    png:=tpngimage.Create;
    png.Width:=width; //говорит, что неизменяемый параметр,
    png.Height:=Height; //что, собственно, уже как бы намекает.
    //загрузка изображения по частям
    png.Canvas.CopyRect(rect(0,0,n-1,n-1), pngbuf.Canvas, rect(0,0,n-1,n-1));
    png.Canvas.CopyRect(rect(n,0,width-n,n-1), pngbuf.Canvas, rect(n,0,n,n-1));
    png.Canvas.CopyRect(rect(width-(n-1),0,width-1,n-1), pngbuf.Canvas, rect(n+1,0,n*2+1,n-1));

    png.Canvas.CopyRect(rect(0,n,n-1,height-n), pngbuf.Canvas, rect(0,n,n-1,n));
    png.Canvas.CopyRect(rect(n,n,width-n,height-n), pngbuf.Canvas, rect(n,n,n,n));
    png.Canvas.CopyRect(rect(width-(n-1),n,width-1,height-n), pngbuf.Canvas, rect(n+1,n,n*2+1,n));

    png.Canvas.CopyRect(rect(0,height-(n-1),n-1,height-1), pngbuf.Canvas, rect(0,n+1,n-1,n*2+1));
    png.Canvas.CopyRect(rect(n,height-(n-1),width-n,height-1), pngbuf.Canvas, rect(n,n+1,n,n*2+1));
    png.Canvas.CopyRect(rect(width-(n-1),height-(n-1),width-1,height-1), pngbuf.Canvas, rect(n+1,n+1,n*2+1,n*2+1));

    pngbuf.Free;
  end;
end;

procedure tmybutton.free;
begin
  png.Free;
end;

end.
P.S.: Проект для института.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 15.04.2013, 22:19   #2
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

1 - оригинал (31х31, размерность углового региона "n" =15)
2 - растяжка регионов
3 - готовое изображение (64х35)
(белого фона у самих изображений нет)
Изображения
Тип файла: png 111.png (2.9 Кб, 72 просмотров)
Тип файла: png 112.png (3.0 Кб, 33 просмотров)
Тип файла: png 113.png (2.9 Кб, 36 просмотров)
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
Как "повесить " передачу данных из формы на событие нажатия кнопки типа "button" ? vedro-compota JavaScript, Ajax 10 14.12.2010 21:05
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04