رسم یک Polygon به عنوان یک Object در ویژوال بیسیک

margeGole

New Member
سلام دوستان

بنده دارم روی یه پروژه نسبتا سنگین کار می کنم. قصد ساخت یه نرم افزار نقشه کشی رو دارم. اینا رو گفتم تا متوجه بشین هدفم چیه.
خب بریم سر سوال بنده :

بنده با کد زیر یه Polygon (چند ضلعی) می سازم :

کد:
Private Type POINTAPI
    X As Long
    Y As Long
End Typerivate Declare Function Polygon Lib "gdi32.dll" (ByVal hDC As Long, ByRef lpPoint As POINTAPI, ByVal nCount As Long) As Long
Private Declare Function Ellipse Lib "gdi32.dll" (ByVal hDC As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hWnd As Long, ByVal hDC As Long) As Long
Private Declare Function GetDesktopWindow Lib "user32.dll" () As Long
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Private Sub Command1_Click()
    Dim Points(0 To 4) As POINTAPI
    Points(0).X = 40
    Points(0).Y = 250
    Points(1).X = 250
    Points(1).Y = 200
    Points(2).X = 530
    Points(2).Y = 200
    Points(3).X = 200
    Points(3).Y = 160
    Points(4).X = 100
    Points(4).Y = 200
    Polygon Picture1.hDC, Points(0), 5
    Picture1.Refresh
End Sub

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

چطور می تونیم این Polygon رو به عنوان یک آبجکت با موس Select کنیم و رنگش رو عوض رو کنیم ؟ و یا جابجاش کنیم ؟ توجه داشته باشین که روی صفحه ی ما مثلا دو سه تا از این Polygon ها هست و برنامه ی من باید این Polygon ها رو از هم تشخیص بده. چون قرار هر یک از این Polygon های رسم شده یه سری اطلاعات رو در خودش جا بده.:cry:
ممنونم.
 

the_king

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

کل کارم لنگ اینه !:cry:

اینجوری بخواهید خلاف قوانین فروم عمل کنین تاپیک رو می بندم ها، در فروم برای پاسخگویی باید صبور باشید :

C7 - پیش از پاسخگویی سایر کاربران به آخرین پاسخی که خودتان ایجاد کرده اید پاسخی ندهید.
برای بالا آوردن مبحثی که خودتان ایجاد کرده اید پاسخ های بی مورد ارسال نکنید، برای دریافت کردن پاسخ از سایر کاربران باید صبور باشید. ارسال کردن مطالب بی مورد و اضافی اسپم محسوب شده و ممنوع است.

نوشتن کل کد در یک Module یا Form مناسب برنامه های کوچیک و ساده است، اگر بخواهید برنامه بزرگتری بنویسید
حتما باید با کلاس سازی و یا ماژول سازی کد برنامه رو تقسیم کنید وگرنه اونقدر پیچیده میشه که سردرگم خواهید شد.

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

attachment.php


در داخل کد خود فرم فقط کد هایی نوشته میشه که مربوط به مدیریت ماوس و مجموعه Polygon ها است.
الان این نمونه کدی که ساختم هم می تونه خود چند ضلعی ها رو جابجا کنه و هم نقاط شون رو، یعنی شکل
چند ضلعی رو عوض کنه. همینطور چند ضلعی رو یکجا حذف کنه و یا فقط یک نقطه خاص رو حذف کنه.
کافیه ماوس رو داخل چند ضلعی یا روی نقاط اش ببرید تا عکس العملش رو ببینید.

کد کامل پروژه به همراه فایل اجرایی exe ضمیمه این پست می باشد.
 

پیوست ها

  • Preview.gif
    Preview.gif
    6.8 کیلوبایت · بازدیدها: 15
  • Polygon.rar
    14.8 کیلوبایت · بازدیدها: 12
  • Polygon.zip
    18.9 کیلوبایت · بازدیدها: 9
آخرین ویرایش:

margeGole

New Member
آقا این کلاسی که بهم دادی خیلی کامله بود و من یه چندتا مورد دیگه هم بهش اضافه کردم ، تقریبا موتور اصلی کارم راه افتاده. فقط یه سوال دیگه ، اینطور که من متوجه شدم این کلاس فقط قابلیت رسم اشکالی رو داره که از قبل ما نقاطش رو بهش داده باشیم. پس با این حساب ما با موس نمی تونیم Polygon رو رسم کنیم. واسه این مورد چه راه حلی داری ؟ درضمن میشه خطوطی هم رسم کرد که قابلیت تغییر رنگ و جابجایی داشته باشن ؟
 

the_king

مدیرکل انجمن
آقا این کلاسی که بهم دادی خیلی کامله بود و من یه چندتا مورد دیگه هم بهش اضافه کردم ، تقریبا موتور اصلی کارم راه افتاده. فقط یه سوال دیگه ، اینطور که من متوجه شدم این کلاس فقط قابلیت رسم اشکالی رو داره که از قبل ما نقاطش رو بهش داده باشیم. پس با این حساب ما با موس نمی تونیم Polygon رو رسم کنیم. واسه این مورد چه راه حلی داری ؟ درضمن میشه خطوطی هم رسم کرد که قابلیت تغییر رنگ و جابجایی داشته باشن ؟

اشتباه نکنید، وظایف کلاس Polygon ارتباطی با ماوس نداره، ساختن چند ضلعی با ماوس یا هر عملیات دیگه ای
که با ماوس انجام میشه در Form انجام میشه، نه کلاس Polygon
زمانی که شما هنوز چند ضلعی رو بطور کامل رسم نکرده اید هنوز چند ضلعی ایجاد نشده که ربطی به Polygon
داشته باشه، در ضمن Polygon که نمی تونه روی جابجا شدن ماوس مدیریتی داشته باشه، اینها در کد های فرم
باید انجام بشه.

تغییر رنگ که پیاده سازی اش راه حل آسونی داره، الان کلاس Polygon هم مشخصه ForeColor داره برای رنگ خطوط
و هم مشخصه FillColor برای رنگ پر کردن داخلش. با False کردن مشخصه Fill می توانید کلا داخل چند ضلعی رو
رنگ نکنید و خالی نگه دارید. پس الان کلاس Polygon همه موارد لازم برای تغییر رنگ رو داره.

شما الان دو ابزار رو فرم دارید، یکی برای جابجا کردن و یکی برای حذف کردن. کافیه که یک کنترل Option جدید،
با نام Option3 رو کنار اون دو تا ابزار Option1 و Option2 ایجاد کنید که مثلا با تصویر سطل رنگ برای رنگ آمیزی بکار بره.
هر زمانی که Option3.Value برابر True بود یعنی ابزار سطل رنگ انتخاب شد با کلیک کردن روی چند ضلعی مورد نظر
Polygons(PolygonIndex).FillColor یا Polygons(PolygonIndex).ForeColor رو به رنگ دلخواه تغییر بدهید و مجددا
تابع Repaint رو اجرا کنید تا تغییر رنگ مشاهده بشه.

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

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

پیوست ها

  • Polygon2.zip
    28.4 کیلوبایت · بازدیدها: 6
  • Polygon2.rar
    20.3 کیلوبایت · بازدیدها: 6

margeGole

New Member
ایولله ، حالا متوجه شدم که چی می گی ، دمت گرم ، چیزای خوبی دستگیرم شدم.

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

the_king

مدیرکل انجمن
ایولله ، حالا متوجه شدم که چی می گی ، دمت گرم ، چیزای خوبی دستگیرم شدم.

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

اینا که کل نداره که، اون دو تای آخر رو با سرویس جستجوی تصویر گوگل پیداشون کردم، کنار هم که نبودند.
قبلی ها و Cursor ها رو هم خودم با AniFX طراحی کردم.
 

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

بالا