سؤال

لدي ثم subclassed التحكم في C# WinForms ، وأنا مخصص النص في بلدي OnPaint() معالج.الخط هو Courier New باستخدام التعليمات البرمجية التالية في النموذج:

FontFamily family = new FontFamily("Courier New");
this.myControl.Font = new Font(family, 10);

في السيطرة على نفسه ، السلسلة يتم تخزينها في realText, وأنا استخدم التعليمات البرمجية التالية إلى استدراجه إلى الشاشة:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    e.Graphics.DrawString(realText, Font, new SolidBrush(ForeColor), ClientRectangle);
}

نتيجة لبعض عشوائية سبيل المثال النص يبدو على النحو التالي:http://img219.imageshack.us/img219/1778/courier.png

إذا كنت في التكبير ، يمكنك أن ترى على سبيل المثال ، أن المسافة بين أول 'كما' مختلفة من الفضاء بين الثانية 'كما' (1 بكسل مقابل 2 بكسل).هل لدى أحدكم أي فكرة عن ما يمكن أن يسبب هذا أو كيف يمكن منع ذلك من الحدوث ؟ هناك الكثير مماثلة أكثر غرابة في تباعد كما أود أن ألفت مع مختلف الخطوط, ولكن أعتقد أنهم جميعا النتائج من نفس المشكلة.

شكرا مقدما على أي أفكار قد تكون لديك.

هل كانت مفيدة؟

المحلول

وانا ذاهب الى تخمين انه لأنك كنت تستخدم <لأ href = "http://msdn.microsoft.com/en-us/library/system.drawing.graphics.drawstring.aspx" يختلط = " نوفولو noreferrer "> Graphics.DrawString() بدلا من <لأ href =" http://msdn.microsoft.com/en-us/library/system.windows.forms.textrenderer.drawtext٪28v=vs.110٪29. ASPX "يختلط =" نوفولو noreferrer "> TextRenderer.DrawText() . النص الدهانات السابقة باستخدام GDI + الذي هو نوع من كربي وعفا عليها الزمن. يستخدم هذا الأخير GDI وهو أكثر حداثة (من حيث تقديم النص). وأعتقد أن هذا هو الفرق التي أشار إليها الإجابة السابقة (WinForms عناصر مقابل ويندوز).

هل يمكن أيضا محاولة الزائد من Graphics.DrawString() أن يأخذ <لأ href = "http://msdn.microsoft.com/en-us/library/system.drawing.stringformat٪28v=vs.110٪29.aspx "يختلط =" نوفولو noreferrer "> StringFormat الاعتراض وتحديد StringFormat.GenericTypographic. ومع ذلك، وهذا هو حقا قليلا من الإختراق للتغلب على المشكلة. إذا كنت تستخدم NET 2.0 أو في وقت لاحق، يجب أن تكون باستخدام فئة TextRenderer بدلا من فئة Graphics كربي لجميع احتياجات جعل النص الخاص بك. Graphics.MeasureString() وGraphics.DrawString() موجودة بدقة عن التوافق مع .NET Framework 1.0 و 1.1.

وتحرير: أوه نعم، والتعليمات البرمجية تسرب كائن GDI في كل دورة الطلاء. تدار الأشياء فرشاة مغلفة حول الموارد غير المدارة وبالتالي لا بد من التخلص منها بشكل واضح.

نصائح أخرى

ويجب أن أكون صادقا، ولكن هذا لم يحدث لي من قبل. ومع ذلك، حاول إعداد SmoothingMode إلى الحواف:

e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

وآخر شيء جانبا، وتأكد من أن من باستخدام ديه مجموعة DoubleBuffer إلى true. أيضا، وليس محاولة لخلق SolidBrush جديد في كل مكالمة OnPaint ..

تجربتي مع اللوحة النص إلى ثم subclassed ضوابط استخدام WinForms هو أن محرك جعل النص ويستخدم (GDI+?) ليست جيدة مثل ويندوز الخاص الخط المحرك, و بالتأكيد يعطي نتائج مختلفة حتى عندما يعمل بشكل جيد.

أنا صاحب Visual Studio الدين (http://entrian.com/source-search) التي تحتاج إلى طلاء التحكم في Visual Studio ، ومن أجل جعل الخطوط تبدو نفس معيار التحكم في Visual Studio (listviews ، treeviews ، إلخ.) لدي لتجاوز WinForms والطلاء النص باستخدام Win32 API:

[DllImport("gdi32.dll")]
public static extern bool ExtTextOut(IntPtr hdc, int X, int Y,
   uint fuOptions, [In] ref RECT lprc, string lpString, uint cbCount,
   [In] int[] lpDx);

و الأسرة.

ربما ليس ما أردت أن تسمعه ولكن هناك هو عليه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top