web-dev-qa-db-ja.com

C#での自動HTMLタグ補完

winformsリッチテキストボックスに自動HTMLタグ機能を実装しようとしています。私はC#の初心者であり、参照が必要だったので、遭遇しました CodeProjectに関するこの記事 。この与えられたコードで:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace AutoCompleteHTMLTags_CSharp
    {
        public partial class Simple_Form : Form
        {
            public Simple_Form()
            {
                InitializeComponent();
            }

            public static String EnteredString = "";
            public static Boolean Is_LessThanKeyPressed = false;
            public static Boolean Is_GreaterThanKeyPressed = false;
            public static Boolean Is_AutoCompleteCharacterPressed = false;
            public Boolean Is_SpaceBarKeyPressed = false;
            public Boolean Is_TagClosedKeyPressed = false;

            public String[] tagslist ={
            "html",
            "head",
            "title",
            "body",
            "h1",
            "h2",
            "h3",
            "h4",
            "h5",
            "h6",
            "b",
            "u",
            "i",
            "sub",
            "sup",
            "center",
            "strike",
            "font",
            "p",
            "style",
            "pre",
            "Marquee",
            "ul",
            "ol",
            "a",
            "img",
            "table",
            "tr",
            "th",
            "td",
            "frameset",
            "iframe",
            "form",
            "input",
            "button",
            "textarea",
            "select",
            "div",
            "fieldset",
            "span",
            "strong",
            "em",
            "big",
            "small"
            };


            public void ProcessAutoCompleteBrackets(String s)
            {
                int sel = richTextBox1.SelectionStart;
                switch (s)
                {
                    case "(":
                        richTextBox1.Text = richTextBox1.Text.Insert(sel, ")");
                        richTextBox1.SelectionStart = sel;
                        Is_AutoCompleteCharacterPressed = true;
                        break;

                    case "[":
                        richTextBox1.Text = richTextBox1.Text.Insert(sel, "]");
                        richTextBox1.SelectionStart = sel;
                        Is_AutoCompleteCharacterPressed = true;
                        break;

                    case "\"":
                        Is_AutoCompleteCharacterPressed = true;
                        richTextBox1.Text = richTextBox1.Text.Insert(sel, "\"");
                        richTextBox1.SelectionStart = sel;
                        break;

                    case "'":
                        richTextBox1.Text = richTextBox1.Text.Insert(sel, "'");
                        richTextBox1.SelectionStart = sel;
                        Is_AutoCompleteCharacterPressed = true;
                        break;
                }
            }



            private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e)
            {
                String ch = e.KeyChar.ToString();


                this.ProcessAutoCompleteBrackets(ch);

                if (ch == "<")
                {
                    Is_LessThanKeyPressed = true;
                    Is_SpaceBarKeyPressed = false;
                    EnteredString = "";
                }
                else if (ch == ">")
                {
                    if (!Is_TagClosedKeyPressed)
                    {
                        Is_GreaterThanKeyPressed = true;
                        Is_SpaceBarKeyPressed = false;

                        int oldsel = richTextBox1.SelectionStart;

                        for (int i = 0; i < tagslist.Length; i++)
                        {
                            if (EnteredString == tagslist[i])
                            {
                                richTextBox1.Text = richTextBox1.Text.Insert(oldsel, "</" + tagslist[i] + ">");
                                richTextBox1.SelectionStart = richTextBox1.SelectionStart + oldsel;
                                EnteredString = "";
                            }
                        }

                        Is_LessThanKeyPressed = false;
                    }
                    else
                    {
                        Is_TagClosedKeyPressed = false;
                    }
                }

                else
                {
                    if (Is_LessThanKeyPressed)
                    {
                        for (char a = 'a'; a <= 'z'; a++)
                        {
                            if (a.ToString() == ch)
                            {
                                EnteredString += ch;
                            }
                            else if (a.ToString().ToUpper() == ch)
                            {
                                EnteredString += ch;
                            }
                        }
                        for (int a = 0; a <= 9; a++)
                        {
                            if (a.ToString() == ch)
                            {
                                EnteredString += ch;
                            }
                        }
                    }
                }


                // if user itself closes the tag
                if (Is_LessThanKeyPressed)
                {
                    if (ch == "/")
                    {
                        Is_TagClosedKeyPressed = true;
                        Is_SpaceBarKeyPressed = true;
                        EnteredString = "";
                    }
                }
            }

            private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
            {
                switch (e.KeyCode)
                {
                    case Keys.Space:
                        Is_SpaceBarKeyPressed = true;

                        if (Is_GreaterThanKeyPressed)
                        {
                            Is_GreaterThanKeyPressed = false;
                        }
                        Is_LessThanKeyPressed = false;

                        for (int i = 0; i < tagslist.Length; i++)
                        {
                            if(EnteredString==tagslist[i])
                            {
                                EnteredString = tagslist[i];
                            }
                        }
                        break;

                    case Keys.Up:
                        if (Is_AutoCompleteCharacterPressed == false)
                        {
                            EnteredString = "";
                            Is_AutoCompleteCharacterPressed = false;
                        }
                        Is_SpaceBarKeyPressed = false;
                        break;

                    case Keys.Down:
                        if (Is_AutoCompleteCharacterPressed == false)
                        {
                            EnteredString = "";
                            Is_AutoCompleteCharacterPressed = false;
                        }
                        Is_SpaceBarKeyPressed = false;
                        break;

                    case Keys.Left:
                        if (Is_AutoCompleteCharacterPressed == false)
                        {
                            EnteredString = "";
                            Is_AutoCompleteCharacterPressed = false;
                        }
                        Is_SpaceBarKeyPressed = false;
                        break;

                    case Keys.Right:
                        if (Is_AutoCompleteCharacterPressed == false)
                        {
                            EnteredString = "";
                            Is_AutoCompleteCharacterPressed = false;
                        }
                        Is_SpaceBarKeyPressed = false;
                        break;

                    case Keys.Enter: EnteredString = "";
                        Is_SpaceBarKeyPressed = false;
                        break;

                    case Keys.Back:
                        int sel = richTextBox1.SelectionStart;
                        Point pt = richTextBox1.GetPositionFromCharIndex(sel);
                        char ch = richTextBox1.GetCharFromPosition(pt);
                        if (EnteredString.Length > 0)
                        {
                            if (ch != '>')
                            {
                                EnteredString = EnteredString.Remove(EnteredString.Length - 1);
                                Is_LessThanKeyPressed = true;
                            }
                        }
                        if (ch == '<')
                        {
                            EnteredString = "";
                        }
                        break;
                }
            }
        }
    }

問題:

実装は正常に機能します。唯一の問題は、<html>(またはその他のキーワード)を入力すると、補完が</html>になりますが、最後までスクロールしますTextBox

Demo of Auto tags

誰でもこれを修正する方法を知っていますか?

4
Kirtstar web

スクロール位置などの低レベルのメッセージをいじくり回したい場合は、Win32メッセージレベルにドロップする必要があります。RTBでは、箱から出して細かい制御を行うことはできません。

具体的には、 EM_GETSCROLLPOS および EM_SETSCROLLPOS を確認します。これらは、左上隅に表示する文字のスクロール構造(つまり、スクロール位置)をそれぞれ返し、設定します。 。現在のスクロール位置を保存し、文字列を編集して、スクロール位置を以前に保存した位置に戻します。

0
Blindy