2011-04-30 71 views
1

我在C#for Winforms中编写我自己的文本框控件。如何绘制位置标记?

有一件事我想不通:如何绘制在各种尺寸的文本位置标志?

Text position sign

+3

为什么你写你自己的TextBox控件 – 2011-04-30 16:27:13

+0

@Matti:.NET所有者绘制控件的乐趣! – 2011-04-30 16:27:55

+1

*非常*很难让所有者绘制的文本框正常工作。一旦你开始像这样重新发明轮子,你会注意到你错过了很多在Windows实现中被认为是理所当然的基本东西。您的控件不支持从右向左的语言(并非世界上的每个人都喜欢阅读英文),您不会获得IME支持等等。所以,重要的是,重新考虑你是否真的想要推出自己的文本框。如果这不是用于个人学习目的,答案是**否**。 – 2011-04-30 16:34:00

回答

0

试试这个。

我创建这是指从哪个控制你在绘制油漆处理程序调用的方法。为了简单起见,我刚才在我的窗体本身。你可能有一个面板或其他控制。

该方法接受的图形对象时,光标的规模和从哪里开始抽出上部/左位置。规模只是高度,但所有数学都是相对于高度进行的。你可以用你想要的方式调整这些数字。

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); 
    } 

此示例产生以下输出:

sample

+1

'游标'是你用鼠标移动的箭头。他正在谈论插入符号,文本框中的垂直条。 – 2011-04-30 16:42:39

+0

是的,我在阅读你的答案后才回想起来。相应地重构代码示例。 – 2011-04-30 16:44:36

+0

谢谢。这种方法唯一的问题是它不支持ClearType。 – DxCK 2011-04-30 19:00:46

2

这就是所谓的 '^符号'。 winapi函数没有被winforms包装,你必须拼凑它们。开始reading here。你会在我的回答here中找到代码。

相关问题