C# การเปลี่ยนขนาดของข้อความปุ่ม

ฉันต้องการให้แบบอักษรขนาดของปุ่มเปลี่ยนแปลงแบบไดนามิก เมื่อฉันเปลี่ยนขนาดของปุ่ม จนถึงตอนนี้ ฉันได้วางปุ่มไว้ที่ตำแหน่งที่ถูกต้องแล้ว และขนาดของปุ่มก็เปลี่ยนไปเมื่อฉันปรับขนาดแบบฟอร์ม แต่เมื่อปุ่มมีขนาดเล็กลงสำหรับข้อความในปุ่ม ตัวอักษรก็จะ 'หลุด' ออกมา

ฉันจะเปลี่ยนขนาดของข้อความปุ่มตามขนาดของปุ่มได้อย่างไร


person Stujo    schedule 26.10.2016    source แหล่งที่มา
comment
มันเป็น WinForms ขออภัยสำหรับสิ่งนั้น...   -  person Stujo    schedule 26.10.2016


คำตอบ (4)


หากต้องการให้ข้อความในปุ่มตอบสนอง ให้ใช้โค้ดต่อไปนี้:

    //paint event from button:
    private void button1_Paint(object sender, PaintEventArgs e)
    {
        float fontSize = NewFontSize(e.Graphics, button1.Size, button1.Font, button1.Text);

        // set font with Font Class and the returned Size from NewFontSize();
        Font f = new Font("Arial", fontSize, FontStyle.Bold);
        button1.Font = f;
    }

    // method to calculate the size for the font:
    public static float NewFontSize(Graphics graphics, Size size, Font font, string str)
    {
        SizeF stringSize = graphics.MeasureString(str, font);
        float wRatio = size.Width / stringSize.Width;
        float hRatio = size.Height / stringSize.Height;
        float ratio = Math.Min(hRatio, wRatio);
        return font.Size * ratio;
    }

ตัวอย่างโค้ดที่ใช้งานจริง:

ตัวอย่างโค้ดที่ใช้งานจริง

อย่างที่คุณเห็นแบบอักษรจะสามารถปรับขนาดได้ภายในปุ่ม และข้อความจะไม่ถูกโยนออกจากปุ่ม คุณยังสามารถใช้สิ่งนี้กับคอนโทรลเลอร์อื่นได้เช่นกัน

person Timon Post    schedule 26.10.2016
comment
และฉันจะเปลี่ยนแบบไดนามิกตามขนาดของปุ่มได้อย่างไร? - person Stujo; 26.10.2016
comment
ฉันได้เปลี่ยนโพสต์ของฉันและฉันพบวิธีที่จะบรรลุผลนี้ @สตูโจ - person Timon Post; 26.10.2016

เนื่องจากคุณไม่ได้ให้รายละเอียดเกี่ยวกับแบบอักษร ขนาด และอื่นๆ ฉันจะยกตัวอย่างข้อมูลทั่วไปเพื่อชี้ให้คุณไปในทิศทางที่ถูกต้อง โปรดแก้ไขพารามิเตอร์ตามความต้องการของคุณ

Button button = (Button)sender;
button.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));

หรือแม้แต่สิ่งที่ง่ายกว่านี้

button.Font = new Font("Microsoft Sans Serif", 10);
person Vadzim Savenok    schedule 26.10.2016
comment
และฉันจะเปลี่ยนแบบไดนามิกตามขนาดของปุ่มได้อย่างไร? - person Stujo; 26.10.2016
comment
button.Font = new Font(button.Font.FontFamily, button.Font.Size*1.1f);? มีหรือไม่มีส่วน *1.1f?... - person Vadzim Savenok; 26.10.2016

คุณต้องการตรวจสอบความสูงและความกว้างของปุ่มก่อน

จากนั้นเขียนโค้ดวนซ้ำบนฟอนต์ 1pt เป็นประมาณ 200

ในการเรียกแต่ละครั้ง TextRenderer.MeasureText(button.text, button.font); ส่งแบบอักษรเดียวกันแต่มีขนาดพอยต์จากลูป

จากนั้นตรวจสอบว่าความสูงและความกว้างจาก MeasureText พอดีกับขีดจำกัดของปุ่มที่คุณกำหนดไว้หรือไม่ ถ้ามันพอดีลองขนาดที่สูงขึ้นถัดไป หากไม่พอดี ขนาดตัวอักษรที่ดีที่สุดหากเป็นขนาดก่อนหน้า

person Franck    schedule 26.10.2016
comment
และฉันจะเปลี่ยนแบบไดนามิกตามขนาดของปุ่มได้อย่างไร? - person Stujo; 26.10.2016
comment
เชื่อมโยงกับเหตุการณ์ของปุ่มเพื่อทริกเกอร์โค้ดนี้เหมือนกับเหตุการณ์ SizeChanged - person Franck; 26.10.2016

สำหรับการเปลี่ยนแปลงแบบไดนามิก ฉันจะลองแบบนี้ แต่เป็นเพียงการแก้ปัญหาการเปลี่ยนแปลงแบบไดนามิกเท่านั้น ในการตรวจสอบความกว้างของข้อความ คุณต้องใช้ฟังก์ชันเพิ่มเติมกับโค้ดนี้

    public class MyButton : Button
{
    public MyButton()
    {

    }

    public override bool AutoSize {
        get {
            return false;
        }
        set {
            base.AutoSize = false;
        }
    }

    protected override void OnSizeChanged(EventArgs e)
    {
        base.OnSizeChanged(e);

        Font = new Font(this.Font.FontFamily,Height-10,this.Font.Style,GraphicsUnit.Pixel);

    }
}
person OndrejMikulec    schedule 27.10.2016