【发布时间】:2011-11-23 17:10:54
【问题描述】:
为了在ComboBox(或其他任何东西)上绘制文本,我覆盖WndProc() 并捕获0x000F 消息——即WM_PAINT。
代码如下:
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
If m.Msg = &HF Then
TextRenderer.DrawText(CreateGraphics, "The text over my control.", Font, _
ClientRectangle, ForeColor)
End If
End Sub
效果很好,但是有一个问题:如果我将父窗口拖到屏幕的一侧(为了隐藏窗口窗体的一部分),我的控件的可见部分会被无限重绘。这会使文本重新绘制在自身之上!
我想有一种方法可以只绘制控件的无效(隐藏)部分。我该怎么办?
编辑
这是一张图片中的问题:http://i.stack.imgur.com/WqGfI.png(这是一个链接,因为我现在无法发布图片。)
更新
我尝试使用 BeginPaint API,但返回的 PAINTSTRUCT 结构中包含的 RECT 结构只包含零。
If m.Msg = WM_PAINT Then
Dim ps As PAINTSTRUCT = New PAINTSTRUCT
BeginPaint(Handle, ps)
Console.WriteLine(ps.rcPaint.right)
'painting goes here
EndPaint(Handle, ps)
End If
我可以用它做点什么吗?我不知道如何继续,以便仅绘制无效区域。
【问题讨论】:
-
有什么特别的理由在这里使用低级窗口处理而不是控件的
Paint事件? -
这是因为
ComboBox(或ListView,我也在使用它)永远不会触发OnPaint。我读到这些控件不是由框架绘制的,而是由操作系统绘制的。 -
其实是
Me.CreateGraphics。这个方法是否准确地检索了我的控件的设备上下文图形(我要在哪里绘画)?