none
RichTextBoxにテキストを縦書き書式で表示する方法 RRS feed

  • 質問

  • 縦書きプロパティを実装するために、RichTextBoxから継承してRichTextExを作成しVerticalTextプロパティを実装します:

        public class RichTextEx : RichTextBox
        {
            [DllImport("User32.dll")]
            private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
    
            private const uint EM_SETOPTIONS = 0x44d;
            private const uint EM_GETOPTIONS = 0x44e;
            private const int ECOOP_SET = 0x1;
            private const int ECOOP_OR = 0x2;
            private const int ECOOP_AND = 0x3;
            private const int ECOOP_XOR = 0x4;
            private const int ES_VERTICAL = 0x400000;
            
            public virtual bool VerticalText
            {
                get
                {
                    int ret = SendMessage(this.Handle, EM_GETOPTIONS, 0, 0);
                    if ((ret & ES_VERTICAL) != 0) return true; else return false;
                }
                set
                {
                    if(value == true)
                    {
                        SendMessage(this.Handle, EM_SETOPTIONS, ECOOP_OR, ES_VERTICAL);
                    } else
                    {
                        SendMessage(this.Handle, EM_SETOPTIONS, ECOOP_AND, ~ES_VERTICAL);
                    }
                }
            }
        }

    しかし、VerticalTextプロパティをtrueに設定しようとしても、ずっとfalseのままです。どうすればいいですか?



    2016年12月9日 3:38

回答

  • using System;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public class RichTextEx : RichTextBox
        {
            [DllImport("kernel32.dll")]
            private static extern IntPtr LoadLibrary(string path);
    
            [DllImport("User32.dll")]
            private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
    
            private const uint EM_SETOPTIONS = 0x44d;
            private const uint EM_GETOPTIONS = 0x44e;
            private const int ECOOP_SET = 0x1;
            private const int ECOOP_OR = 0x2;
            private const int ECOOP_AND = 0x3;
            private const int ECOOP_XOR = 0x4;
            private const int ES_VERTICAL = 0x400000;
    
            protected override CreateParams CreateParams
            {
                get
                {
                    LoadLibrary("msftedit.dll");
                    CreateParams createParams = base.CreateParams;
                    createParams.ClassName = "RichEdit50W";
                    return createParams;
                }
            }
    
            public virtual bool VerticalText
            {
                get
                {
                    int ret = SendMessage(this.Handle, EM_GETOPTIONS, 0, 0);
                    if ((ret & ES_VERTICAL) != 0) return true; else return false;
                }
                set
                {
                    if (value == true)
                    {
                        SendMessage(this.Handle, EM_SETOPTIONS, ECOOP_OR, ES_VERTICAL);
                    }
                    else
                    {
                        SendMessage(this.Handle, EM_SETOPTIONS, ECOOP_AND, ~ES_VERTICAL);
                    }
                }
            }
        }
    
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                RichTextEx myText = new RichTextEx();
                myText.VerticalText = true;
                myText.Location = new Point(25, 25);
                this.Controls.Add(myText);
            }
        }
    }
    

    RichTextBoxの標準のリッチエディットのバージョンは縦書きには対応していないみたいですね。RichEdit50Wを使うようにすると縦書きができるようです。
    2016年12月9日 5:23

すべての返信

  • using System;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public class RichTextEx : RichTextBox
        {
            [DllImport("kernel32.dll")]
            private static extern IntPtr LoadLibrary(string path);
    
            [DllImport("User32.dll")]
            private static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
    
            private const uint EM_SETOPTIONS = 0x44d;
            private const uint EM_GETOPTIONS = 0x44e;
            private const int ECOOP_SET = 0x1;
            private const int ECOOP_OR = 0x2;
            private const int ECOOP_AND = 0x3;
            private const int ECOOP_XOR = 0x4;
            private const int ES_VERTICAL = 0x400000;
    
            protected override CreateParams CreateParams
            {
                get
                {
                    LoadLibrary("msftedit.dll");
                    CreateParams createParams = base.CreateParams;
                    createParams.ClassName = "RichEdit50W";
                    return createParams;
                }
            }
    
            public virtual bool VerticalText
            {
                get
                {
                    int ret = SendMessage(this.Handle, EM_GETOPTIONS, 0, 0);
                    if ((ret & ES_VERTICAL) != 0) return true; else return false;
                }
                set
                {
                    if (value == true)
                    {
                        SendMessage(this.Handle, EM_SETOPTIONS, ECOOP_OR, ES_VERTICAL);
                    }
                    else
                    {
                        SendMessage(this.Handle, EM_SETOPTIONS, ECOOP_AND, ~ES_VERTICAL);
                    }
                }
            }
        }
    
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                RichTextEx myText = new RichTextEx();
                myText.VerticalText = true;
                myText.Location = new Point(25, 25);
                this.Controls.Add(myText);
            }
        }
    }
    

    RichTextBoxの標準のリッチエディットのバージョンは縦書きには対応していないみたいですね。RichEdit50Wを使うようにすると縦書きができるようです。
    2016年12月9日 5:23
  • 助かりました!ありがとうございます。
    2016年12月9日 6:03