我从一个非常简单的例子开始创建Direct2D。 获取工厂和ID2D1HwndRenderTarget,然后使用" Clear"处理WM_PAINT消息以仅使用纯色绘制背景。功能
它工作正常,直到我开始移动窗口。当窗户移动时,它变成灰色,就像没有画画一样。我试图绘制一个椭圆,结果是一样的。
如何在窗口移动的情况下呈现窗口内容?
P.S。如果需要代码
private void Fullscreen_toggle_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Normal;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Bounds = Screen.PrimaryScreen.Bounds;
}
private void Windowed_toggle_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Sizable;
}
答案 0 :(得分:2)
将您的WNDCLASSEX配置为没有背景画笔。
替换此行:
wndClassStruct.hbrBackground = (HBRUSH)COLOR_WINDOW;
有了这个:
wndClassStruct.hbrBackground = GetStockObject(NULL_BRUSH);
或者,您可以修改mainWndProc以吞下WM_ERASEBKGND消息。它通过在发出WM_PAINT之前不允许窗口擦除自身来实现相同的效果。
LRESULT CALLBACK mainWinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (WM_PAINT == uMsg)
return onPaintMainWindow();
if (uMsg == WM_ERASEBKGND)
{
// ignore requests to erase the background since the wm_paint
// handler is going to redraw the entire window.
return 0;
}
if (WM_DESTROY == uMsg) {
PostQuitMessage(0); return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}