簡體   English   中英

用於自定義控件的內容對齊

[英]Content Alignment For Custom Control

我正在編寫自己的控件庫。 我正在使用復選框控件,需要幫助的最后一件事是繪制與文本相關的復選框。 我有一個ContentAlignment屬性,該屬性可以更改文本在控件中的顯示位置,但是我不確定如何調整復選框,因為我不知道如何獲取文本在控件中的位置。

    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics canvas = e.Graphics;
        canvas.SmoothingMode = SmoothingMode.HighQuality;
        int x = 0;
        int y = (int)(canvas.MeasureString(this.Text, this.Font).Height - 12) / 2;
        switch (this.Style)
        {
            case E.CheckBoxStyle.Check:
                canvas.DrawRectangle(new Pen(this.BorderColor), new Rectangle(x, y, 12, 12));
                if (this.Checked)
                    canvas.DrawString("√", new Font("serif", 7f, FontStyle.Bold), Brushes.Black, 1f, 3f);
                break;
            case E.CheckBoxStyle.Round:
                canvas.DrawEllipse(new Pen(this.BorderColor), new Rectangle(x, y, 12, 12));
                if (this.Checked)
                {
                    Rectangle region = new Rectangle(x + 1, y + 1, 10, 10);
                    canvas.FillEllipse(Functions.CreateGradient(region, this.FillColor, 90), region);
                }
                break;
            case E.CheckBoxStyle.Square:
                canvas.DrawRectangle(new Pen(this.BorderColor), new Rectangle(x, y, 12, 12));
                if (this.Checked)
                {
                    Rectangle region = new Rectangle(x + 1, y + 1, 10, 10);
                    canvas.FillRectangle(Functions.CreateGradient(region, this.FillColor, 90), region);
                }
                break;
        }
        if (!this.AutomaticSize)
        {
            StringFormat format = new StringFormat();
            switch (this.Alignment)
            {
                case ContentAlignment.TopRight:
                    format.Alignment = StringAlignment.Far;
                    format.LineAlignment = StringAlignment.Near;
                    break;
                case ContentAlignment.TopLeft:
                    format.Alignment = StringAlignment.Near;
                    format.LineAlignment = StringAlignment.Near;
                    break;
                case ContentAlignment.TopCenter:
                    format.Alignment = StringAlignment.Center;
                    format.LineAlignment = StringAlignment.Near;
                    break;
                case ContentAlignment.MiddleRight:
                    format.Alignment = StringAlignment.Far;
                    format.LineAlignment = StringAlignment.Center;
                    break;
                case ContentAlignment.MiddleLeft:
                    format.Alignment = StringAlignment.Near;
                    format.LineAlignment = StringAlignment.Center;
                    break;
                case ContentAlignment.MiddleCenter:
                    format.Alignment = StringAlignment.Center;
                    format.LineAlignment = StringAlignment.Center;
                    break;
                case ContentAlignment.BottomRight:
                    format.Alignment = StringAlignment.Far;
                    format.LineAlignment = StringAlignment.Far;
                    break;
                case ContentAlignment.BottomLeft:
                    format.Alignment = StringAlignment.Near;
                    format.LineAlignment = StringAlignment.Far;
                    break;
                case ContentAlignment.BottomCenter:
                    format.Alignment = StringAlignment.Center;
                    format.LineAlignment = StringAlignment.Far;
                    break;
            }
            canvas.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), ClientRectangle, format);
        }
        else
        {
            canvas.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), 14f, 0f);
            Size newSize = Size.Round(canvas.MeasureString(this.Text, this.Font));
            this.Size = new Size(newSize.Width + 14, newSize.Height);
        }
    }

我想,一種解決方案是完全剝奪財產。 但這並不理想。 另一個,我認為制作一個包含復選框和文本的矩形,並相應地移動該矩形,但是我不知道如何實現。 謝謝你的幫助! 這是一張有助於說明問題的圖片:

您可以使用我編寫的此擴展名來代替switch語句中使用的任何過多代碼:

public static Point AlignDrawingPoint(this Graphics g, Size objectSize, Rectangle clientRectangle, ContentAlignment alignment)
{
    int margin = 4;
    Point center = new Point((clientRectangle.Width >> 1) - (objectSize.Width >> 1), (clientRectangle.Height >> 1) - (objectSize.Height >> 1));
    int rightMargin = clientRectangle.Width - (objectSize.Width + margin);
    int bottomMargin = clientRectangle.Height - (objectSize.Height + margin);
    Point p = Point.Empty;
    switch (alignment)
    {
        case ContentAlignment.TopLeft:
            p = new Point(margin, margin);
            break;
        case ContentAlignment.TopCenter:
            p = new Point(center.X, margin);
            break;
        case ContentAlignment.TopRight:
            p = new Point(rightMargin, margin);
            break;
        case ContentAlignment.MiddleLeft:
            p = new Point(margin, center.Y);
            break;
        case ContentAlignment.MiddleCenter:
            p = new Point(center.X, center.Y);
            break;
        case ContentAlignment.MiddleRight:
            p = new Point(rightMargin, center.Y);
            break;
        case ContentAlignment.BottomLeft:
            p = new Point(margin, bottomMargin);
            break;
        case ContentAlignment.BottomCenter:
            p = new Point(center.X, bottomMargin);
            break;
        case ContentAlignment.BottomRight:
            p = new Point(rightMargin, bottomMargin);
            break;
    }
    p.Offset(clientRectangle.X, clientRectangle.Y);
    return p;
}

您可以將此擴展名不僅用於繪制字符串,還可以在需要對齊矩形中需要繪制的任何內容時使用此擴展名。

但是在您的情況下,您將執行以下操作:

g.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), AlignDrawingPoint(g.MeasureString(this.Text, this.Font).ToSize(), this.ClientRectangle, this.TextAlign));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM