مشکل در هم رنگ کردن پشت زمینه پیکچر باکس بر روی فرم و سایر کنترل ها

mhabat

Member
با سلام.
می خوام کاری کنم شبیه shape که وقتی یک دایره تعریف میشه دیگه یک مستطیل نیست که گوشه هاش رو بی رنگ کرده باشی!

چون من وقتی یک پیکچر باکس رو بی رنگ می کنم ! روی فرم پست زمینه پیکچر باکس بی رنگ هست ولی وقتی که روی کنترل قرار میگیره

اون گوشه هاش میفته بیرون.

میشه کاریش کرد؟

خیلی مهمه برام گیرشم.

یعنی کاری که یک پیکچر باکش پشت زمینش هم روی فرم هم روی کنترل ها و کلا همه جا هم رنگ با چیزی باشه که روش قرار گرفته

ممنون

برای ساخت بازی میخوام .میبینید که یک شی رو حرکت میدند روی اشیائ دیگه ولی تصاویر گوشه هاشون بهم برخورد نمی کنه و پشت زمینه بیرنگشون نمایش داده نمیشه.
 

the_king

مدیرکل انجمن
با سلام.
می خوام کاری کنم شبیه shape که وقتی یک دایره تعریف میشه دیگه یک مستطیل نیست که گوشه هاش رو بی رنگ کرده باشی!

چون من وقتی یک پیکچر باکس رو بی رنگ می کنم ! روی فرم پست زمینه پیکچر باکس بی رنگ هست ولی وقتی که روی کنترل قرار میگیره

اون گوشه هاش میفته بیرون.

میشه کاریش کرد؟

خیلی مهمه برام گیرشم.

یعنی کاری که یک پیکچر باکش پشت زمینش هم روی فرم هم روی کنترل ها و کلا همه جا هم رنگ با چیزی باشه که روش قرار گرفته

ممنون

برای ساخت بازی میخوام .میبینید که یک شی رو حرکت میدند روی اشیائ دیگه ولی تصاویر گوشه هاشون بهم برخورد نمی کنه و پشت زمینه بیرنگشون نمایش داده نمیشه.

کلا نشون دادن یک کنترل شفاف روی سایر کنترل ها جزو خصوصیات ذاتی فرم های ویندوز نیست، باید جزو خصوصیات ذاتی کنترل ها باشه تا درست عمل کنه که
همچین چیزی نیست. راهش اینه که اصلا کنترل نسازید، همه چی رو دستی روی فرم یا داخل یک PictureBox رسم کنید.
 

mhabat

Member
آهان. فکر نمی کردم که منظورم رو متوجه بشین!

آقا یه سوال خوب برای این که بتونم یک عکس رو روی فرم قرار بدم و حرکتش بدمم و... باید چطور عممل کنم؟

باید برم کنترل picture box رو انالیز کنم ببینم چطور عکس رو وارد فرم می کنه؟...!

این که دستی یک شی مثلا عکس رو روی فرم قرار بدم یعنی حله؟..! دیگه روی بقیه کنترل ها اون لبه هاش نشون داده نمیش؟
 

the_king

مدیرکل انجمن
آهان. فکر نمی کردم که منظورم رو متوجه بشین!

آقا یه سوال خوب برای این که بتونم یک عکس رو روی فرم قرار بدم و حرکتش بدمم و... باید چطور عممل کنم؟

باید برم کنترل picture box رو انالیز کنم ببینم چطور عکس رو وارد فرم می کنه؟...!

این که دستی یک شی مثلا عکس رو روی فرم قرار بدم یعنی حله؟..! دیگه روی بقیه کنترل ها اون لبه هاش نشون داده نمیش؟

کد اون پروژه ای که در تاپیک "حرکت کنترل روی فرم ولی با محدودیت مکانی" پیوست کرده بودم رو دیدید؟ اونجا فقط یک Control بود، برای نشون دادن
یک تصویر متحرک یا دایره ها دیگه کنترل دیگه ای ایجاد نشده بود. همه چی در رخداد Paint همون کنترل رسم میشه. دیگه کنترل دیگه ای رویش قرار نمی دهید،
یعنی قرار نیست که کنترل ها روی هم قرار بگیرند. چیزی جز یک فرم یا PictureBox نباید باشه.

در مورد فرم هم همینطوره، فرم هم مثل سایر کنترل ها یک رخداد Paint داره، شما در اون رخداد هر چی که لازم رسم می کنید، ولی فقط رسم می کنید
دیگه نمیایید برای نمایش یک تصویر یک کنترل ایجاد کنید، فقط در اون مختصات دلخواه تصویر رو رسم می کنید. از اونجایی که رسم تصویر می تونه شفاف
و با هر درجه شفافیتی باشه، هیچگونه محدودیتی در شفافیت یا شکل تصاویر ندارید، نتیجه می تونه کاملا شفاف و با گوشه های گرد یا هر شکل دیگری باشه.
 

mhabat

Member
سلام دوباره .

بله من کامپوننتی که معرفی کرده بودین رو بررسی کرده بودم ولی اصلا یاده اون نبودم که چطور روی هم قرار گرفتن!

ایشالله که همیشه زنده باشی و کار مردم رو راه برندازی.

برای این که اسپم نشه:

قضیه این بود که نمیشه به طور مستقیم 2 تا عکس رو روی هم قرار داد به طوری که گوشه های عکس دوم بر روی عکس اول قرار نگیره!

برای این کار میتونید یک usercontrol ساخت و در خاصیت paint آن عکس های مورد نظرتون رو اضافه کنید.

برای اضافه کردن عکس میتونید از تابع DrawImage استفاده کنید.

که شامل 3 پارامتر هست و پارامتر اول عککس رو میگیره و پارامتر دوم و سوم به ترتیب مختصات نقطه xو y رو میگیره.

مثلا:

کد:
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]private[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]void[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] UserControl1_Paint([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]object[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] sender, [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]PaintEventArgs[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] e)[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
        {

            e.Graphics.DrawImage(pictureBox1.Image, 10, 20);

            e.Graphics.DrawImage(pictureBox1.Image, 20, 20);


            

        }
[/SIZE][/FONT][/SIZE][/FONT]

با تشکر فراوان از the_king عزیز.
 

mhabat

Member
سلام. ببخشید یه مشکل کوچیک هستش!
توی رویداد موس move مشخص می کنیم که اگر موس رو ی کنترل کلیلک شده باشه مکان کنترل تغییر کنه!
که برای این کار مکان left و top کنترل رو تغییر میدیم درسته ؟ ولی برای مثال بالا باید چی کار کرد وقتی که ما مشخصات نقطه left رو نداریم؟

من به این شکل عمل کردم ولی وقتی یه بار کنترل رو جابه جا می کنم بار دوم درست جابه جا نمیشه.
مثال:
کد:
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] (CanDrag)[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
            {

                x1 = e.X - location.X;

                Invalidate();

            }
[/SIZE][/FONT][/SIZE][/FONT]
به بیان دیگه چی کار کنم که کد باا به این شکل تغییر کنه؟:
کد:
((Control)sender).Left += e.X - XPosition;

رفرنس:
http://forum.majidonline.com/threads/214534-حرکت-کنترل-روی-فرم-ولی-با-محدودیت-مکانی

من پست رو داخل رفرنس باید میدادم اشتباه کردم.
 
آخرین ویرایش:

mhabat

Member
راستی میشه کار ی کرد که وقتی یک کنترل روی کنترل دیگه قرار گرفت حالت شیشه یی داشته باشه؟

مثل همین بالا ی سایت که رویخط مشکیه که نوشته صفحه اصلی گرافیک دوبعدی گرافیک سه یعدی مالتی میدا

که اسکرول رو که جا به جا می کنی حالت شیشیه یی داره یعنی زیرش که متون هستش رو هم نشون میده.
 

the_king

مدیرکل انجمن
سلام. ببخشید یه مشکل کوچیک هستش!
توی رویداد موس move مشخص می کنیم که اگر موس رو ی کنترل کلیلک شده باشه مکان کنترل تغییر کنه!
که برای این کار مکان left و top کنترل رو تغییر میدیم درسته ؟ ولی برای مثال بالا باید چی کار کرد وقتی که ما مشخصات نقطه left رو نداریم؟

من به این شکل عمل کردم ولی وقتی یه بار کنترل رو جابه جا می کنم بار دوم درست جابه جا نمیشه.
مثال:
کد:
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] (CanDrag)[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
            {

                x1 = e.X - location.X;

                Invalidate();

            }
[/SIZE][/FONT][/SIZE][/FONT]
به بیان دیگه چی کار کنم که کد باا به این شکل تغییر کنه؟:
کد:
((Control)sender).Left += e.X - XPosition;

رفرنس:
http://forum.majidonline.com/threads/214534-حرکت-کنترل-روی-فرم-ولی-با-محدودیت-مکانی

من پست رو داخل رفرنس باید میدادم اشتباه کردم.

در رخداد MouseDown باید ثبت کنید که ماوس در چه منطقه ای بوده، فرضا مختصات 10,30 که باید در متغیر نگهداری بشه.
وقتی ماوس جابجا شد، در رخداد MouseMove موقعیت فعلی ماوس با مختصاتی که در اون متغیر بود اختلاف داره، کنترل مورد نظر شما
باید به اندازه اون اختلاف جابجا بشه، یعنی به اندازه موقعیت جدید منهای موقعیت قبلی داخل متغیر و بعد متغیر بجای اون موقعیت قبلی،
موقعیت فعلی ماوس رو برای جابجای بعدی نگهداری کنه.

راستی میشه کار ی کرد که وقتی یک کنترل روی کنترل دیگه قرار گرفت حالت شیشه یی داشته باشه؟

مثل همین بالا ی سایت که رویخط مشکیه که نوشته صفحه اصلی گرافیک دوبعدی گرافیک سه یعدی مالتی میدا

که اسکرول رو که جا به جا می کنی حالت شیشیه یی داره یعنی زیرش که متون هستش رو هم نشون میده.
صد البته، هر پیکسلی علاوه بر رنگ یک Opacity داره که به اسم A یا Alpha ثبت میشه. اگر اون Alpha از 255 کمتر باشه، عملا نیمه شفاف ئه.

مثال اش هست :

Preview.jpg


مشاهده پیوست Mozilla.zip
 

mhabat

Member
ممنون.

در راستای راهنمایی هاتون مشکل حل و به درستی کنترل جا به جا می شه.

برای خاصیت bringToFront ایده ی خاصی مد نظرتون هست؟

وقتی که روی شئ مورد نظر کلیک شد اون کنترل بیوفته روی کنترل های دیگه.
 

پیوست ها

  • king.PNG
    king.PNG
    3.3 کیلوبایت · بازدیدها: 0

the_king

مدیرکل انجمن
ممنون.

در راستای راهنمایی هاتون مشکل حل و به درستی کنترل جا به جا می شه.

برای خاصیت bringToFront ایده ی خاصی مد نظرتون هست؟

وقتی که روی شئ مورد نظر کلیک شد اون کنترل بیوفته روی کنترل های دیگه.

اگه لیستی از کنترل ها داشته باشید، دو فعالیت مهم براشون هست.
1) رسم 2) پردازش برای رخداد های ماوس
جهت ایندو عملیات برعکس همدیگره، یکی شون لیست رو از ابتدا به انتها پردازش می کنه و دیگری از انتها به ابتدا.
اولین کنترل ای که رسم میشه زیر ترین کنترل ئه و اونی که در آخر رسم میشه همیشه روی سایر کنترل ها است.
برای پردازش رخداد های ماوس لیست بخلاف جهتی که موقع رسم پیمایش می شد پیمایش میشه.
اولین کنترل ای که رسم می شد، آخرین کنترلی ای که موقع پردازش رخداد های ماوس باید بررسی بشه.

BringToBack یا BringToFront ترتیب رسم کنترل ها و ترتیب پردازش شون رو عوض می کنه.

اگه پیمایش برای رسم رو از ابتدا به انتهای لیست در نظر بگیرید، BringToFront کنترل رو از لیست حذف می کنه و به انتهای لیست اضافه می کنه
(کنترل میره انتهای لیست).
 

mhabat

Member
سلام مجدد.

از کد زیر برای رسم بردار استفاده می کنم:
کد:
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]    a = _target.CreateGraphics();

            
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]using[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] ([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Pen[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] p = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Pen[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](_BorderColor, _BorderWidth))[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
            {

                p.EndCap = 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]LineCap[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].ArrowAnchor;[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
                a.DrawLine(p, _StartPoint, _EndPoint);

                rec = 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Rectangle[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](_EndPoint.X, _EndPoint.Y, _BorderWidth, _BorderWidth);[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
            }
[/SIZE][/FONT][/SIZE][/FONT]
خوستم ببینم نظری دارید برای این که چه کاری کنم که اگر کاربر روی نوک بردار کلیک رد متوجه بشیم؟

vector.PNG
 

the_king

مدیرکل انجمن
سلام مجدد.

از کد زیر برای رسم بردار استفاده می کنم:
کد:
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]    a = _target.CreateGraphics();

            
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]using[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] ([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Pen[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] p = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Pen[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](_BorderColor, _BorderWidth))[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
            {

                p.EndCap = 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]LineCap[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].ArrowAnchor;[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
                a.DrawLine(p, _StartPoint, _EndPoint);

                rec = 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]new[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Rectangle[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2](_EndPoint.X, _EndPoint.Y, _BorderWidth, _BorderWidth);[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
            }
[/SIZE][/FONT][/SIZE][/FONT]
خوستم ببینم نظری دارید برای این که چه کاری کنم که اگر کاربر روی نوک بردار کلیک رد متوجه بشیم؟

مشاهده پیوست 107130

جایی که کاربر کلیک می کنه یک نقطه است، اون سر خط هم یک نقطه است، فاصله این دو نقطه رو از هم حساب کنید.
یک محدوده مجاز هم برایش در نظر بگیرید که فرضا در محدوده فاصله کمتر از x پیکسل که شما تعیین کرده اید به عنوان نوک بردار قبول بشه.
 

mhabat

Member
سلام.
من با کد زیر یک بردار رسم کردم که میخوام وقتی روی نوک کلیک شد این خط بتونه تغییر پیا کنه!
کدش رو نوشتم و میشه گفت که کمل هم هست! فقط نمیدونم چرا موقعه کلیلک درست بردار تغیییر پیدا نمی کنه!
مثل سمت چپ میبرم موس رو این سمت راست میره!

از invalidate هم استفاده کردم!

کد:
    private UserControl _target;
        private Point position;
        private bool CanDrag = false;
        public Point EndPoint
        {
            get
            {
                return _EndPoint;
            }
            set
            {
                if (a != null)
                    _target.Invalidate();
                _target.Refresh();
                _EndPoint = value;
                show();
            }
        }
      public void Line_down(object sender, MouseEventArgs e)
        {
            if (Math.Abs(_EndPoint.X - e.Location.X) <= 8 && Math.Abs(_EndPoint.Y - e.Location.Y) < 10)
            {
                position = e.Location;
                CanDrag = true;             
            }            
        }
        public void Line_move(object sender, MouseEventArgs e)
        {
            if (CanDrag)
            {
                _EndPoint.X += (e.Location.X - position.X);
                _EndPoint.Y += (e.Location.Y - position.Y);
                show();
            }
        }
        public void Line_up(object sender, MouseEventArgs e)
        {
            CanDrag = false;
        }
        public void show()
        {
            a = _target.CreateGraphics();
            using (Pen p = new Pen(_BorderColor, _BorderWidth))
            {
                p.EndCap = LineCap.ArrowAnchor;
                a.DrawLine(p, _StartPoint, _EndPoint);
              
            }
        }
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام.
من با کد زیر یک بردار رسم کردم که میخوام وقتی روی نوک کلیک شد این خط بتونه تغییر پیا کنه!
کدش رو نوشتم و میشه گفت که کمل هم هست! فقط نمیدونم چرا موقعه کلیلک درست بردار تغیییر پیدا نمی کنه!
مثل سمت چپ میبرم موس رو این سمت راست میره!

از invalidate هم استفاده کردم!

کد:
    private UserControl _target;
        private Point position;
        private bool CanDrag = false;
        public Point EndPoint
        {
            get
            {
                return _EndPoint;
            }
            set
            {
                if (a != null)
                    _target.Invalidate();
                _target.Refresh();
                _EndPoint = value;
                show();
            }
        }
      public void Line_down(object sender, MouseEventArgs e)
        {
            if (Math.Abs(_EndPoint.X - e.Location.X) <= 8 && Math.Abs(_EndPoint.Y - e.Location.Y) < 10)
            {
                position = e.Location;
                CanDrag = true;             
            }            
        }
        public void Line_move(object sender, MouseEventArgs e)
        {
            if (CanDrag)
            {
                _EndPoint.X += (e.Location.X - position.X);
                _EndPoint.Y += (e.Location.Y - position.Y);
                show();
            }
        }
        public void Line_up(object sender, MouseEventArgs e)
        {
            CanDrag = false;
        }
        public void show()
        {
            a = _target.CreateGraphics();
            using (Pen p = new Pen(_BorderColor, _BorderWidth))
            {
                p.EndCap = LineCap.ArrowAnchor;
                a.DrawLine(p, _StartPoint, _EndPoint);
              
            }
        }

علاوه بر رفع اشکال، کد تون بهینه سازی ساختاری می خواد، به مثال پیوستی مراجعه کنید.

مشاهده پیوست DrawLineArrow.zip
 

mhabat

Member
سلام. با تشکر بابت زحمتی که برای سورس کشیدین.
از سورس زیر برای گرفتن زاویه خط در ربع اول میخوام استفاده کنم ولی خیلی کم دقت هستش:
کد:
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]        
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]public[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]string[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] theta()[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
        {

            
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]double[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] x, y;[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
            
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]double[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] Size = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Math[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].Sqrt([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Math[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].Pow(_startPoint.X - _endPoint1.X, 2) + [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Math[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].Pow(_startPoint.Y - _endPoint1.Y, 2));[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
            
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]for[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] i=0;i<=90;i++)[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
            {

                x = (Size * 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Math[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].Cos(i * [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Math[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].PI / 180) * +1) + _startPoint.X;[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
                y = (Size * 
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Math[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].Sin(i * [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Math[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].PI / 180) * -1) + _startPoint.Y;[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
                
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]if[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] (([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2])x == _endPoint1.X && ([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2])y == _endPoint1.Y)[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
                    
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] i.ToString();[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
            }

            
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]return[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515][FONT=Consolas][SIZE=2][COLOR=#a31515]""[/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][/COLOR][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2];[/SIZE][/FONT][/SIZE][/FONT]
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
        }
[/SIZE][/FONT][/SIZE][/FONT]
 

the_king

مدیرکل انجمن
زاویه یا شیب خط بین دو نقطه فرمول داره، برای محاسبه کردن زاویه از Atan استفاده کنید،
کد زیر برای کل 360 درجه جواب میده :
کد:
                if (pos2.X == pos1.X)
                {
                    angle = (pos2.Y > pos1.Y) ? Math.PI / 2 : -Math.PI / 2;
                }
                else
                {
                    delta = (double)(pos2.Y - pos1.Y) / (double)(pos2.X - pos1.X);
                    angle = Math.Atan(delta);
                    if (pos2.X < pos1.X)
                    {
                        angle += Math.PI;
                    }
                    else if (pos2.Y < pos1.Y)
                    {
                        angle += Math.PI * 2;
                    }
                }
                i = angle * 180 / Math.PI;
 

mhabat

Member
سلام یک سوال مرده می خوام بپرسم!

من داخل فرم دوتا بردار قرار دادم که متناسب بازاویشون و از طریق روش متوازی الاضلاعی برایند رو محابسه می کنه!
داخل فرم یکی از بردار هار و افقی قرار دادم که زاویش صفر هست و قابل تغییر نیست
و بردار دومی توسط کاربر میتونه زاویش تغیر کنه !
(ابتدای 2 بردار روی هم قرار داره!
شکل:
total.PNG
خوب سوالم این هست که میشه با تغییر بردار برایند طول اضلاع رو تغییر داد؟

علم ریاضی که میگه این کار امکان پذیر نیستش!

ولی گفتم شاید شد کاریش کرد؟
 

the_king

مدیرکل انجمن
سلام یک سوال مرده می خوام بپرسم!

من داخل فرم دوتا بردار قرار دادم که متناسب بازاویشون و از طریق روش متوازی الاضلاعی برایند رو محابسه می کنه!
داخل فرم یکی از بردار هار و افقی قرار دادم که زاویش صفر هست و قابل تغییر نیست
و بردار دومی توسط کاربر میتونه زاویش تغیر کنه !
(ابتدای 2 بردار روی هم قرار داره!
شکل:
مشاهده پیوست 107174
خوب سوالم این هست که میشه با تغییر بردار برایند طول اضلاع رو تغییر داد؟

علم ریاضی که میگه این کار امکان پذیر نیستش!

ولی گفتم شاید شد کاریش کرد؟
من که نشنیدم علم ریاضی چیزی بگه، شما دو تا مثلث دارید که در یک ضلع مشترک اند. از آنجایی که یک ضلع مشترک دارند،
محیط چهار ضلعی میشه و کل مجموعه شامل چهار تا نقطه است. برای رسم کل این مجموعه، اطلاعات سه تا نقطه a و b و c کافیه.
مهم هم نیست که کدوم سه نقطه رو در نظر بگیرید، چون به هر حال نقطه چهارم همیشه قابل محاسبه است.
یعنی عملا فرقی بین نقاط این مثلث و اون مثلث نیست، برایند و غیر برایند نداره، فقط فرمول محاسبه نقطه چهارم عوض میشه.
حالا شما می خواهید مجموعه تغییر کنه؟ یکی از اون سه نقطه رو جابجا کنید و نقطه چهارم رو از نو محاسبه کنید، به همین سادگی.
 

mhabat

Member
سلام مجدد.
شکل زیر رو مشاهده بکنید!
ما نقطه ی a مون رو ثابت گرفتیم و مختصاتش رو هم داریم!
خوب حالا هنگاهی که مختصات نقطه ی d رو تغییر میدیم!
مختصاتش رو که داریم ! مختصات نقطه ی a هم داریم حالا دو تا نقطه اینجا مجهول میشه نه یک نقطه ...!
t.PNG
این که گفتم ریاضی می گه واسه این بود که ما فرمول
زیر رادیکال:
کد:
A^2+b^2+2*A*B*Cos(theta)=total
رو داریم که مقدار total و زاویه رو داریم که اینجا َA, B مجهول می باشند ! و میشه گفت که قابل حل نیست!
ولی فکر کنم منظورتون رو من خوب متوجه نشدم !
 

the_king

مدیرکل انجمن
سلام مجدد.
شکل زیر رو مشاهده بکنید!
ما نقطه ی a مون رو ثابت گرفتیم و مختصاتش رو هم داریم!
خوب حالا هنگاهی که مختصات نقطه ی d رو تغییر میدیم!
مختصاتش رو که داریم ! مختصات نقطه ی a هم داریم حالا دو تا نقطه اینجا مجهول میشه نه یک نقطه ...!
مشاهده پیوست 107181
این که گفتم ریاضی می گه واسه این بود که ما فرمول
زیر رادیکال:
کد:
A^2+b^2+2*A*B*Cos(theta)=total
رو داریم که مقدار total و زاویه رو داریم که اینجا َA, B مجهول می باشند ! و میشه گفت که قابل حل نیست!
ولی فکر کنم منظورتون رو من خوب متوجه نشدم !
این تصویر شما میگه بردار ad برایند بردار ab و ac است. اون ac شما هم طبق فرض خودتان (که در فرمول تان هم هست) همیشه در راستای محور افقی ئه.
غیر از اینه؟ اگر برداری در راستای محور افقی به نام B و بردار A با زاویه x نسبت به B داشته باشیم، برایند شان بردار C است :

vector.jpg


شما ابتدا یک A و یک B ای داشته اید که C برایند اونها است، وگرنه بی نهایت A و B ای وجود دارند که زاویه شون با هم x ئه و برایند شون هم C ئه،
حساب کردن شون هم خیلی ساده است. محض نمونه شما A و B را برابر هم فرض کنید، فرمول میشه با یک مجهول A (یا B) که به سادگی قابل حل کردنه.
حالا شما کل چیز هایی که مجهول نیستند رو بنویسید و از اون مهمتر مشخص کنید که هدف محاسبه چه مجهولیه.
 

جدیدترین ارسال ها

بالا