【发布时间】:2014-12-10 02:26:47
【问题描述】:
我试图在窗口周围绘制一个矩形(窗口内部,而不是外部),但绘图有污点,在某些情况下不会重绘。
我将 HWND WndProc 子类化了(代码当然在 HWND 进程中运行):
class SubClasser : NativeWindow
{
...
protected override void WndProc(ref Message m)
{
switch(m.Msg)
{
case 0x85: // WM_CPAINT
case 0xf: // WM_PAINT
{
base.WndProc(ref m);
Rectangle r = GetWndRect(this.Handle);
g.DrawRectangle(p, r);
Trace.WriteLine("WM_PAINT: "+r.ToString());
}
break;
default:
Trace.WriteLine("0x" + m.Msg.ToString("X"));
base.WndProc(ref m);
break;
}
}
...
}
private Rectangle RECTtoRectangle(RECT r)
{
return new Rectangle(r.Left, r.Top, r.Right, r.Bottom);
}
private Rectangle GetWndRect(IntPtr hwnd)
{
RECT r = new RECT();
GetClientRect(hwnd, out r);
return RECTtoRectangle(r);
}
正如您在代码中看到的,我正在重绘 WM_PAINT 和 WM_CPAINT 上的“矩形”,但这还不够:
- 当我使窗口变大(调整大小)时,矩形不会变大。
- 当我缩小窗口(再次调整大小)时,矩形会变小,但是当我放大窗口时,矩形会拖到原来的大小(而不是更大)。
- 当我将窗口置于可见屏幕之外时,矩形的一部分(仅底部)不会被重绘。
我应该指出,我确实收到了绘制消息,而且子类化似乎有效。
我真的被卡住了:-(
编辑:
哦,我也试过放置:
base.WndProc(ref m);
仅在 WndProc 结束时,得到了相同的结果。
【问题讨论】:
-
GetWndRect到底发生了什么? -
@Fratyx - 添加它:-) 谢谢!
-
你的任务听起来更像
WM_ERASEBKGND。阅读Using the WM_PAINT Message。您正在“跳过”许多 GDI 详细信息,例如BeginPaint()/EndPaint()。