PDA

View Full Version : سوال: چطور تصویر RichEdit رو تو بیت مپ بریزم؟



mbshareat
پنج شنبه 15 مهر 1389, 23:24 عصر
با سلام و خدا قوت خدمت بزرگان:قلب:
من می خوام متنی چند رنگ رو توی RichEdit که نامرئی شده بنویسم و محتوای تصویری اون رو توی یه بیت مپ بریزم.:گیج:
یکی از متد های RichEdit متد PaintTo هستش که درست کار نمی کنه (متن رو ترسیم نمی کنه!) ولی من نمی خوام RichEdit دیده بشه چون اصلا می خوام از چیز دیگه ای برای نمایش استفاده کنم.:بامزه:
آیا راهی هست بشه تصویر متن داخل RichEdit رو در حالی که مخفی شده در BitMap بریزم؟:متفکر:

Felony
پنج شنبه 15 مهر 1389, 23:38 عصر
این تابع رو قبلا نوشته بودم ( کتابخانه Jpeg رو به Uses اضافه کنید ) :

procedure SaveControlImageToFile(AControl : TWinControl; Const AFileName : String; UseJpegFormat : Boolean = True);
Var
Canvas : TCanvas;
Bmp : TBitmap;
Jpg : TJpegImage ;
begin
try
Canvas := TCanvas.Create;
Canvas.Handle := GetDc(AControl.Handle);
Bmp := TBitmap.Create;
Bmp.Width := AControl.Width;
Bmp.Height := AControl.Height;
bmp.PixelFormat :=pf24bit;
Bmp.Canvas.CopyRect(Canvas.ClipRect, Canvas, Canvas.ClipRect);
if UseJpegFormat then
begin
Jpg := TJpegImage.Create;
jpg.PixelFormat := jf24bit;
Jpg.Assign(Bmp);
Jpg.SaveToFile(ChangeFileExt(AFileName,'.jpg'));
end
Else
Bmp.SaveToFile(ChangeFileExt(AFileName,'.bmp'));
finally
ReleaseDC(AControl.Handle, Canvas.Handle);
FreeAndNil(Bmp);
if UseJpegFormat then
FreeAndNil(Jpg);
FreeAndNil(Canvas);
end;
end;

mbshareat
جمعه 16 مهر 1389, 00:03 صبح
جناب آقای مجتبی تاجیک عزیز
سلام علیکم و رحمة الله
از لطف و عنایت شما تشکر می کنم.کد شما رو در حدی که فقط مقصودم رو تامین کنه مختصر کردم.
و امتحان کردم. در حال عادی درست کار می کنه ولی اگه RichEdit مخفی باشه باز هم مثل paintTo متن رو توی بیت مپ نمی ریزه و فقط تصویر بدون متن می ریزه!:اشتباه:
این هم کدی که با اون امتحان کردم::متفکر:


procedure GetControlBmp(AControl : TWinControl;Bmp : TBitmap);
Var
Canvas : TCanvas;
begin
Canvas := TCanvas.Create;
Canvas.Handle := GetDc(AControl.Handle);
Bmp.Width := AControl.Width;
Bmp.Height := AControl.Height;
bmp.PixelFormat :=pf24bit;
Bmp.Canvas.CopyRect(Canvas.ClipRect, Canvas, Canvas.ClipRect);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RichEdit1.Visible:=false;
GetControlBmp(RichEdit1,Image1.Picture.Bitmap);
image1.Refresh;
end;

tdkhakpur
جمعه 16 مهر 1389, 00:10 صبح
ولی اگه RichEdit مخفی باشه باز هم مثل paintTo متن رو توی بیت مپ نمی ریزه و فقط تصویر بدون متن می ریزه

وقتی چیزی دیده نشه canvas کدوم پیکسل رو برای بیت مپ ارسال کنه؟
کاری که میخواید انجام بدید چی هست؟

Felony
جمعه 16 مهر 1389, 00:47 صبح
جناب آقای مجتبی تاجیک عزیز
سلام علیکم و رحمة الله
از لطف و عنایت شما تشکر می کنم.کد شما رو در حدی که فقط مقصودم رو تامین کنه مختصر کردم.
و امتحان کردم. در حال عادی درست کار می کنه ولی اگه RichEdit مخفی باشه باز هم مثل paintTo متن رو توی بیت مپ نمی ریزه و فقط تصویر بدون متن می ریزه!:اشتباه:
این هم کدی که با اون امتحان کردم::متفکر:


procedure GetControlBmp(AControl : TWinControl;Bmp : TBitmap);
Var
Canvas : TCanvas;
begin
Canvas := TCanvas.Create;
Canvas.Handle := GetDc(AControl.Handle);
Bmp.Width := AControl.Width;
Bmp.Height := AControl.Height;
bmp.PixelFormat :=pf24bit;
Bmp.Canvas.CopyRect(Canvas.ClipRect, Canvas, Canvas.ClipRect);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RichEdit1.Visible:=false;
GetControlBmp(RichEdit1,Image1.Picture.Bitmap);
image1.Refresh;
end;

قبل از شروع کار Richedit رو نمایش بدید و در آخر مخفیش کنید .

mbshareat
جمعه 16 مهر 1389, 04:21 صبح
با سلام
با قرار دادن RichEdit در خارج فرم(که یه ScrollBar هم زیر پنجره بیاد) مشکلم حل نشد.
من قبلا امتحان کرده بودم که می شه از Canvas فرم Memo رو کپی گرفت. ظاهرا RichEdit هم همینطوره!
در هر صورت من richEdit رو زیر دکمه بردم تصویر دکمه رو برداشت!

Felony
جمعه 16 مهر 1389, 08:51 صبح
خوب طبیعی هست ، کدی که نوشته شده رو بخون ، تو کد گفته شده که ناحیه Memo یا ... رو روی یک Bitmap رسم کنه ...

در ضمن بعد از ساخت Canvas وظیفه آزاد کردنش با شماست ، نه دلفی .

mbshareat
جمعه 16 مهر 1389, 10:31 صبح
با سلام مجدد
جناب مجتبی تاجیک:تشویق: از توضیحات شما ممنونم.
آیا راهی هست که به نحوی بشه به مقصودم برسم من RichEdit رو زیر نوار وظیفه بردم باز هم کار نکرد.
پس خود ویندوز چطور تصویر رو گم نمی کنه(نکنه هر دفعه متن رو باز سازی می کنه!)
کاری که من می خوام انجام بدم لیست کردن متن چند رنگ هست فکر کنم آخرش خودم باید کادر لیست اختصاصی چند خطه درست کنم!:گیج:
در ضمن آیا FreeAndNil رو می تونیم در مورد بیت مپ خارج از پروسیجر اجرا کنیم؟:متفکر:
چرا Canvas رو Free نکردید؟:متعجب:

Felony
جمعه 16 مهر 1389, 13:21 عصر
پس خود ویندوز چطور تصویر رو گم نمی کنه(نکنه هر دفعه متن رو باز سازی می کنه!)
بله ؛ پس رویدادهای OnPaint کنترل ها در ویندوز چیه ؟


در ضمن آیا FreeAndNil رو می تونیم در مورد بیت مپ خارج از پروسیجر اجرا کنیم؟
باید متغیری که به Bitmap اشاره میکنه سراسری باشه تا در قسمت های دیگه برنامه هم شناخته بشه .


چرا Canvas رو Free نکردید؟
پس این چیه ؟

FreeAndNil(Canvas);

mbshareat
جمعه 16 مهر 1389, 16:51 عصر
سلام علیکم
جناب اقای مجتبی تاجیک
معذرت می خوام در مورد آزادسازی بیت مپ و Canvas کم دقتی کرده بودم!
من معمولا فقط Free می کنم نه FreeAndNil آیا برنامه های قبلیم مشکل سازند؟
در ضمن من برای رنگی کردن اعراب Richedit می خواستم. حالا برنامه نوشتم که متن رو اعراب می ذاره و توی بیت مپ می ریزه بدون دخالت RichEdit !
(اگه لطف کنین این تاپیک (http://barnamenevis.org/forum/showthread.php?t=251824) رو ببینین و نظر بدین ممنون می شم!)