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


Автор: BEST13 7.3.2010, 23:30
Здравствуйте,
Я загружаю в свой программу картинки в формате Bmp  и рисую их на Canvas. Но вот когда хочу Стереть нарисованное, то "скинированый" фон пропадает.  Подскажите, как можно решить эту проблему.
До нажатия на кнопку очистить.
http://radikal.ru/F/s61.radikal.ru/i172/1003/e6/0a99c30f3d59.jpg.html
И после.
http://radikal.ru/F/i037.radikal.ru/1003/da/2488a5cf29a9.jpg.html

И второй вопрос:
В тех Bmp, что я загружаю  в программу фон белый, и когда я запускай он таким и остаёться, хотя я включил прозрачность(pic_Letter.Transparent:=true). В чём может быть проблема?    

Код

unit U_Trans;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, sEdit, sButton, sSkinManager, sRadioButton, ExtCtrls,
  sPanel, jpeg;

type
  TForm1 = class(TForm)
    sSkinManager1: TsSkinManager;
    sB_trans: TsButton;
    sE_Name: TsEdit;
    sRB_man: TsRadioButton;
    sRB_Woman: TsRadioButton;
    sB_Clear: TsButton;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure sB_transClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure sB_ClearClick(Sender: TObject);
   
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  pic_Letter:TBitmap;
  Man:Boolean= true;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
pic_Letter:=TBitmap.Create;
pic_Letter.Transparent:=true;


end;

procedure TForm1.sB_transClick(Sender: TObject);
var i:byte; Fname,name1:string; x,y:integer;
begin
 //sB_ClearClick(Sender);
 x:=50;
 y:=50;
 name1:=sE_Name.Text;
 For i:=1 to Length(name1) do
  begin
   If ord(name1[i])<>32 then
    begin
     Fname:=name1[i]+'.bmp';
     pic_Letter.LoadFromFile('Letters\' +Fname);
     Canvas.Draw(x,y,pic_Letter);
     y:=y+pic_Letter.Height;
    end;
   end;
 if sRB_man.Checked then pic_Letter.LoadFromFile('Letters\man.bmp')
                    else pic_Letter.LoadFromFile('Letters\woman.bmp');
 Canvas.Draw(x,y,pic_Letter);
 y:=y+pic_Letter.Height;
 Canvas.Brush.Style:=bsClear;
 Canvas.Pen.Width:=3;
 Canvas.RoundRect(x-10,40,x+(pic_Letter.Width+10),y+10,80,80);

end;

procedure TForm1.FormDestroy(Sender: TObject);                          
begin
pic_Letter.Free;
end;

procedure TForm1.sB_ClearClick(Sender: TObject);
begin
 //sSkinManager1.Active:=false;
 Canvas.Brush.Color:=Form1.color;
 Canvas.FillRect(Rect(0,0,Form1.Width,Form1.Height));
 //sSkinManager1.Active:=true;
end;



end.

Автор: kami 8.3.2010, 16:02
По первому вопросу лучше обратиться к разработчикам, имхо.
На первое время может помочь sSkinManager1.RepaintForms (это навскидку, не работал плотно с этими компонентами).

Автор: BEST13 8.3.2010, 16:15
Да, я хотел написать у них на форуме. Но почему, то не могу зарегистрироваться, Постоянно выдает ошибку неправильного ввода  кода проверки. 

Автор: BEST13 9.3.2010, 22:17
Вот кажеться, я придумал решение, но оно не совсем правильно работает( 

Я использую Image но почему то, у меня только на время  показывается все картинки,  а остаётся только одна последняя и рамочка. Как на первом скрине
Код

procedure TForm1.sB_transClick(Sender: TObject);
var i:byte; Fname,name1:string; x,y:integer;
begin
 //sB_ClearClick(Sender);
 x:=50;
 y:=50;
 name1:=sE_Name.Text;
 For i:=1 to Length(name1) do
  begin
   If ord(name1[i])<>32 then
    begin
     Fname:=name1[i]+'.bmp';
     pic_Letter.LoadFromFile('Letters\' +Fname);
     Canvas.Draw(x,y,pic_Letter);
     y:=y+pic_Letter.Height;
    end;
   end;
 if sRB_man.Checked then pic_Letter.LoadFromFile('Letters\man.bmp')
                    else pic_Letter.LoadFromFile('Letters\woman.bmp');
 with Image1 do
 begin
 Canvas.Draw(x,y,pic_Letter);
 y:=y+pic_Letter.Height;
 Canvas.Brush.Style:=bsClear;
 Canvas.Pen.Width:=3;
 Canvas.RoundRect(x-10,40,x+(pic_Letter.Width+10),y+10,80,80);

end;
end;
 

Автор: BEST13 14.3.2010, 13:31
Люди добрые помогите.

Автор: Proxin 18.3.2010, 11:08
альфаскинс - тяжёлая, плохая вещь. лучше уже все скины рисовать сразу на форме.

Автор: Mikel 18.3.2010, 14:07
А зачем все закрашивать? Invalidate  не работает в качестве стирания?

Автор: BEST13 19.3.2010, 00:19
Цитата(Proxin @  18.3.2010,  11:08 Найти цитируемый пост)
альфаскинс - тяжёлая, плохая вещь. лучше уже все скины рисовать сразу на форме.


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

  

Цитата(Mikel @  18.3.2010,  14:07 Найти цитируемый пост)
А зачем все закрашивать? Invalidate  не работает в качестве стирания?

 Я та понимаю она перерисовывает? Или как?
Завтра попробую и отпишусь, спасибо smile 

Автор: BEST13 24.3.2010, 23:35
Mikel,  Я проверил ничего не меняется не стирает((

Писал так:
Код

procedure TForm1.sB_ClearClick(Sender: TObject);
begin

 Form1.Invalidate;
end;

 и так:
Код

procedure TForm1.sB_ClearClick(Sender: TObject);
begin

Invalidate;
end;

Автор: BEST13 25.3.2010, 19:37
kami, Спасибо.  Попробовал твой способ действительно работает) хотя форма мигает, и поковырявшись дальше  написал так:
Код

 sSkinManager1.UpdateSkin;

Так тоже мигает но, через раз) 
Может еще у кого-то найдутся варианты?

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