【发布时间】:2016-11-21 20:03:31
【问题描述】:
我一直致力于创建一个自定义的RichTextBox 控件,以向文本区域添加一些额外的图形。根据我一直在阅读的内容,此控件默认情况下不会公开其 Paint 事件。
我按照 MSDN (Painting on a RichTextBox Control ) 上的建议重新公开 Paint 事件并创建由 WM_PAINT 消息触发的 OnPaint 事件处理程序。
在OnPaint 方法中,我尝试从Win32 API 调用BeginPaint() 来绘制一些形状,但没有绘制任何内容。当我检查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,这确实是问题所在。显然 base.WndPrc 在到达我的 OnPaint 方法之前调用了 BeginPaint。
标签: c# winforms winapi pinvoke