تبليغاتX
جادوي سي شارپ

پاسخ به سوالات:


  • برای اجرای یه برنامه دیگه از داخل برنامه خودتون می تونید از کلاس Process استفاده کنید. این کلاس یه متد به نام Start داره که با استفاده از حالتهای مختلف اون می تونید به انواع و اقسام روشها برنامه هاتونو اجرا کنید. به عنوان مثال کد زیر برنامه ماشین حساب ویندوز را اجرا می کنه:

System.Diagnostics.Process.Start("Calc.exe");

  • برای دسترسی به یک شی توی یه Form دیگه می تونی خاصیت Modifiers اونو به Public مقداردهی کنید.
  • متاسفانه وجود نداشتن فایل راهنما هیچ Exceptionی تولید نمی کنه. برای اطمینان از وجود فایل Help در مسیر مربوطه می تونید از کد زیر استفاده کنید:

try
{
     if (System.IO.File.Exists(strPath))
          Help.ShowHelp(this, strPath);
     else
          throw new System.IO.FileNotFoundException();
}
catch (Exception ex)
{
     MessageBox.Show(ex.Message);
}


آقای محمدی عزیز لطفا در مورد سوالتون بیشتر توضیح بدید. در حالت عادی یا با استفاده از Reflection؟

گرافیک در .NET – رنگها
خیلی سریع میریم سر اصل موضوع.
رنگها در .NET از ساختمان داده Color استفاده می کنن. در سیستم RGB هر رنگ با 4 مولفه شناخته می شود که عبارتند از: A و R و G و B
A:میزان شفافیت رنگ را مشخصص می کند
R:مولفه رنگ قرمز
G:مولفه رنگ سبز
B:مولفه رنگ آبی

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

btnColorTest.BackColor = Color.Aqua;

لیست این رنگها و نامهای اونا رو در شکل زیر می بینید: (این شکلها رو از سایت BobPowel.Net کش رفتم)


یه سری دیگه از رنگها هستن که به رنگهای سیستمی معروفند. اینها رنگهایی هستن که در سیستم عامل استفاده شدن مثل رنگ کلیدها، رنگ Border ها و .... برای استفاده از این رنگها باید از کلاس SystemColors استفاده کنیم. این رنگها هم با استفاده از نام آنها قابل دسترسی هستن. به مثال زیر توجه کنید:

btnColorTest.ForeColor = SystemColors.InactiveBorder;

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


ساختمان داده Color یه متد خیلی مهم داره به نام FromArgb که با استفاده از اون می تونید رنگ دلخواهتونو بسازید. این متد حالتهای مختلفی داره. پارامترهای مهم اون عبارتند از : میزان Alpha و مولفه های RGB.

مثال: در مثال زیر 100 شکل که مشخصات هر کدام بصورت تصادفی انتخاب میشن رسم میشه:

private void frmMain_Paint(object sender, PaintEventArgs e)
{
     Random rnd = new Random();
     Graphics gr=e.Graphics;
     Point[] points=new Point[5];
     points[0].X = rnd.Next(this.ClientRectangle.Width);
     points[0].Y = rnd.Next(this.ClientRectangle.Height);
     points[1].X = rnd.Next(this.ClientRectangle.Width);
     points[1].Y = rnd.Next(this.ClientRectangle.Height); 
     points[2].X = rnd.Next(this.ClientRectangle.Width);
     points[2].Y = rnd.Next(this.ClientRectangle.Height); 
     points[3].X = rnd.Next(this.ClientRectangle.Width);
     points[3].Y = rnd.Next(this.ClientRectangle.Height); 
     points[4].X = rnd.Next(this.ClientRectangle.Width);
     points[4].Y = rnd.Next(this.ClientRectangle.Height); 

     for (int i = 0; i < 100;i++) 
     { 
          SolidBrush solidBrush=new SolidBrush(Color.FromArgb(rnd.Next(255),
               rnd.Next(255),
               rnd.Next(255),
               rnd.Next(255)));
          int shapeCode=rnd.Next(3); 
          switch(shapeCode) 
          { 
               case 0: //Draw Rectangle 
                    gr.FillRectangle(solidBrush,
                         rnd.Next(this.ClientRectangle.Width), 
                         rnd.Next(this.ClientRectangle.Height), 
                         rnd.Next(this.ClientRectangle.Width),
                         rnd.Next(this.ClientRectangle.Height)); 
                    break; 
               case 1: 
                    gr.FillEllipse(solidBrush,
                         rnd.Next(this.ClientRectangle.Width), 
                         rnd.Next(this.ClientRectangle.Height), 
                         rnd.Next(this.ClientRectangle.Width),
                         rnd.Next(this.ClientRectangle.Height)); 
                    break; 
               case 2: 
                    gr.FillPie(solidBrush, 
                         rnd.Next(this.ClientRectangle.Width),
                         rnd.Next(this.ClientRectangle.Height), 
                         rnd.Next(this.ClientRectangle.Width), 
                         rnd.Next(this.ClientRectangle.Height),
                         rnd.Next(180),rnd.Next(180)); 
                    break; 
               case 3: 
                    gr.FillPolygon(solidBrush,points);
                    break; 
          } 
          solidBrush.Dispose(); 
     }
}


البته ما در مورد Brush هنوز هیچ صحبتی نکردیم و بحث در مورد اونو به آینده موکول می کنیم. در مورد رنگها در .NET تنها نکته ای که میمونه اینه که بعضی از متدهای مورد استفاده در GDI+ رنگ یک نقطه را بصورت GBR یا GRB (دقیقا یادم نیست) به شما می دهند که بعضی وقتا این ممکنه کمی حالتونو بگیره. موقعش که شد در مورد این متدها صحبت خواهیم کرد.

منابع:
  • http://www.BobPowel.net
  • Pro .NET 2.0 Graphics Programming - by Eric White
  • + نوشته شده در  سه شنبه بیستم شهریور 1386ساعت 19:57  توسط ققنوس  | 
    پاسخ به سولات
    عمار عزیز از لطف شما ممنونیم. ما همه سعی خودمونو می کنیم که سر وقت Update کنیم ولی گرفتاریها اجازه نمیده.
    به همه دوستان علاقمند به پردازش تصاویر (Image Proccessing) پیشنهاد می کنم حتما این مقاله و سورس مربوط به اونو مطالعه کنن:

    http://www.codeproject.com/cs/media/Image_Processing_Lab.asp



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

    * Color filters (grayscale, sepia, invert, rotate, channel extraction, channel replacing, channel filtering, color filtering, Euclidean color filtering)
    * HSL filters (linear correction, brightness, contrast, saturation, hue modifier, HSL filtering)
    * YCbCr filters (linear correction, YCbCr filtering, channel extraction/replacement)
    * Binarization filters (threshold, threshold with carry, ordered dithering, Bayer dithering, Floyd-Steinberg, Burkes, Jarvis-Judice-Ninke, Sierra, Stevenson-Arce, Stucki dithering methods)
    * Automatic binarization (simple image statistics)
    * Mathematical morphology filters (erosion, dilatation, opening, closing, hit & miss, thinning, thickening)
    * Convolution filters (mean, blur, sharpen, edges, Gaussian)
    * 2 Source filters (merge, intersect, add, subtract, difference, move towards, morph)
    * Edge detectors (homogeneity, difference, sobel, canny)
    * Blob counter, Connected components labeling
    * Pixellate, Simple skeletonization, Jitter, Shrink, Oil painting
    * Levels linear filter, gamma correction
    * Median filter, Adaptive smoothing, Conservative smoothing
    * Resize and Rotate
    * Texture generators based on Perlin noise
    * Texture filters (texturer, textured filtering, textured merging)
    * Fourier transformation (lowpass and hipass filters).


    احتمالا این بخش اول از سری مقالات گرافیک در .NET خواهد بود.

    GDI+
    GDI+ در اصل به کتابخانه کلاسهایی میگن که در ویندوز XP و بعد از اون برای گرافیک عرضه شد. این کتابخانه بصورت Unmanaged نوشته شده. در .NET برای ترسیمات گرافیکی، یک لایه بالاتر (Wrapper) برای اون ساختن (همون System.Drawing).

    ترسیمات گرافیکی در .NET
    در .NET برای همه ترسیمات گرافیکی باید از کلاس Graphics استفاده کنید. این کلاس مثل بوم نقاشی شماست (قابل توجه اونایی که اهل هنر نیستن: بوم نقاشی همون تخته ایه که سه پایه داره و تو فیلما می بینید که با قلم مو روش نقاشی می کنن).
    مراحل قدم به قدم یک پروژه گرافیکی ساده:
    1- یک پروژه از نوع Windows Application بسازید.
    2- در بخش نمایش کد به گرداننده رویداد (Event Handler) مربوط به Form_Load برید. در واقع این یه نکته انحرافیه و ما اینجا هیچ کاری نداریم چون کدی که در این قسمت نوشته میشه قبل از نمایش فرم اجرا میشه و اگه در این بخش کد مربوط به ترسیمات رو بنویسیم بعد از نمایش فرم پاک میشه مگر اینکه ....
    3- گرداننده رویداد Form_Paint را بیارید و کد زیر رو توش بنویسید:

    private void frmMain_Paint(object sender, PaintEventArgs e)
    {
         Graphics gr = e.Graphics;
         gr.DrawRectangle(Pens.Azure, new Rectangle(5, 5, 100, 100));
    }

    این کد یک چهارضلعی روی فرم رسم می کند. ابتدا شی ای از کلاس Graphics تعریف کردیم. هر رویداد Paint متعلق به هر کلاسی که باشه یک پارامتر از نوع PaintEventArgs برمی گردونه که یکی از خواص اون یک کپی از Graphics همون شی ایه که می خواهیم ترسیماتو روی اون انجام بدیم. بنابراین شی Graphics خودمونو برابر با شی Graphics پارامتر e قرار میدیم.
    شی Graphics متدهای زیادی برای ترسیمات مختلف داره که در اینجا برای رسم یک چهارضلعی از متد DrawRectangle استفاده کردیم. معمولا متدهای شی Graphics هر کدوم چندین حالت دارند که با توجه به نیاز، حالت مورد نظرتونو انتخاب می کنید. فقط یه نکته بگم اونم اینه که اگه می خواید بعدا برنامتونو روی پلتفرم Windows Mobile منتقل کنید حالتهایی از متدها رو انتخاب کنید که در هر دو پشتیبانی میشه.
    در اینجا ما از یک قلم با تنظیمات پیش فرض و رنگ Azure استفاده کردیم. برای اینکه بتونیم شکلمونو با قلم دلخواه رسم کنیم می تونیم مثل مثال زیر عمل کنیم (این کدها رو در ادامه کد قبلی بنویسید) :

         Pen myPen = new Pen(Color.Red, 5);
         gr.DrawPie(myPen, new Rectangle(150, 100, 70, 50), 30, 135);

    در این مثال یه قلم با رنگ قرمز و صخامت 5 تعریف کردیم و بعد با استفاده از این قلم و فراخوانی متد DrawPie بخشی از یک دایره رو رسم کردیم. متد DrawPie برای ترسیم تمام و یا بخشی از یک دایره استفاده میشه.
    + نوشته شده در  شنبه دهم شهریور 1386ساعت 18:45  توسط ققنوس  |