C# 如何绘制位置标志?

C# 如何绘制位置标志?,c#,.net,winforms,textbox,ownerdrawn,C#,.net,Winforms,Textbox,Ownerdrawn,我用C#为Winforms编写自己的文本框控件 有一件事我搞不懂:如何画各种尺寸的文字位置标志 试试这个 我创建了一个方法,该方法将从正在绘制的控件的绘制处理程序中调用。为了简单起见,我只是在我的表格中使用了表格本身。您可能有一个面板或其他控件 该方法接受图形对象、光标的比例以及开始绘制的位置的上/左位置。比例只是高度,但所有数学运算都是相对于高度执行的。你可以任意调整这些数字 private void Form1_Paint(object sender, PaintEventArgs

我用C#为Winforms编写自己的文本框控件

有一件事我搞不懂:如何画各种尺寸的文字位置标志

试试这个

我创建了一个方法,该方法将从正在绘制的控件的绘制处理程序中调用。为了简单起见,我只是在我的表格中使用了表格本身。您可能有一个面板或其他控件

该方法接受图形对象、光标的比例以及开始绘制的位置的上/左位置。比例只是高度,但所有数学运算都是相对于高度执行的。你可以任意调整这些数字

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        DrawCaret(e.Graphics, 30, new Point(20, 20));
        DrawCaret(e.Graphics, 50, new Point(100, 100));
    }

    private static void DrawCaret(Graphics g, int scale, Point loc)
    {
        g.SmoothingMode = SmoothingMode.HighQuality;

        int height = scale;
        int width = scale/10;
        int rectBase = scale/5;

        g.FillRectangle(Brushes.Black, loc.X, loc.Y, width, height);

        var path = new GraphicsPath();
        path.AddPolygon(new[]
                            {
                                new Point(loc.X+width, loc.Y),
                                new Point(loc.X+width+rectBase/2, loc.Y+rectBase/2),
                                new Point(loc.X+width, loc.Y+rectBase),
                            });
        g.FillPath(Brushes.Black, path);
    }
此示例生成以下输出:


它被称为“插入符号”。winapi函数不是由winforms包装的,您必须对它们进行pinvoke。开始您可以在我的答案中找到代码。

您为什么要编写自己的文本框control@Matti:.NET所有者绘制的控件很有趣!要让一个由所有者绘制的文本框正常工作是非常困难的。一旦你开始像这样重新发明轮子,你就会注意到你错过了很多你认为在Windows实现中理所当然的基本东西。您的控件不支持从右到左的语言(不是世界上所有人都喜欢阅读英语),您无法获得IME支持,等等。所以,认真地说,重新考虑一下你是否真的想滚动你自己的文本框。如果这不是出于个人学习目的,答案是否定的。那么,“文本位置符号”是什么?如果你说的是光标,那么在你显示的图片中,它顶部的三角形是什么?自定义文本框的原因是:“光标”是你用鼠标移动的箭头。他说的是插入符号,文本框中的垂直条。是的,我读了你的答案后才想起。相应地重构了代码示例。谢谢。此方法唯一的问题是不支持ClearType。ClearType样式渲染只需将
SmoothingMode
设置为
High Quality
。这将为您执行很好的抗锯齿,并与清晰的文本类型进行很好的匹配。请参阅我在DrawCaret方法顶部添加的代码行。@DxCK:它不可能支持ClearType。你没有画任何文字!