2

テキスト入力を可能にするWinFormsコントロールをC#で作成しています(VS2008、.net 3.5を使用)。通常のWindowsカレットを表示するために必要なWin32API関数をUser32.dllからインポートしましたが、これらはすべて正常に機能していますが、希望どおりに表示されていません。

テキストは空白の境界線でコントロールに表示され、Graphics.SetClip()を使用してこのマージンをクリアにします。カレットを同じ領域にクリップしたいのですが、ペイントせず、クリッピング領域を設定するための明確なAPI関数がないため、これを行う方法がわかりません。明らかなことを見逃したことがありますか?

カレットは、それが描かれているコントロールの内側にクリップされています。したがって、1つの解決策は、境界線のない別のサブコントロールにテキストを配置することである可能性があることを認識しています。ただし、コントロールのこの部分を再設計するよりも簡単な方法がある場合は、最初にそれを探します。

助けてくれてありがとう!

4

2 に答える 2

2

現在クリップしている領域をSetClip()ウィンドウの真のクライアント領域として定義するのはどうですか? (オーバーライドすることによりWM_NCCALCSIZE)。

于 2010-05-09T12:01:09.123 に答える
0

それで、あなたの問題は、デフォルトのキャレットがマージン領域に「出血」していることであることを正しく理解しましたか?

あなたが言及したように、テキストをセカンダリまたはサブコントロールに配置するのが最善のオプションだと思います。要件に適合する可能性のある、検討できるその他の 2 つのオプション

1- CreateCaret を使用して、クリップされた領域に収まる小さなカーソルを作成します。もちろん、境界スペースにキャレットを配置しないようにする必要があります。

[DllImport("user32", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private extern static bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight);

// Create a caret which is 2 pixels wide by 8 high
CreateCaret(theControl.Handle, IntPtr.Zero, 2, 8);

2-おそらくあまり役​​に立たない別のオプションですが、キャレットがクリップされるため、言及します。Control.Region を使用して、ウィンドウ全体を必要なクリッピング領域にクリッピングします。もちろん、これは境界領域もクリップしますが、これは問題になる場合とそうでない場合があります。背景が境界に侵入しないような性質のものであるかどうかによって異なりますが、基本的にすべての境界は透明になります。

しかし、結局のところ、サブコントロールを使用するオプションが最も多くのコントロールを提供すると思います。

于 2010-05-07T19:15:11.900 に答える