PDA

View Full Version : بدست آوردن Canvas مربوط به Lable مخفی



مصطفی ساتکی
یک شنبه 08 مهر 1386, 18:23 عصر
چطور میشه Canvas مربوط به Label مخفی شده را بدست آورد به شرط اینکه محتوای Canvas اون چیزی باشه که در حالت نمایان نشون داده می شه

ghabil
یک شنبه 08 مهر 1386, 19:58 عصر
Canvasش رو میخوای چی کار؟! تو Captionش رو بخون حالا چه نمایان باشه چه نباشه، اینکه Canvas یک کامپوننت Paint بشه یا نشه یک خصوصیت کاملا جدا از Captionش هست.

مصطفی ساتکی
یک شنبه 08 مهر 1386, 21:46 عصر
ممنون میشم اگه کسی میتونه پاسخ بده :
چطور میشه Canvas مربوط به Label مخفی شده را بدست آورد به شرط اینکه محتوای Canvas اون چیزی باشه که در حالت نمایان نشون داده می شه؟

Mahmood_M
یک شنبه 08 مهر 1386, 22:25 عصر
چطور میشه Canvas مربوط به Label مخفی شده را بدست آورد به شرط اینکه محتوای Canvas اون چیزی باشه که در حالت نمایان نشون داده می شه
راستش بهتره یه خورده بیشتر توضیح بدید ...
هدفتون چیه‌؟ چه کاری باید انجام بدید ؟
Canvas یک Label با Label1.Canvas قابل دسترسی هست ... !

میخواید روش چیزی بنویسید یا چیزی ازش بخونید یا میخواید اون رو جایی رسم کنید یا ... ؟

به هر حال بهتره توضیح بیشتری بدید ...

موفق باشید ...

مصطفی ساتکی
دوشنبه 09 مهر 1386, 00:15 صبح
ببینید ما میخوایم Canvas یک Label رو داشته باشیم در حالتی که Label مخفیه.
شما به راحتی می تونید یه Label بسازید font مربوطه رو تنظیم و خواص Autosize و Wordwrap رو تنظیم کنید، سپس Visiable مربوط به Label رو False کنید حالا با تابع Bitblt پرده مربوط

به این Label رو تو یه جایی از فرم کپی کنید ، می بینید که عملاً چیزی روی فرم رسم نمی شه ولی تو یه رده کلاس بالاتر درکد کلاس TCustomLabel برروی Canvas اون با تابع Drawtext

متن مورد نظر رسم می شه و حتی ارتفاع مربوطه برای این Object جاری با SetBounds تنظیم میشه.
حالا سوال من اینه که چرا در حالتی که Object مخفیه یا Object از کادر فرم بیرونه، به این Canvas به اون صورتیکه در حالت نرماله در دسترسه، نمی شه دست پیدا کرد.
کسی تا حالا چنین چیزی رو آزمایش کرده؟

ghabil
دوشنبه 09 مهر 1386, 01:28 صبح
Visible یک کنترل رو False ست کردن به معنی این هست که Message مربوط به WMPaint برای اون GraphicControl خاص Dispatch نشه ؛ این از طریق ویندوز ، از طریق دلفی هم توی Repaint کنترل میشه که اگر Visible کنترل False هست کنترل Invalidate نشه در نتیجه هیچ وقت Paint نمیشه که بخواد SetBaounds یا DrawText و یا بقیه دستورات Paint اجرا بشند، اونی هم که میبینی یکبار دفعی اول میشند زمان ایجادشون هست و بعد فرم دوباره کانواسش رو میکشه اما دیگه دستور Repaint برای کنترل مخفی نمیره !
پس کانواسش خالیه : اما از اونجایی که از Label برای نشون دادن متنش استفاده میشه و از اونجایی که Paintش خیلی ساده Textش رو نشون میده فقط ، پس وقتی بهت میگم بجای کانواس برو سراغ متنش ، بجای Bold کردن ، یکمی فکر کن شاید دلیل داره که بهت میگم دقیق بگو میخوای چی کار کنی.

Hadizadeh
دوشنبه 09 مهر 1386, 12:08 عصر
ببین چرا با یه TImage و به کار گیری خصوصیت Stretch اون کار نمی کنی؟ اینکه راحت تره

مصطفی ساتکی
دوشنبه 09 مهر 1386, 19:43 عصر
حالا که شما می گید WMPaint به کنترل فرستاده نمی شه می تونید همون Label خصوصیت top اونه روی -10 تنظیم کنید می بینید که اون چیزی که Label داره نشون می ده شما از Canvas اون در حالت Visiable هم بدست نمیارید منظور از مخفی این بود که Canvas اون در این حالات معتبر نیست و چه در این حالت Visiable هم Canvas معتبر نیست بلاخره هدف کلی سوال این بود که چطور به این پرده در حال نمایش مربوط به Label دسترسی پیدا کنیم حالا اگه ما مایل باشیم که تو هر شرایطی پرده رو به همان صورت نرمال که نشون داده میشه بدست بیاریم . در هر صورت من جوابشو پیدا کردم .




unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,StdCtrls, ExtCtrls;
type
tCATLabel=class(TLabel)
protected
procedure paint;override;
public
Bitmap : TBitmap;
constructor Create(AOwner : TComponent);override;
destructor Destroy;override;
end;
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ tCATLabel }
constructor tCATLabel.Create(AOwner: TComponent);
begin
inherited;
Bitmap := TBitmap.Create;
end;
destructor tCATLabel.Destroy;
begin
Bitmap.Free;
inherited;
end;
procedure tCATLabel.paint;
const
Alignments: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK);
var
Rect, CalcRect: TRect;
DrawStyle: Longint;
Text: string;
begin
inherited;
bitmap.Width := Width;
bitmap.Height := Height;
with bitmap. Canvas do
begin
if not Transparent then
begin
Brush.Color := Self.Color;
Brush.Style := bsSolid;
FillRect(ClientRect);
//Rectangle(ClientRect);
end;
Brush.Style := bsClear;
Rect := ClientRect;
DrawStyle := DT_EXPANDTABS or WordWraps[WordWrap] or Alignments[Alignment];
DrawStyle := DrawTextBiDiModeFlags(DrawStyle);
bitmap.Canvas.Font :=Self. Font;
DrawText(bitmap.Canvas.Handle, PChar(Caption), Length(Caption), Rect, DrawStyle);

end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var img : tCATLabel;
begin
img := tCATLabel.Create(Self);
img.Parent := Self;
img.Width := 100;
img.Height := 300;
img.Left := 0;
img.Top := 0;
img.Font.Name := 'b titr';
img.Font.Size := 20;
img.Caption := 'این متنیه که بایستی نشون داده شه';
img.AutoSize := True;
img.WordWrap := True;
img.Alignment := taRightJustify;
img.Top := -20;
img.Paint;
Image1.Width := img.bitmap.Width;
Image1.Height:= img.bitmap.Height;
Image1.Picture.Bitmap.Assign(img.bitmap);
end;
end.