校果如下图所示;(控件的宽度是可调整的,在下划线上可直接填写答案。)

解决方案 »

  1.   

    尽输入的地方,textbox就可以实现的,tag属性可以保存对应的题目id,mousehover时,就可以读取答案
      

  2.   

    我是期望把它做成一个控件。1. 其它文字用什么控件来显示呢?
    2.填空部分(TextBox只显示一条下划线)如何实现
    3.由于宽度不确定,每个题的'空"的数量也不确定,该如何处理? 
      

  3.   

    每个题目中需要填写的部分用你自定义的协议字符串来代替(字符串包含了正确答案),当你解析这个题目的时候解析到填空的地方就draw一个文本框
      

  4.   

    直接用_______这个现实,当点击的时候,判断是不是点在了____上面了,如果是,就Show一个TextBox控件处理啊,并设置TextBox的位置和大小刚好覆盖_______这个地方
    当点击其他地方的时候,把____替换为答案,并设置答案为粗体,
    当点击到粗体的文字,Show一个TextBox,并把TextBox的内容设置为粗体的文字。
      

  5.   


    这是一个方法。我图片所示的内容,好像就是所内容显示在RichTextBox中,在下划线处就是TextBox控件。
    但TextBox放在____处,这个位置不好精确控制。能说一下如何把TextBox刚好放在____位置吗?
      

  6.   


    这是一个方法。我图片所示的内容,好像就是所内容显示在RichTextBox中,在下划线处就是TextBox控件。
    但TextBox放在____处,这个位置不好精确控制。能说一下如何把TextBox刚好放在____位置吗?用下面这三个函数就可以完成了!richTextBox1.GetCharFromPosition();
    richTextBox1.GetCharIndexFromPosition();
    richTextBox1.GetPositionFromCharIndex();
      

  7.   

    //以下是循环创建textbox
               for (int i = 0; i <= ctrlName.Count - 1; i++)
               {
                   k = richTextBox1.Text.IndexOf(_LINE, (i==0?0:  k+_LINE.Length) );
                   if (k > -1)
                   {
                       Point xx = richTextBox1.GetPositionFromCharIndex(k);//获取当前下划线的Point
                       lrCtrlComponent.myTextBox t = new lrCtrlComponent.myTextBox();//这是一个TextBox的自定义控件(此textbox只有下边框)
                       t.Name = ctrlName[i].ToString();
                       t.Size = new System.Drawing.Size(this._TextBoxLength , 28);
                       t.Location = new Point(xx.X, xx.Y  + 15);//y值+15是根据显示效果调整出来的值
                       t.Font = new Font("宋体", 9, FontStyle.Bold);   //如果字号调大点后,文框框与文字更是对不整齐。
                       this.richTextBox1.Controls.Add(t);
                       t.Visible = true;
                   }           }
    //当resize或VScroll时,生成的textbox要与_______一起移动。
            void changeTextBoxPoint()
            {
                 int i = 0;
                int L = 0;//位置
                for (i = 0; i <= richTextBox1.Controls.Count - 1; i++) 
                {
                    if (richTextBox1.Controls[i].GetType().ToString() == "lrCtrlComponent.myTextBox")
                    {
                        CET.lrCtrlComponent.myTextBox   txt = (CET.lrCtrlComponent.myTextBox ) richTextBox1.Controls[i];
                        L = richTextBox1.Text.IndexOf(_LINE, L+(L==0?0: _LINE.Length) );
                        Point xx= richTextBox1.GetPositionFromCharIndex(L);
                        txt.Location = new Point(xx.X, xx.Y + 15);
                        txt.Size = new Size(this._TextBoxLength , 28);
                    }
                }
            }
    效果;
    请帮忙看一下,怎么更能精确控制textbox与文字能真正底部对齐
      

  8.   

    添加标准的TextBox截图如下:
    该如何解决????
      

  9.   

    原因基本找到。由于//获取当前下划线的Point  (它是获取文字左上角顶点的Point值)
    Point xx = richTextBox1.GetPositionFromCharIndex(k); 
    由于本RichTextBox中内容的格式设置有:
     1.段前距:5 磅  
     2.行距:20 磅
    因此每段的第一行与其它行的行高不同。要想TextBox对文字底部对齐:因此TextBox的位置应在(假定TextBox高为28):Point xx = richTextBox1.GetPositionFromCharIndex(k); 
    textbox.Location=new point (xx.X, xx.Y- (当前行高-textbox.height));
    目前的问题是如何获取RichTextBox的每行的行高值。
    baikdu了N久也没找到C#中如何获取当行高的资料..
      

  10.   

    用这个函数richTextBox1.GetPositionFromCharIndex(...)
    两行各区一个字符去获取他的位置,然后Y坐标相减。
    这样可以不?
      

  11.   

    搞定。
    用下一行的y值-上行的y值,这样应是本行高。这个我没试,估计应可以。我是直接读rtf格式设置参数。