PDA

View Full Version : کشیدن عکس روی Canvas



reza_king_sh
سه شنبه 07 مهر 1388, 23:02 عصر
با سلام. می خواستم بدونم چه طوری میشه روی کنوس یک لیبل یک عکس رسم کرد . من از این کد استفاده کردم ولی وقتی لیبل رو جابجا می کنم ، هر چی روشه پاک میشه!




Label1.Canvas.Draw(0,0,image1.Picture.Graphic);


با سپاس فراوان.

vcldeveloper
چهارشنبه 08 مهر 1388, 05:14 صبح
من از این کد استفاده کردم ولی وقتی لیبل رو جابجا می کنم ، هر چی روشه پاک میشه!
چون وقتی آن را جابجا می کنید، خودش را مجددا رسم میکنه. وقتی که داره خودش را رسم میکنه، خبر نداره که شما روش نقاشی کردید، در نتیجه رسم شما پاک میشه.

می تونید رسم را در متد Paint کنترل مربوطه انجام بدید. هر زمان که نیاز به رسم کنترل باشه، این متد فراخوانی میشه، و اگر شما کدی در آن داشته باشید، اجرا میشه.

reza_king_sh
چهارشنبه 08 مهر 1388, 15:03 عصر
می تونید رسم را در متد Paint کنترل مربوطه انجام بدید.
مگه لیبل متد Paint داره!!
میشه با مثال بگید.

tdkhakpur
چهارشنبه 08 مهر 1388, 22:46 عصر
مگه لیبل متد Paint داره!!
میشه با مثال بگید.
چرا ندارد!
لیبل جزو فرزند اصیل یک فرم به حساب می آید مانند سایر کنترلها که برای خودشان یک هندل مخصوص دارند نیست هرچند که آنها هم به نوعی فرزند خوانده فرم به حساب می آیند.
برای این کار شما باید به پدر لیبل یا همان فرم رجوع کنید و paint شدن آنرا از فرم درخواست کنید یعنی اجرای event مخصوص onPaint همان ترسیم مجدد لیبل را در بر دارد..

reza_king_sh
پنج شنبه 09 مهر 1388, 09:03 صبح
برای این کار شما باید به پدر لیبل یا همان فرم رجوع کنید و paint شدن آنرا از فرم درخواست کنید یعنی اجرای event مخصوص onPaint همان ترسیم مجدد لیبل را در بر دارد..
منظورتون اینه که همون کدی رو که قبلاً مینوشتم تو ایونت OnPaint فرم بنویسم؟ خوب من این کارو کردم. ولی وقتی عکسو جابجا می کنم. بازم عکس روش پاک میشه.

tdkhakpur
پنج شنبه 09 مهر 1388, 13:52 عصر
منظورتون اینه که همون کدی رو که قبلاً مینوشتم تو ایونت OnPaint فرم بنویسم؟ خوب من این کارو کردم. ولی وقتی عکسو جابجا می کنم. بازم عکس روش پاک میشه.
سلام
نه دیگه این عملیان مثل این میماند که شما استاندارد یک عمل را دستکاری میکنید. OnPaint فقط مواقعی شروع به کار میکند که سیستم احتیاج دارد مجددا کنترلها را ترسیم کند ولی شما دارید فقط لیبل را تغییر مکان میدهد نه خود فرم را .. در صورتی که در بالا هم یادآور شدیم که لیبل فرزند و یا میتوانید بگویید که قسمتی از فرم به حساب می آید.
شما برای اینکه مشکلتان حل شود بعد از هر کاری با لیبل فرم را repaint کنید و یا یک لیبل شخصی برای خودتان طراحی کنید..

reza_king_sh
پنج شنبه 09 مهر 1388, 18:07 عصر
با تشکر از شمایی که مطلب رو پیگیری می کنی.
اینکه من بخوام هر جا لیبل رو دستکاری می کنم یه بار این رویداد رو فراخوانی کنم، که منطقی نیست. خیلی جاها هست که دستکاری می کنمش یا اصلاً خیلی از جاها دستکاری میشه و من نمی فهمم.
اما در مورد راه حل دوم که منطقی تر هم هستف من سعی کردم یه چنین کاری بکنم. یعنی یه کامپوننت جدید که خصوصیات لیبل رو به ارث ببره و علاوه بر اون یه رویداد به نام OnPaint مثل فرم ها داشته باشه. من برای این کار یه لیبل جدید از کلاس Tlabel ساختم. بعد نمی دونستم تو فایل .pas اون چی بنویسم که چنین ایونتی بهش اضافه بشه. البته در قسمت pablish کد زیر رو نوشتم.


property OnPaint;

ولی خوب کامپایل نمیشد و می گغت که در این کلاس چنین پروپرتی تعریف نشده. فکر می کنم ای کار کافی نیست.حالا اگه امکانش هست که بهم بگید که چطور باید این کار رو بکنم که خیلی ممنون میشم. و گرنه یه لینکی ، PDFی ، یه کدی یا یه چیزی که بتونه کمکم کنه. با سپاس فراوان.

tdkhakpur
پنج شنبه 09 مهر 1388, 19:24 عصر
نه شما باید تابع ترسیم کننده label را به تابع خودتان تغییر بدید


procedure NewWndProc(var Message: TMessage);
begin
if Message.Msg = WM_PAINT then
begin
// کار های مربوطه
end
else
WndProc(Message);
end;

// یعنی با کد زیر مسیر را به تابع خودتان تغییر مکان
WindowProc = newProc;