نمایش نتایج 1 تا 30 از 30

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

  1. #1

    ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    با سلام دوستان من میخام با رویداد paint فرم یه کادر مستطیلی طراحی کنم و داخل فرمم یه تکست باکس بزارم و کاربر زمانی که داخل تکست باکس متنی رو تایپ میکنه اندازه کادر طراحی شده براساس طول ، سایز و قالب بندی رشته تغییر پیداکند و متن داخل باکس نمایش داده شود دوستان ممنون میشم راهنمایی بفرمایید

  2. #2

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط arastoahmadi مشاهده تاپیک
    با سلام دوستان من میخام با رویداد paint فرم یه کادر مستطیلی طراحی کنم و داخل فرمم یه تکست باکس بزارم و کاربر زمانی که داخل تکست باکس متنی رو تایپ میکنه اندازه کادر طراحی شده براساس طول ، سایز و قالب بندی رشته تغییر پیداکند و متن داخل باکس نمایش داده شود دوستان ممنون میشم راهنمایی بفرمایید
    با Graphics.MeasureString و TextRenderer.MeasureText ابعاد متن رو محاسبه می کنند. یک وقت هست که طول کادر ثابت ئه و باید صرفا ارتفاع کادر متغیر باشه و محاسبه بشه.
    f1.png
    در اینصورت اگر طول سطر طولانی باشه باید شکسته بشه به سطر های بعد :
    f2.png
    اما یک وقت هست که طول و عرض هر دو متغیر ئه و هر دو باید محاسبه بشه :
    f3.png

    TextSize.rar

  3. #3

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

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

  4. #4

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط arastoahmadi مشاهده تاپیک
    ممنون از پاسختون دوست گرامی حالا من میخام یه کار دیگه ای انجام بدم و اونم اینه که اگه حالت FixedWidth رو انتخاب کردم در این صورت ظولش تغییر میکنه و اگه متنم طولانی بشه چون اندازه فرممم هیچ تغییری نمیکنه مابقی متنو نمیتونم ببینم در این حالت باید چکار کرد . بعد اگه بخام به جای مستطیل یه کادر بالونی بزارم باید چکار کنم
    اگه طول کادر ثابت نباشه، ممکنه اونقدر متنی طولانی بشه که رسم از فرم بزنه بیرون و باقیش دیده نشه، پس یا باید متن در رسم Word Wrap بشه و بقیه نوشته شکسته بشه در سطر های بعدی و یا رسم طولانی بمونه اما با اضافه کردن ScrollBar اجازه Scroll شدنش رو بدید.
    هر چیز دیگری هم که بخواهید پشت متن رسم کنید فقط باید قبل از رسم متن انجام بشه، می توانید قبل از رسم متن هر چیزی رسم کنید و در انتها متن رو رویش رسم کنید.
    f4.png
    TextSize2.rar

  5. #5

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

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


  6. #6

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم


  7. #7

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط arastoahmadi مشاهده تاپیک
    ممنون از پاسختون دوست عزیز ، من یه گرید ویو تو فرمم دارم میخام یه چیزی شبیه این بشه ولی متاسفانه تو این زمینه من اطلاعاتی ندارم

    طبعا برای یادگیری پیاده سازی هر چیزی باید بصورت جزء به جزء پیش برید، یکدفعه از DataGridView به ChatBox نمیشه رسید.
    DataGridView برای این منظور چندان مناسب نیست، ListBox بهتره،
    ListBox یک مشخصه DrawMode داره که در حالت OwnerDrawFixed رسم اش رو خودتون انجام می دهید ولی ارتفاع آیتم ها یکسان ئه و در حالت DrawMode ئه OwnerDrawVariable رسم رو خودتون انجام می دهید و ارتفاع هر آیتم متفاوت ئه (مثل همین مثال چت).
    ListBox یک رخداد MeasureItem داره که در حالت OwnerDrawVariable از برنامه نویس میپرسه که عرض این آیتم فلان باید چقدر باشه و اونجا ابعاد رو بر حسب محتویاتش محاسبه می کنید.

  8. #8

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    بازم ممنون از پاسختون عزیز ، دوست گرامی مثال از این لیست باکس دارید ؟

  9. #9

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط arastoahmadi مشاهده تاپیک
    بازم ممنون از پاسختون عزیز ، دوست گرامی مثال از این لیست باکس دارید ؟
    روال کار خیلی مشخص ئه، در DrawItem اون آیتمی که ListBox میخواد الان نشون بده رو در جایی که ListBox بهمون میگه رسم می کنیم و در MeasureItem ابعاد آیتمی که ListBox میخواد ابعادش رو بدونه مشخص می کنیم.

    private void button1_Click(object sender, EventArgs e)
    {
    listBox1.Items.Add(new object[] { textBox1.Text, DateTime.Now });
    textBox1.Text = "";
    textBox1.Focus();
    }

    private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
    {
    if ((e.Index < 0) || (e.Index >= listBox1.Items.Count))
    {
    return;
    }
    var item = (object[])listBox1.Items[e.Index];
    var text = (string)item[0];
    var date = (DateTime)item[1];
    var format = new StringFormat (StringFormat.GenericDefault);
    format.FormatFlags |= StringFormatFlags.NoClip | StringFormatFlags.DirectionRightToLeft;
    format.Trimming = StringTrimming.None;
    var size = Size.Round( e.Graphics.MeasureString (text, listBox1.Font, listBox1.ClientSize.Width - 20, format));
    size.Width = Math.Max(30, size.Width);
    var rect = new Rectangle(e.Bounds.Right - size.Width - 20, e.Bounds.Top, size.Width + 18, size.Height + 20);
    var renderer = new VisualStyleRenderer (VisualStyleElement.ToolTip.Balloon.Normal);
    renderer.DrawBackground(e.Graphics, rect);
    rect.Inflate(-5, -5);
    e.Graphics.DrawString(text, listBox1.Font, Brushes.Black, rect, format);
    format.LineAlignment = StringAlignment.Far;
    rect.Offset(0, 3);
    using (var font = new Font(listBox1.Font.FontFamily, listBox1.Font.SizeInPoints - 2f))
    {
    e.Graphics.DrawString(date.ToString("HH:mm"), font, Brushes.Gray, rect, format);
    }
    }

    private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
    {
    var item = (object[]) listBox1.Items[e.Index];
    var text = (string)item[0];
    var date = (DateTime)item[1];
    var format = new StringFormat( StringFormat.GenericDefault);
    format.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
    format.Trimming = StringTrimming.None;
    var size = Size.Round(e.Graphics.MeasureString (text, listBox1.Font, listBox1.ClientSize.Width - 20, format));
    e.ItemHeight = size.Height + 22;
    }


    f6.png

    ChatBoxSample.rar

  10. #10

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    سلام سپاس بی کران از شما دوست عزیز آیا کلاس VisualStyleRendere ماهیتش نمایش آیتم های لیست ویو در قالب کنترل های پیش فرض ویژوال استودیو هستش یا علاوه بر نمایش میتونیم از کنتزل ها مثل خود کنترل های ویژوال استودیو استفاده کنیم آیا اینجام هم میتونیم اینکارو بکنیم
    آخرین ویرایش به وسیله arastoahmadi : چهارشنبه 31 اردیبهشت 1399 در 09:47 صبح

  11. #11

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط arastoahmadi مشاهده تاپیک
    سلام سپاس بی کران از شما دوست عزیز آیا کلاس VisualStyleRendere ماهیتش نمایش آیتم های لیست ویو در قالب کنترل های پیش فرض ویژوال استودیو هستش یا علاوه بر نمایش میتونیم از کنتزل ها مثل خود کنترل های ویژوال استودیو استفاده کنیم آیا اینجام هم میتونیم اینکارو بکنیم
    VisualStyleRenderer به ویژوال استدیو کاری نداره، برای یک کنترل خاص هم نیست، هر چی کنترل استاندارد در Visual Styles ویندوز تعریف شده رو میتونه رسم کنه.

    ویندوز یک سیستم واسط کاربر گرافیکی داره به اسم Windows Visual Styles که همه کنترل ها با یک Theme نمایش داده میشن و تا یک Theme جدید برایش انتخاب می کنید ظاهر همه کنترل ها در ویندوز عوض میشه. این VisualStyleRenderer موتور رسم همون Visual Styles ئه، با همون Theme ای که کنترل های استاندارد رسم میشن برای شما هم چیزی رو که میخواهید رسم می کنه. برای برنامه نویسی بدرد میخوره که میخواد یک کنترل اختصاصی دست ساز خودش رو با ظاهر یک کنترل استاندارد رسم کنه.
    مثلا بهش میگید در فلان موقعیت یک ScrollBar رو رسم کن، ظاهر یک Button فشرده شده رو رسم کن، کادر دور یک TextBox رو رسم کن، دکمه Close یک پنجره رو رسم کن و ...
    VisualStyleRenderer هر بخشی از کنترل های استاندارد ویندوز (که در Theme ویندوز تعریف شده) رو میتونه در بخشی از یک رسم نمایش بده.
    بهتون این امکان رو میده که یک کنترل اختصاصی رو با ظاهر شبیه به Theme ویندوز رسم کنید، طوری که با ظاهر بقیه کنترل ها هماهنگ باشه.

  12. #12

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

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

  13. #13

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط arastoahmadi مشاهده تاپیک
    دوست عزیز همه چی بسیار عالی بود ما برای گرفتن اندازه طول رشته مون از MessureString استفاده می کنیم حالا اگه بخایم هم متن و هم عکسرو با هم بفرستیم باید چکار کنیم چون من تو تمام متدها گشتم برای گرفتن اندازه عکس متدی مثله MessureString وجود ندارد ممنون میشم یه راهنمایی بفرمایید
    ابعاد تصویر مشخصه، دیگه Measure نمیخواد.
    شیء عکس یا از نوع Image ئه یا Bitmap که Bitmap هم خودش یک نوع Image ئه.
    Image هم Image.Size و Image.Width و Image.Height داره که معلوم می کنه ابعادش چیه.

  14. #14

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    ممنون از راهنماییتون دوست گرامی

    فقط میخاستم بدونم اون قسمتی که متغییرهای text و Date رو تعریف میکنیم من اگه متغییر دیگه ای اضافه کنم مثلا متغییر Image موقع مقداردهی کردنش من شاید نخوام متغییر Image رو مقدار دهی کنم بنابراین اررور میگیره که شما باید حتما اون متغییر رو هم مقدار دهی کنید ممنون میشم یه راهنمایی کنید


  15. #15

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط arastoahmadi مشاهده تاپیک
    ممنون از راهنماییتون دوست گرامی

    فقط میخاستم بدونم اون قسمتی که متغییرهای text و Date رو تعریف میکنیم من اگه متغییر دیگه ای اضافه کنم مثلا متغییر Image موقع مقداردهی کردنش من شاید نخوام متغییر Image رو مقدار دهی کنم بنابراین اررور میگیره که شما باید حتما اون متغییر رو هم مقدار دهی کنید ممنون میشم یه راهنمایی کنید

    شرط قرار بدهید، مثلا اول بررسی کنید که item.Length چیه، که فرضا اگر 2 تا عضو داشت item.Length برابر 2 میشه. اگر سه تا عضو داشت می توانید عضو سوم (item[2]) رو که میتونه Image باشه بخونید و وگرنه سراع item[2] نروید چون اندیس 2 در آرایه 2 عضوی وجود نداره (فقط اندیس 0 و 1 رو داره)
    در ضمن می توانید بررسی کنید که اون item[0] نوع اش چیه، که فرضا اگر string نبود صریحا cast به string نکنید، با as می توانید جلوی بروز خطا رو بگیرید. اگر نوع اش مطابقت نداشته باشه as بجای خطا مقدار null برمیگردونه.

    var item = (object[])listBox1.Items[e.Index];
    var text = item[0] as string;
    var image = item[0] as Image;
    var date = (DateTime)item[1];
    if ((item.Length == 3) && (image == null))
    {
    image = item[2] as Image;
    }
    var format = new StringFormat(StringFormat.GenericDefault);

    یا می توانید کد رو کلا طوری بنویسید که با هر ترتیبی از رشته و تاریخ و تصویر بشه بهش پارامتر ارسال کرد و مهم نباشه که فرضا اول تاریخ رو ارسال می کنید یا آخر یا وسط :

    var item = (object[])listBox1.Items[e.Index];
    string text = null;
    DateTime date;
    Image image = null;
    foreach (var value in item)
    {
    if (value is string)
    {
    text = (string)value;
    }
    else if (value is DateTime)
    {
    date = (DateTime)value;
    }
    else if (value is Image)
    {
    image = (Image)value;
    }
    }
    var format = new StringFormat(StringFormat.GenericDefault);

  16. #16

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    ممنون از پاسختون دوست گرامی راستی دوست عزیز زمانی که متن طولانی باشد از لیست باکس میزنه بیرون ممنون میشم اینم یه راهنمایی بکنید

  17. #17

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط arastoahmadi مشاهده تاپیک
    ممنون از پاسختون دوست گرامی راستی دوست عزیز زمانی که متن طولانی باشد از لیست باکس میزنه بیرون ممنون میشم اینم یه راهنمایی بکنید
    کدتون ایراد داره، کدی که برای رسم نوشتید رو با کدی که من برای رسم نوشته بودم مقایسه کنید.

  18. #18

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    ChatBoxSample.rar

    دوست عزیز من این لینک رو دانلود کردم

    یه نکته که باید خدمتتون عرض کنم اینه که تمامی متن بالا برای یه سطره

  19. #19

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط arastoahmadi مشاهده تاپیک
    ChatBoxSample.rar

    دوست عزیز من این لینک رو دانلود کردم

    یه نکته که باید خدمتتون عرض کنم اینه که تمامی متن بالا برای یه سطره
    یک سطر؟ اگر متن در کادر ListBox جا نشه طبعا بیرون میزنه و چون متن خیلی طولانی است ListBox نمیتونه آیتم با این ارتفاع رو مدیریت کنه.
    هم حداکثر ارتفاع رو محدود کنید و هم متن های طولانی تر رو با ... کوتاه کنید (StringTrimming.EllipsisCharacter)

    var format = new StringFormat(StringFormat.GenericDefault);
    format.FormatFlags |= StringFormatFlags.NoClip | StringFormatFlags.DirectionRightToLeft;
    format.Trimming = StringTrimming.EllipsisCharacter;
    var size = Size.Round(e.Graphics.MeasureString(text, listBox1.Font, listBox1.ClientSize.Width - 20, format));
    size.Width = Math.Max(30, size.Width);
    size.Height = Math.Min(100, size.Height);


    var format = new StringFormat(StringFormat.GenericDefault);
    format.FormatFlags |= StringFormatFlags.DirectionRightToLeft;
    format.Trimming = StringTrimming.EllipsisCharacter;
    var size = Size.Round(e.Graphics.MeasureString(text, listBox1.Font, listBox1.ClientSize.Width - 20, format));
    size.Height = Math.Min(100, size.Height);
    e.ItemHeight = size.Height + 22;
    }

  20. #20

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    ممنون از پاسختون دوست عزیز من برنامه رو به این شکل تغییر دادم
    Capture.PNG

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

  21. #21

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    ممنون میشم اگه کسی راهنمایی کنه
    آخرین ویرایش به وسیله arastoahmadi : دوشنبه 19 خرداد 1399 در 14:38 عصر

  22. #22

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    تشکر از راهنمایی های جناب the king بنده میخوام لیست باکس رو بصورت سطر و ستون طراحی کنم به صورت زیر

    منتها داخل لیست باکس انگار هر آیتم کل یک سطر رو میگیره و اینجور نیست که هر آیتم سطر و ستون جداگانه بگیره، الان بنده این باکس هارو تونستم داخل لیست باکس توسط شی e.Grpahics طراحی کنم، به شکل زیر
    در حال حاضر میتونم با تنظیم location مربوط به هر باکس، باکس ها رو توی سطر و ستون کنار هم رسم کنم ولی مشکل اینه به ازای هر سطر، روی هر کدوم از باکس های موجود در ستون های اون سطر کلیک کنم، صرفا باکس اول از سمت راست (یعنی ستون اول) هایلایت میشه و مابقی باکس های اون سطر اصلا انگار وجود ندارن و کلیک نمیخورن، حتی پراپرتی e.ItemWidth رو هم ست میکنم ولی تفاوتی ایجاد نمیکنه
    حالا سوالم اینه آیا راهی هست که این طراحی رو مثل عکس اولی پیاده کرد که هر آیتم لیست باکس فقط یه ستون رو بگیره یعنی دقیقا اون مستطیل مربوط به هر باکس؟
    آخرین ویرایش به وسیله mr.sirwan : یک شنبه 10 اسفند 1399 در 16:53 عصر

  23. #23

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    تشکر از راهنمایی های جناب the king بنده می
    منتها داخل لیست باکس انگار هر آیتم کل یک سطر رو میگیره و اینجور نیست که هر آیتم سطر و ستون جداگانه بگیره، الان بنده این باکس هارو تونستم داخل لیست باکس توسط شی e.Grpahics طراحی کنم، به شکل زیر
    در حال حاضر میتونم با تنظیم location مربوط به هر باکس، باکس ها رو توی سطر و ستون کنار هم رسم کنم ولی مشکل اینه به ازای هر سطر، روی هر کدوم از باکس های موجود در ستون های اون سطر کلیک کنم، صرفا باکس اول از سمت راست (یعنی ستون اول) هایلایت میشه و مابقی باکس های اون سطر اصلا انگار وجود ندارن و کلیک نمیخورن، حتی پراپرتی e.ItemWidth رو هم ست میکنم ولی تفاوتی ایجاد نمیکنه
    حالا سوالم اینه آیا راهی هست که این طراحی رو مثل عکس اولی پیاده کرد که هر آیتم لیست باکس فقط یه ستون رو بگیره یعنی دقیقا اون مستطیل مربوط به هر باکس؟
    لابد کدی که نوشته اید مشکلی داره وگرنه نباید خارج از محدوده کادر اون آیتم تاثیری داشته باشه.

    preview.png

    code.zip

  24. #24

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    واقعا ممنون از راهنماییتون، مشکلو برطرف کردم، حالا چندتا سوال دارم:

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

    2. آیتم ها از بالا به پایین (بصورت سطری) رسم میشن، آیا راهی هست که آیتم هارو بصورت ستونی رسم کنیم؟ منظورم از راست به چپ یا چپ به راست هستش

    3. پراپرتی ItemHeight رو نمیشه بیشتر از 255 گذاشت، آیا راهی برای دور زدن این مشکل وجود داره؟

    4. برای تعداد کمی از آیتم ها، آیتم ها از وسط لیست باکس به سمت چپ اون رسم میشن که چیز منطقی ای نیست (در حالی که لیست باکس راست به چپ هم هستش) باید از سمت راست لیست باکس شروع بشن، نمونه این مشکل:

    5. یه مورد هم که زیاد اذیت میکنه این چشمک زدنه ست، آیا میشه کاری برای رفع این چشمک زدن آیتم ها کرد؟ DoubleBuffer لیست باکس رو true کردم ولی فایده ای نداشت

    6. درمورد پاکسازی و Dispose کردن آبجکت ها و فضای اشغال شده رم در این روش آیا نکته ای چیزی وجود داره که رعایت کنیم و باعث سربار زیاد روی سیستم نشیم؟
    آخرین ویرایش به وسیله mr.sirwan : دوشنبه 11 اسفند 1399 در 02:12 صبح

  25. #25

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    واقعا ممنون از راهنماییتون، مشکلو برطرف کردم، حالا چندتا سوال دارم:
    1. اینکه آیا میشه تعداد ستون ها در هر سطر رو کنترل کرد؟ در حال حاضر وقتی تعداد رکوردها بیشتر از اندازه مانیتور میشه، لیست باکس، اسکرول افقی میخوره که این مسئله زیاد کاربر پسند نیست، بنده میخوام متناسب با سایز مانیتور، تعداد آیتم هارو نمایش بدم که اصلا اسکرول نخوره و اگر چاره ای نبود و اسکرول هم خورد، اسکرول عمودی بخوره نه اسکرول افقی
    طبعا با تنظیم ColumnWidth به نوعی تعداد ستون هم تنظیم میشه اما این چیزی که برای اسکروال توصیف می کنید رفتار ListView است نه ListBox.
    رسم ListView رو تغییر بدهید (OwnerDraw = true و View=Tile) و تنظیم TileSize

    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    2. آیتم ها از بالا به پایین (بصورت سطری) رسم میشن، آیا راهی هست که آیتم هارو بصورت ستونی رسم کنیم؟ منظورم از راست به چپ یا چپ به راست هستش
    کنترل ListView رو جایگزین ListBox کنید.

    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    3. پراپرتی ItemHeight رو نمیشه بیشتر از 255 گذاشت، آیا راهی برای دور زدن این مشکل وجود داره؟
    بله. در set مشخصه ItemHeight کلاس یک شرط if (value < 1 || value > 255) هست که بهش علاقه ای ندارید و ناچار هستید دورش بزنید و از ItemHeight متعارف استفاده نکنید.
    اگر از کلاس وراثت ایجاد می کنید که می توانید مشخصه رو override کنید وگرنه روال تغییر یافته بدون اون if اینه :

    private static void SetItemHeight( ListBox listBox, int itemHeight)
    {
    var fieldInfo = typeof( ListBox).GetField( "itemHeight", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    fieldInfo.SetValue( listBox, itemHeight);
    if ( ( listBox.DrawMode != DrawMode.OwnerDrawFixed) || ( listBox.IsHandleCreated == false))
    {
    return;
    }
    listBox.BeginUpdate( );
    var methodInfo = typeof( Control).GetMethod( "SendMessage", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    methodInfo.Invoke( listBox, new object[] { 416, 0, itemHeight });
    if ( listBox.IntegralHeight)
    {
    var size = listBox.Size;
    listBox.Size = new Size( size.Width + 1, size.Height);
    listBox.Size = size;
    }
    listBox.EndUpdate( );
    }

    مثلا :

    SetItemHeight(lst, 400);


    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    4. برای تعداد کمی از آیتم ها، آیتم ها از وسط لیست باکس به سمت چپ اون رسم میشن که چیز منطقی ای نیست (در حالی که لیست باکس راست به چپ هم هستش) باید از سمت راست لیست باکس شروع بشن
    قطعا منطقی نیست ولی کد خودتون درست نیست که همچین ظاهری پیدا می کنه. یک جایی کار اشتباهی انجام می دهید.

    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    5. یه مورد هم که زیاد اذیت میکنه این چشمک زدنه ست، آیا میشه کاری برای رفع این چشمک زدن آیتم ها کرد؟ DoubleBuffer لیست باکس رو true کردم ولی فایده ای نداشت
    نمیشه گفت هیچ چاره ای نداره ولی به درد سرش نمی ارزه. کلاسش رو از نو باز نویسی کنید بهتر جواب میده تا تغییرات اساسی در کلاسش.

    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    6. درمورد پاکسازی و Dispose کردن آبجکت ها و فضای اشغال شده رم در این روش آیا نکته ای چیزی وجود داره که رعایت کنیم و باعث سربار زیاد روی سیستم نشیم؟
    قطعا. قاعده کلی اینه که چیزی که Dispose شدنی است رو تا حد امکان با using بکار ببرید یا در اولین فرصت Dispose کنید.

  26. #26

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    طبعا با تنظیم ColumnWidth به نوعی تعداد ستون هم تنظیم میشه اما این چیزی که برای اسکروال توصیف می کنید رفتار ListView است نه ListBox.
    رسم ListView رو تغییر بدهید (OwnerDraw = true و View=Tile) و تنظیم TileSize


    کنترل ListView رو جایگزین ListBox کنید.


    بله. در set مشخصه ItemHeight کلاس یک شرط if (value < 1 || value > 255) هست که بهش علاقه ای ندارید و ناچار هستید دورش بزنید و از ItemHeight متعارف استفاده نکنید.
    اگر از کلاس وراثت ایجاد می کنید که می توانید مشخصه رو override کنید وگرنه روال تغییر یافته بدون اون if اینه :

    قطعا منطقی نیست ولی کد خودتون درست نیست که همچین ظاهری پیدا می کنه. یک جایی کار اشتباهی انجام می دهید.


    نمیشه گفت هیچ چاره ای نداره ولی به درد سرش نمی ارزه. کلاسش رو از نو باز نویسی کنید بهتر جواب میده تا تغییرات اساسی در کلاسش.
    خیلی ممنون از وقتی که گذاشتین و بنده رو راهنمایی کردین، واقعیتش بنده از listview استفاده نمیکنم، از همون اول از listbox استفاده کردم اتفاقا همون کد و اسکرین شاتی که شما از لیست باکس خودتون هم گذاشتین دقیقا مشکلات 1 تا 4 رو داره، لطفا خودتون هم تست کنید، اول اینکه لیست باکس رو راست به چپ کنید، بعد برای دیدن تاثیر مشکل اول، تعداد آیتم هارو زیاد کنید مثلا 30 یا 45 تا آیتم برای اینکه اسکرول خوردن افقی رو مشاهده کنید (این مشکل رو بنده روی برنامه اصلیم با تنظیم کردن تعداد آیتم های واکشی شده از دیتابیس حل کردم)

    برای مورد دوم، که دقیقا توی اسکرین شاتی که فرستادین هم مشخصه که آیتم ها از بالا به پایین رسم میشن و نه از چپ به راست یا راست به چپ

    برای مورد چهارم، تعداد آیتم هایی که داخل لیست باکس ساخته میشن رو کاهش بدین مثلا 5 آیتم و فرم رو maximize کنید که ملاحظه بفرمایید آیتم ها از وسط لیست باکس شروع به ترسیم شدن میکنن

    در هر حال بنده کدایی که نوشتم رو در قالب یه نمونه پروژه اینجا میذارم، لطف کنید یه نگاهی بهش بندازید:

    ListBoxDrawMode.rar

    قطعا. قاعده کلی اینه که چیزی که Dispose شدنی است رو تا حد امکان با using بکار ببرید یا در اولین فرصت Dispose کنید.
    برای تصاویری که داخل resources قرار داده شدن، آیا dispose کردن لازمه؟
    آخرین ویرایش به وسیله mr.sirwan : دوشنبه 11 اسفند 1399 در 14:32 عصر

  27. #27

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    خیلی ممنون از وقتی که گذاشتین و بنده رو راهنمایی کردین، واقعیتش بنده از listview استفاده نمیکنم، از همون اول از listbox استفاده کردم اتفاقا همون کد و اسکرین شاتی که شما از لیست باکس خودتون هم گذاشتین دقیقا مشکلات 1 تا 4 رو داره، لطفا خودتون هم تست کنید، اول اینکه لیست باکس رو راست به چپ کنید، بعد برای دیدن تاثیر مشکل اول، تعداد آیتم هارو زیاد کنید مثلا 30 یا 45 تا آیتم برای اینکه اسکرول خوردن افقی رو مشاهده کنید (این مشکل رو بنده روی برنامه اصلیم با تنظیم کردن تعداد آیتم های واکشی شده از دیتابیس حل کردم)
    هر کدوم از کنترل ها یک رفتار مشخصی دارند که در طراحی واسط کاربری ویندوز روالش نوشته شده، نه در کد #C، مثلا اولویت درج آیتم ها در ListBox ابتدا عمودی و سپس افقی است، در ListView برعکس اینه.
    انتخاب کنترل با شما است اما اگه رفتار کنترل مد دلخواه تون نباشه صرفا باید انتخاب تون رو تغییر بدهید.

    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    برای مورد دوم، که دقیقا توی اسکرین شاتی که فرستادین هم مشخصه که آیتم ها از بالا به پایین رسم میشن و نه از چپ به راست یا راست به چپ
    بله، جزو خصوصیات ListBox ئه.

    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    برای مورد چهارم، تعداد آیتم هایی که داخل لیست باکس ساخته میشن رو کاهش بدین مثلا 3 آیتم که ملاحظه بفرمایید آیتم ها از وسط لیست باکس شروع به ترسیم شدن میکنن
    RightToLeft با MultiColumn جور در نمیاد، باگ خود ListBox ئه.

    نقل قول نوشته شده توسط mr.sirwan مشاهده تاپیک
    برای تصاویری که داخل resources قرار داده شدن، آیا dispose کردن لازمه؟
    خیر. هر منبعی که خودتون ایجاد نکنید Dispose نمی خواد. کنترل های روی فرم و کمپوننت ها هم موقع Dispose شدن فرم بصورت خودکار Dispose میشن.

  28. #28

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    RightToLeft با MultiColumn جور در نمیاد، باگ خود ListBox ئه.
    همه موارد رو به نحوی میشه قبول کرد، ولی واقعا مورد چهارم رو نمیشه هیچ جوره هضم کرد، اصلا برای کاربر هم خوشایند نیست که همچین صحنه ای ببینه، یعنی راهی نیست که مثلا لیست باکس رو ازش ارث بری کنم و خودم دست به کد بشم و این مشکلی که با راست به چپ داره رو برطرف کنم؟ آیا کدهای زیادی میطلبه؟ ممنون میشم یه راهنمایی در این مورد بفرمایید

  29. #29
    کاربر دائمی
    تاریخ عضویت
    اردیبهشت 1390
    محل زندگی
    چند قدم اون ور تر
    پست
    1,731

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    سلام
    اگه می تونید کنترل رو در wpf طراحی کنید و در ویندوز فرم استفاده کنید، اینجا برای کارهای گرافیکی مناسب نیست. همونطور که گفتید مشکل پرش هست، مشکل سرعت در تعداد رکوردهای بالا و مشکل چپ به راست و حتی در محاسبه اندازه یک متن بویژه متن های فارسی مشکل داره (اندازه به پیکسل یا تبدیل به میلی متر)
    البته خودم فرصت طراحی در wpf و استفاده در ویندوز فرم رو نداشتم ولی با مشکلات طراحی کنترل در ویندوز فرم کاملا آشنا هستم!
    این هم یک مثال
    آخرین ویرایش به وسیله Mahmoud Zaad : سه شنبه 12 اسفند 1399 در 08:32 صبح

  30. #30

    نقل قول: ساخت کادر و نوشتن متن در آن با رویداد paint فرم

    نقل قول نوشته شده توسط Mahmoud Zaad مشاهده تاپیک
    سلام
    اگه می تونید کنترل رو در wpf طراحی کنید و در ویندوز فرم استفاده کنید، اینجا برای کارهای گرافیکی مناسب نیست. همونطور که گفتید مشکل پرش هست، مشکل سرعت در تعداد رکوردهای بالا و مشکل چپ به راست و حتی در محاسبه اندازه یک متن بویژه متن های فارسی مشکل داره (اندازه به پیکسل یا تبدیل به میلی متر)
    البته خودم فرصت طراحی در wpf و استفاده در ویندوز فرم رو نداشتم ولی با مشکلات طراحی کنترل در ویندوز فرم کاملا آشنا هستم!
    این هم یک مثال
    ممنون از راهنماییتون، بله بنده هم قبلا یه UserControl داخل winform طراحی کرده بودم، که انصافا طراحیش خیلی راحت بود اما سربار زیادی روی سیستم ایجاد میکرد، در حدی که بعد از 50-60 بار ریفرش شدن این صفحه حاوی یوزرکنترل، برنامه خودبخود میپرید بیرون و بسته میشد، برا همین تصمیم گرفتم از این روش رسم لیست باکس استفاده کنم، اگه با لیست باکس به جایی نرسیدم ناچارن باید برم کنترل رو توی WPF ایجاد کنم و بیارمش داخل برنامه م

تاپیک های مشابه

  1. فراخوانی رویداد Paint در رویداد کلیک روی Button
    نوشته شده توسط puvinax در بخش C#‎‎
    پاسخ: 10
    آخرین پست: سه شنبه 10 فروردین 1389, 08:09 صبح
  2. سوال: رویداد paint?
    نوشته شده توسط vahid.bz در بخش C#‎‎
    پاسخ: 2
    آخرین پست: سه شنبه 16 تیر 1388, 23:50 عصر
  3. رویداد Paint چجوری همون OnPaint هست؟!!!!!!
    نوشته شده توسط hanieh66 در بخش C#‎‎
    پاسخ: 1
    آخرین پست: چهارشنبه 11 دی 1387, 21:23 عصر
  4. [ override کردن OnPaint + رویداد Paint فرم ] و زمان اجرای این دو
    نوشته شده توسط HosseinProgrammer در بخش C#‎‎
    پاسخ: 1
    آخرین پست: چهارشنبه 14 فروردین 1387, 19:41 عصر
  5. چطور از drowline خارج از رویداد paint استفاده کنیم؟
    نوشته شده توسط mirtalebi در بخش VB.NET
    پاسخ: 1
    آخرین پست: یک شنبه 18 تیر 1385, 20:25 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •