المشاركات : 147
المواضيع 41
الإنتساب : Jul 2014
السمعة :
1
الشكر: 387
تم شكره 50 مرات في 6 مشاركات
11-08-14, 12:52 PM
أخواني الأفاضل
لو تكرمتم أحتاج كود يضغط حجم النص الموجود في مربع نص ليتلاءم مع عرض هذا المربع ويظهر بشكل كامل وذلك بأسلوبين:
الأول: في حال مربع النص مكون من سطر واحد فقط (fit in one line only)
الثاني: في حال مربع النص مكون من سطرين فقط (fit & wrap in two lines only)
وعلى أن يكون الحد الأقصى لحجم الخط يساوي 11
أرجو منكم الإفادة إخواني جزاكم الله خيراً
مع خالص الشكر والتقدير
{ اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الخبير }
المشاركات : 749
المواضيع 17
الإنتساب : Sep 2013
السمعة :
54
الشكر: 521
تم شكره 619 مرات في 232 مشاركات
السلام عليكم
أخي الكريم
سؤالك غير واضح...
أرجو أن تقوم بتوضيح الفكرة أكثر وحبذا لو أرفقت بعض الصور إن استطعت...
المشاركات : 147
المواضيع 41
الإنتساب : Jul 2014
السمعة :
1
الشكر: 387
تم شكره 50 مرات في 6 مشاركات
أخي العزيز
الفكرة أن لدي مربعي نص حجم الخط فيهما يساوي 11 كحد أقصى (أي ان النص بحالته الطبيعية يكون بحجم خط مساو 11)
أحدهما له خاصية سطر واحد فقط ما أريده هو أن يظهر فيه النص كاملاً مهما كان طويلاً أي أن يتقلص طول النص ليتناسب مع عرض مربع النص
أما المربع الثاني فهو نفس الأول مع اختلاف أنه يقبل سطرين أي يمكن أن يلتف النص لسطر آخر قبل أن يتقلص إذا كان أطول من عرض هذا المربع
أرجو أن أكون قد أوضحت الفكرة
ربما الحل يكون بتغيير حجم الخط تدريجيا إلى أن يتناسب مع حجم مربع النص لكن ليس لدي امكانية احتساب وتطبيق ذلك
ولك جزيل الشكر
{ اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الخبير }
المشاركات : 1,486
المواضيع 101
الإنتساب : Sep 2012
السمعة :
127
الشكر: 71
تم شكره 6155 مرات في 1035 مشاركات
انا مش متذكر قوي هل هناك خاصية في التكست بوكس تضبط الخط بشكل سهل أم لا
عموما ان لم يكن هذه الخاصية متوفرة سيكون عليك بناء كونترول جديد يتم توريثه من TextBox
حيث هنا انت تحتاج الي ان تحسب Size الخاص ب التكست باستخدام الفونت المستخدم و ذلك ب استخدام TextRenderer.MeasureText و هذه هي الطريقة المستخدمة في رسم Strings و لكي لا تدخل في متاهة كبيرة عليك ان لا ترسم String حيث انك هنا فقط تحتاج الي اعادة ضبط ارتفاع مربع النص بناء علي مقاس String و مربع النص و غالبا سيكون Width الخاص به ثابتا فقط ما سيتغير هو الإرتفاع الخاص به مهما تغير حجم الفونت
عموما أنصحك أن تفكر في حلول أسهل لك حيث كما افهم من كلامك ان عدد الاسطر لن يتعدي سطران و بالتالي و بدلا من ان تستخدم مربع النص تحديدا ربما يمكنك استبداله ب كونترول اخر قد يعطيك نفس الأهداف مثل Label مثلا و ف تلك الحالة سيكون سهلا جدا رسم الاسطر و تحجيم Label ليتناسب مع الأسطر بكل سهولة
المشاركات : 147
المواضيع 41
الإنتساب : Jul 2014
السمعة :
1
الشكر: 387
تم شكره 50 مرات في 6 مشاركات
أشكرك أخي العزيز على مرورك الكريم
لكن المشكلة أني مقيد بالتكست بوكس حيث أن المستخدم لابد أن يدخل بيانات فيه أما الليبل فلا يستطيع
أنا أتخيل الموضوع كما في خلايا الاكسيل عندما نحدد خاصية fit للنص فيصغر حجمه ولا يتأثر عرض ولا ارتفاع الخلية بكبر أو صغر حجم النص وهذا ما أريده بالضبط
{ اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الخبير }
المشاركات : 1,486
المواضيع 101
الإنتساب : Sep 2012
السمعة :
127
الشكر: 71
تم شكره 6155 مرات في 1035 مشاركات
ما قلت لك سابقا في كلتا الحالات ما تريده يتحقق فقط في حالة واحدة و هي أن تحسب حجم التكست باستخدام TextRenderer و تبين كونترول تم توريثه من التكست بوكس بيتناسب مع ما تريده
ثم تقوم بعمل Zooming للفونت بمعني انك تحسب مقاس التكست ثم تقسمه أو تضربه في Scale ما لتجعله اصغر قليلا أو تجعله أكبر قليلا و من ثم تقارنه ب عرض التكست بوكس فإن كان اقل أو أكبر تضبطه برمحيا ليتناسب مع أبعاد التكست بوكس و في تلك الحالة أنت لن تحتاج الي تغيير ابعاد التكست بوكس
لكن هناك مشكلة وحيدة هنا وهي أن Font Size في التكست بوكس تقريبا Read Only
عموما مرحليا فيه خاصية اسمها AutoSize لو جعلت قيمتها تساوي True ستحقق لك ما تريده لكنها غالبا ستغير في ابعاد التكست بوكس.
أيضا يمكنك دراسة الكود التالي و التعديل عليه ربما يتناسب مع ما تريد انا كتبته لكي يعطيك فكرة بسيطة عن كيفية التلاعب بحجم الفونت لكنك
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.TextBox1.Text = "The Lazy Fox Jumps on the Streets"
End Sub
Public Shared Function ScaleTextBoxFontSize(textBoxSize As Size, textBoxFont As Font, textBoxString As String) As Single
Dim textSize As SizeF = TextRenderer.MeasureText(TextBoxString, textBoxFont)
Return textBoxFont.Size * Math.Min(textBoxSize.Height / textSize.Height, textBoxSize.Width / textSize.Width)
End Function
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
If Not String.IsNullOrEmpty(TextBox1.Text) Then
Dim originalFontSize As Single = Me.TextBox1.Font.Size
Dim scale As Single = ScaleTextBoxFontSize(Me.TextBox1.Size, Me.TextBox1.Font, Me.TextBox1.Text)
Me.TextBox1.Font = New Font(Me.TextBox1.Font.FontFamily, originalFontSize * scale / 10)
End If
End Sub
End Class
المشاركات : 147
المواضيع 41
الإنتساب : Jul 2014
السمعة :
1
الشكر: 387
تم شكره 50 مرات في 6 مشاركات
شكرا جزيلاً أخي الكريم
اعذرني خبرتي قليلة وأسعى جاهداً للإستفادة من خبرات أمثالكم
سوف أقوم بتجربة الكود وأخبرك بالنتيجة لاحقاً
{ اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الخبير }
المشاركات : 147
المواضيع 41
الإنتساب : Jul 2014
السمعة :
1
الشكر: 387
تم شكره 50 مرات في 6 مشاركات
أخي العزيز silverlight السلام عليكم
قمت بتجربة الكود السابق إلا ان النتيجة لم تكن كما أردت للأسف
لذا اتبعت أسلوب تحديد عدد الأحرف بواسطة Len ومن ثم معايرة هذا العدد مع ما يتناسب من حجم الخط المناسب ليستع النص بكامله في مربع النص
هذا اسلوب بدائي لكني لم أتوصل لما أردته رغم كل المحاولات
شكراً جزيلاً لكم على أية حال
{ اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الخبير }
المشاركات : 68
المواضيع 15
الإنتساب : May 2013
السمعة :
0
الشكر: 8
تم شكره 14 مرات في 11 مشاركات
اليك اخي الحل اولا في حالة تمدد التكست في سطر واحد
TextBox1.Width = TextBox1.PreferredSize.Width + 5
وكود الاخر في حالة استخدام اكثر من سطر
TextBox2.Multiline = True
TextBox2.WordWrap = False
TextBox2.Height = TextBox1.PreferredHeight
TextBox2.Width = TextBox2.PreferredSize.Width + 5
TextBox2.Height = TextBox2.PreferredSize.Height
ونحن في الخدمة
المشاركات : 147
المواضيع 41
الإنتساب : Jul 2014
السمعة :
1
الشكر: 387
تم شكره 50 مرات في 6 مشاركات
أشكرك جزيلا أخي nmst70 لمرورك الكريم
سوف أقوم بتجربة الكود واخبرك بالنتيجة
تقبل تحياتي
{ اللهم علمنا ما ينفعنا وانفعنا بما علمتنا إنك أنت العليم الخبير }