Direct2D:移动窗口变灰

时间:2017-01-08 14:42:39

标签: winapi direct2d

我从一个非常简单的例子开始创建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;
    }

1 个答案:

答案 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);
}