منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
ضغط حجم النص - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم اسئلة VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=183)
+--- الموضوع : ضغط حجم النص (/showthread.php?tid=3624)

الصفحات: 1 2


ضغط حجم النص - abuzzouz - 11-08-14

أخواني الأفاضل

لو تكرمتم أحتاج كود يضغط حجم النص الموجود في مربع نص ليتلاءم مع عرض هذا المربع ويظهر بشكل كامل وذلك بأسلوبين:
الأول: في حال مربع النص مكون من سطر واحد فقط (fit in one line only)
الثاني: في حال مربع النص مكون من سطرين فقط (fit & wrap in two lines only)
وعلى أن يكون الحد الأقصى لحجم الخط يساوي 11

أرجو منكم الإفادة إخواني جزاكم الله خيراً

مع خالص الشكر والتقدير


RE: ضغط حجم النص - sooriaty03 - 11-08-14

السلام عليكم

أخي الكريم

سؤالك غير واضح...
أرجو أن تقوم بتوضيح الفكرة أكثر وحبذا لو أرفقت بعض الصور إن استطعت...


RE: ضغط حجم النص - abuzzouz - 11-08-14

أخي العزيز
الفكرة أن لدي مربعي نص حجم الخط فيهما يساوي 11 كحد أقصى (أي ان النص بحالته الطبيعية يكون بحجم خط مساو 11)
أحدهما له خاصية سطر واحد فقط ما أريده هو أن يظهر فيه النص كاملاً مهما كان طويلاً أي أن يتقلص طول النص ليتناسب مع عرض مربع النص
أما المربع الثاني فهو نفس الأول مع اختلاف أنه يقبل سطرين أي يمكن أن يلتف النص لسطر آخر قبل أن يتقلص إذا كان أطول من عرض هذا المربع

أرجو أن أكون قد أوضحت الفكرة

ربما الحل يكون بتغيير حجم الخط تدريجيا إلى أن يتناسب مع حجم مربع النص لكن ليس لدي امكانية احتساب وتطبيق ذلك


ولك جزيل الشكر


RE: ضغط حجم النص - silverlight - 12-08-14

انا مش متذكر قوي هل هناك خاصية في التكست بوكس تضبط الخط بشكل سهل أم لا

عموما ان لم يكن هذه الخاصية متوفرة سيكون عليك بناء كونترول جديد يتم توريثه من TextBox
حيث هنا انت تحتاج الي ان تحسب Size الخاص ب التكست باستخدام الفونت المستخدم و ذلك ب استخدام TextRenderer.MeasureText و هذه هي الطريقة المستخدمة في رسم Strings و لكي لا تدخل في متاهة كبيرة عليك ان لا ترسم String حيث انك هنا فقط تحتاج الي اعادة ضبط ارتفاع مربع النص بناء علي مقاس String و مربع النص و غالبا سيكون Width الخاص به ثابتا فقط ما سيتغير هو الإرتفاع الخاص به مهما تغير حجم الفونت


عموما أنصحك أن تفكر في حلول أسهل لك حيث كما افهم من كلامك ان عدد الاسطر لن يتعدي سطران و بالتالي و بدلا من ان تستخدم مربع النص تحديدا ربما يمكنك استبداله ب كونترول اخر قد يعطيك نفس الأهداف مثل Label مثلا و ف تلك الحالة سيكون سهلا جدا رسم الاسطر و تحجيم Label ليتناسب مع الأسطر بكل سهولة


RE: ضغط حجم النص - abuzzouz - 12-08-14

أشكرك أخي العزيز على مرورك الكريم
لكن المشكلة أني مقيد بالتكست بوكس حيث أن المستخدم لابد أن يدخل بيانات فيه أما الليبل فلا يستطيع
أنا أتخيل الموضوع كما في خلايا الاكسيل عندما نحدد خاصية fit للنص فيصغر حجمه ولا يتأثر عرض ولا ارتفاع الخلية بكبر أو صغر حجم النص وهذا ما أريده بالضبط


RE: ضغط حجم النص - silverlight - 12-08-14

ما قلت لك سابقا في كلتا الحالات ما تريده يتحقق فقط في حالة واحدة و هي أن تحسب حجم التكست باستخدام 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


RE: ضغط حجم النص - abuzzouz - 12-08-14

شكرا جزيلاً أخي الكريم
اعذرني خبرتي قليلة وأسعى جاهداً للإستفادة من خبرات أمثالكم

سوف أقوم بتجربة الكود وأخبرك بالنتيجة لاحقاً


RE: ضغط حجم النص - abuzzouz - 13-08-14

أخي العزيز silverlight السلام عليكم
قمت بتجربة الكود السابق إلا ان النتيجة لم تكن كما أردت للأسف
لذا اتبعت أسلوب تحديد عدد الأحرف بواسطة Len ومن ثم معايرة هذا العدد مع ما يتناسب من حجم الخط المناسب ليستع النص بكامله في مربع النص

هذا اسلوب بدائي لكني لم أتوصل لما أردته رغم كل المحاولات

شكراً جزيلاً لكم على أية حال


RE: ضغط حجم النص - nmst70 - 14-08-14

اليك اخي الحل اولا في حالة تمدد التكست في سطر واحد
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




ونحن في الخدمة


RE: ضغط حجم النص - abuzzouz - 14-08-14

أشكرك جزيلا أخي nmst70 لمرورك الكريم

سوف أقوم بتجربة الكود واخبرك بالنتيجة

تقبل تحياتي