独自に作成したウィンドウコントロールのコンポーネントにキャレットを表示する - C#

独自に作成したウィンドウコントロールにキャレットを表示します。

キャレットの表示はWindows APIを用います。
用いるAPIは以下になります
  • CreateCaret
    • キャレットを作成します
  • DestroyCaret
    • キャレットを廃棄します
  • SetCaretpos
    • キャレットの表示位置を設定します
  • ShowCaret
    • キャレットを表示します
  • HideCaret
    • キャレットを非表示にします

コード

コンポーネント側

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Security.Permissions;
using System.Drawing;
using System.Runtime.InteropServices;

namespace WinformVisualComponent
{
  public partial class VisualComponent : Control
  {
    private static int counter = 0;

    [DllImport("user32.dll")]
    static extern bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight);

    [DllImport("user32.dll")]
    static extern bool DestroyCaret();

    [DllImport("user32.dll")]
    static extern bool SetCaretPos(int X, int Y);

    [DllImport("user32.dll")]
    static extern bool ShowCaret(IntPtr hWnd);

    [DllImport("user32.dll")]
    static extern bool HideCaret(IntPtr hWnd);
   
    public VisualComponent()
    {
      InitializeComponent();
    }

    public VisualComponent(IContainer container)
    {
      container.Add(this);
      InitializeComponent();
    }

    public void CreateShowCaret()
    {
      CreateCaret(this.Handle, IntPtr.Zero, 2, 16);
      SetCaretPos(32, 32);
      ShowCaret(this.Handle);
    }

    public void CaretHide()
    {
      HideCaret(this.Handle);
    }
  }
}
解説
public void CreateShowCaret()
{
  CreateCaret(this.Handle, IntPtr.Zero, 2, 16);
  SetCaretPos(32, 32);
  ShowCaret(this.Handle);
}
CreateCaret APIを呼び出し、キャレットを作成します。第一引数にキャレットを表示するコントロールのウィンドウハンドル、第二引数はNULLを第三引数はキャレットの幅、第四引数はキャレットの高さを与えます。キャレットの作成後SetCaretPos APIを呼び出しキャレットの表示位置を設定します。表示位置の設定後にShowCaret APIを呼び出しキャレットをコントロールに表示します。

public void CaretHide()
{
  HideCaret(this.Handle);
}
HideCaret APIを呼び出しキャレットを非表示にします。

アプリケーション側

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

namespace WinformVisualComponent
{
  public partial class SubFormCaret : Form
  {
    public SubFormCaret()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      visualComponent1.CreateShowCaret();
      visualComponent1.Focus();
    }

    private void button2_Click(object sender, EventArgs e)
    {
      visualComponent1.CaretHide();
    }
  }
}
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2011-12-01
iPentec all rights reserverd.