2011-05-24 13 views
10

मेरे पास एक ऐसा एप्लिकेशन है जिसका उपयोग टच स्क्रीन सिस्टम पर किया जा रहा है, और इसमें कई बटन हैं जो काफी बड़े (~ 100px वर्ग) हैं।WinForms बटन में पाठ के चारों ओर पैडिंग कम करें

प्रत्येक बटन में पाठ की 1 और 4 पंक्तियों (आमतौर पर प्रति पंक्ति एक शब्द) के बीच होगा।

बटन में बड़ी मात्रा में पैडिंग के कारण, मुझे टेक्स्ट के आकार को कम करना है ताकि यह लगभग अपठनीय हो, हालांकि अगर मैं आंतरिक पैडिंग को कम करने में सक्षम था, तो टेक्स्ट सही रंग देगा सीमा तक, तो मुझे कोई समस्या नहीं होगी।

मैंने नियंत्रण के पैडिंग को शून्य तक कम करने का प्रयास किया है, लेकिन इससे मदद नहीं मिलती है।

this.Text = _label; 
this.Font = new Font(this.Font.FontFamily, (float) _size); 
this.Padding = new Padding(0); 

समस्या का एक उदाहरण नीचे दिखाया गया है:

Button with broken text

आप देख सकते हैं शब्द 'अवलोकन' एक लाइन पर फिट करने के लिए के लिए अंतरिक्ष के बहुत सारे है, लेकिन मैं कैसे कर सकते हैं फ़ॉन्ट आकार को कम किए बिना इसे प्राप्त करें? मैं नियंत्रण के टेक्स्ट पेंटिंग कोड को फिर से लिखने के विचार को पसंद नहीं करता हूं।

संपादित करें: मैंने देखा है कि पैडिंग को 300 से अधिक के रूप में विभिन्न मानों में बढ़ाना, नियंत्रण की आंतरिक पैडिंग में कोई फर्क नहीं पड़ता। इसके अलावा जानकारी के लिए, मैं जिस बटन का उपयोग कर रहा हूं वह एक नियंत्रण है जिसे मैंने Windows.Forms.Button क्लास से विरासत में मिला है, क्योंकि मुझे कुछ गुण जोड़ने की ज़रूरत है, हालांकि मैंने किसी भी बटन के अपने तरीकों से हस्तक्षेप नहीं किया है।

उत्तर

5

आप बटन नियंत्रण के ऑनपेंट() विधि को भी ओवरराइड करते हैं, जिससे आप विरासत में हैं, और बेस कॉल करने के लिए छोड़ दें। ऑनपेंट(), और इसे अपने स्वयं के ड्रा कोड से प्रतिस्थापित करें।

protected override void OnPaint(PaintEventArgs pevent) 
    { 
     //omit base.OnPaint completely... 

     //base.OnPaint(pevent); 

     using (Pen p = new Pen(BackColor)) 
     { 
      pevent.Graphics.FillRectangle(p.Brush, ClientRectangle); 
     } 

     //add code here to draw borders... 

     using (Pen p = new Pen(ForeColor)) 
     { 
      pevent.Graphics.DrawString("Hello World!", Font, p.Brush, new PointF(0, 0)); 
     } 
    } 
+0

यह मेरी पसंदीदा विधि होगी, हालांकि यह इतना आसान नहीं है, क्योंकि मौजूदा पेंट इवेंट सीमाओं के भीतर पाठ की रैपिंग और स्थिति से निपटेंगे , इसलिए कारण मैं इस सड़क पर जाने के इच्छुक नहीं हूं, बशर्ते कि इसे प्राप्त करने का कोई आसान तरीका न हो? – Bryan

+1

स्वीकृत, ग्राफिक्स के रूप में। ड्रॉस्ट्रिंग टेक्स्ट रैपिंग और पोजीशनिंग का आसान काम करता है। पूरी तरह से काम करता है, बहुत धन्यवाद। – Bryan

+0

मेरे सुझाव से कूल, सरल और ऐसा लगता है जैसे यह काम करता है। +1 – Jodrell

3

मैंने एमएफसी का उपयोग करके '98 में एक सफल रेडियो स्वचालन आवेदन वापस बनाया है। हमने पहली चीज यह है कि हमने इसके लिए जीयूआई नियंत्रणों का पूरा नया सेट बनाया है, उदाहरण के लिए, स्क्रीन पर बटन दबाकर उंगली से उसे दबाया जाता है, और मानक बटन इसके लिए बहुत पसंद नहीं करते हैं।

fireplay image

मेरी सलाह मानक WinForms बटन से अपने बटन पाने के साथ जाना नहीं है, लेकिन Control से और अपने आप ड्राइंग करना होगा। यदि यह आपके द्वारा प्रस्तुत किए गए सरल बटन जैसा है, तो आपको केवल इतना करना होगा, केवल DrawString, और यदि यह कुछ और जटिल है, तो आप पर पूरा नियंत्रण होगा।

+2

वाह, अच्छा लग रहा है :) –

+0

यह मेरा एक अच्छा दोस्त द्वारा बनाया गया था: http://studionebo.com/gui.html –

+0

क्या एक डिजाइन, बहुत अच्छा लग रहा है! लिंक अब और काम नहीं कर रहा है। – JohnSaps

7

आपको पूरे बटन को स्वयं खींचने की ज़रूरत नहीं है। बस पाठ संपत्ति खाली अपने पाठ OwnerDrawText

को
public class NoPaddingButton : Button 
{ 
    private string ownerDrawText; 
    public string OwnerDrawText 
    { 
     get { return ownerDrawText; } 
     set { ownerDrawText = value; Invalidate(); } 
    } 

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

     if (string.IsNullOrEmpty(Text) && !string.IsNullOrEmpty(ownerDrawText)) 
     { 
      StringFormat stringFormat = new StringFormat(); 
      stringFormat.Alignment = StringAlignment.Center; 
      stringFormat.LineAlignment = StringAlignment.Center; 

      e.Graphics.DrawString(ownerDrawText, Font, new SolidBrush(ForeColor), ClientRectangle, stringFormat); 
     } 
    } 
} 
1

@Bryan छोड़ने के लिए और आवंटित - दोनों समाधान @Henk रॉक्स और @chiper द्वारा प्रस्तावित सही नहीं कर रहे हैं। पहले किसी भी दृश्य विशेषताओं के बिना बटन उत्पन्न करें और दूसरा हमें OwnerDrawText जैसी नई विशेषता जोड़ने के लिए मजबूर करता है।

नीचे अपना प्रस्ताव देखें। मैं Text संपत्ति को अपने निजी भाग _Text का उपयोग करने में सक्षम होने के लिए ओवरराइड करता हूं और MyBase.OnPaint(e) ईवेंट से पहले String.Empty संलग्न करता हूं। इससे यह बटन टेक्स्ट के बिना खींचा जाता है। बाद में मैंने निजी संपत्ति को पुराने पाठ को फिर से सौंप दिया और खुद को स्ट्रिंग खींचा।मैं Inflate से Rectangle को टेक्स्ट निसर को बस बटन की सीमा को छूने के लिए जोड़ता हूं, इसे ओवरलैप नहीं करता हूं। मेरा प्रस्ताव किसी भी flatstyle के साथ काम करता है।

Here is comparison of standard and no padding button in two flatstyles: standard and flat

Imports System.ComponentModel 
Imports System.Drawing 
Imports System.Windows.Forms 

Public Class ButtonNoPadding 
    Inherits Button 

    Private _textCurrent As String 
    Private _Text As String 

    <Category("Appearance")> 
    Public Overrides Property Text() As String 
     Get 
      Return _Text 
     End Get 
     Set(ByVal value As String) 
      If value <> _Text Then 
       _Text = value 
       Invalidate() 
      End If 
     End Set 
    End Property 

    Protected Overrides Sub OnPaint(e As PaintEventArgs) 

     _textCurrent = Text 
     _Text = String.Empty 
     MyBase.OnPaint(e) 
     _Text = _textCurrent 

     Using brush = New SolidBrush(ForeColor) 
      Using stringFormat = New StringFormat() With {.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center} 
       e.Graphics.DrawString(Text, Font, brush, Rectangle.Inflate(ClientRectangle, -2, -2), stringFormat) 
      End Using 
     End Using 

    End Sub 

End Class 

सी # संस्करण:

using Microsoft.VisualBasic; 
using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.Diagnostics; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 

public class ButtonNoPadding : Button 
{ 

    private string _textCurrent; 

    private string _Text; 
    [Category("Appearance")] 
    public override string Text { 
     get { return _Text; } 
     set { 
      if (value != _Text) { 
       _Text = value; 
       Invalidate(); 
      } 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     _textCurrent = Text; 
     _Text = string.Empty; 
     base.OnPaint(e); 
     _Text = _textCurrent; 

     using (brush == new SolidBrush(ForeColor)) { 
      using (stringFormat == new StringFormat {Alignment = StringAlignment.Center,LineAlignment = StringAlignment.Center}) { 
       e.Graphics.DrawString(Text, Font, brush, Rectangle.Inflate(ClientRectangle, -2, -2), stringFormat); 
      } 
     } 

    } 

} 
संबंधित मुद्दे