私はカスタムのRichTextBox
コントロールを作成して、テキスト領域にグラフィックを追加しています。私が読んできたことから、このコントロールはデフォルトでPaintイベントを公開しません。PAINTSTRUCTの空の更新領域を返すPInvokeからBeginPaintを呼び出す
MSDN(Painting on a RichTextBox Control)の提案に従って、Paintイベントを再度公開し、WM_PAINT
メッセージによってトリガーされるOnPaint
イベントハンドラーを作成しました。
OnPaint
メソッドでは、BeginPaint()
をWin32 APIから呼び出していくつかの図形を描画しようとしていますが、何も描画されていません。 PAINTSTRUCT
構造体内のrcPaint
フィールドを調べると、常に空になります(すべての値は0です)。だから私の質問は、なぜ更新領域は常に空ですか?私は何かを欠いているに違いない。
関連するコード:
public partial class RichTextBoxEnhanced : RichTextBox
{
private PAINTSTRUCT ps;
new public void OnPaint(PaintEventArgs e)
{
var hdc = BeginPaint(this.Handle, out ps);
FillRect(hdc, ref ps.rcPaint, CreateSolidBrush(100));
Rectangle(hdc, 1000, 2000, 1000, 2000);
EndPaint(this.Handle, ref ps);
Paint?.Invoke(this, e);
}
[DllImport("user32.dll")]
static extern IntPtr BeginPaint(IntPtr hwnd, out PAINTSTRUCT lpPaint);
[DllImport("user32.dll")]
static extern bool EndPaint(IntPtr hWnd, [In] ref PAINTSTRUCT lpPaint);
[DllImport("gdi32.dll")]
static extern IntPtr CreateSolidBrush(uint crColor);
}
私は時間によって 'のOnPaintを()'と呼ばれていることを推測しています、.NETがすでに 'BeginPaint関数(と呼ばれた)':
間違っコード:
正しいコード'PaintEventArgs'を取り込むため、返されたDCは' NULL'(失敗を示すため)になるかもしれません... – andlabs
@andlabs、これは確かに問題でした。どうやら、私のOnPaintメソッドに達する前に、Base.WndPrcがBeginPaintを呼び出していました。 –