gpt4 book ai didi

c# - 在窗口内绘图不会重绘和涂抹

转载 作者:可可西里 更新时间:2023-11-01 11:18:23 26 4
gpt4 key购买 nike

我试图在窗口周围绘制一个矩形(在窗口内部,而不是在窗口外部),但绘图有污迹,在某些情况下不会重绘。

我将 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结束时,得到了相同的结果。

最佳答案

我不确定,因为我无法测试它,也不知道成员变量 g 的背景,但我认为这是裁剪矩形的问题。因此,您可以在 WndProc 函数中尝试这样的操作,以确保重绘整个窗口:

case 0x05: // WM_SIZE
InvalidateRect(this.Handle, GetWndRect(this.Handle), TRUE);
break;

关于c# - 在窗口内绘图不会重绘和涂抹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26375294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com