如何在WM中正确绘制

我是使用GDI +的新手,我想知道如何解决创建和处理对象的混乱问题。 现在所有的程序需要处理重复的WM_PAINT消息,并且每次更新一个DrawPie

我调用了GdiplusStartup( &gdiplusToken, &gdiplusStartupInput, NULL ); 当窗口启动时, GdiplusShutdown( gdiplusToken );WM_DESTROY

在顶部附近定义的度全局变量:

volatile double degrees = 0;

这是我的WM_PAINT

case WM_PAINT: {
    hdc = BeginPaint( hWnd, &ps );

    Graphics g( hdc );
    Pen p( Color::Green );
    if ( degrees > 0 ) {
        if ( degrees == 360 ) {
            g.DrawEllipse( &p, 0, 0, 100, 100 );
        } else {
            g.DrawPie( &p, 0, 0, 100, 100, -90, degrees );
        }
    }

    EndPaint( hWnd, &ps );
    break;
}

这里是更新度数并更新窗口的函数(它在一个单独的线程中):

void UpdateDegrees() {
    for ( ;; ) {
        if ( globalHWND != NULL ) {
            degrees += 0.1;
            InvalidateRect( globalHWND, NULL, TRUE );
            UpdateWindow( globalHWND );
        }
    }
}

如果我运行它,我会得到像这样的“坚实”饼图形状,我认为它只是在各个角度重新绘制自己。 它需要看起来像这样,换句话说,每次重绘之前清除图形。 (对不起,我想我需要10位代表发布内嵌图片)

我知道我没有正确初始化和/或处理我的图形,但我实在不知道该怎么做。 任何帮助将不胜感激! 谢谢。


有很多方法可以做到这一点,标准的一个是处理WM_ERASEBKGND消息。

为了简单起见,您可以在剪辑矩形中(在ps中指定)填充一个白色矩形,这将清除正在绘制的背景。

SolidBrush backGroundBrush(Color(255,255,255));
Rect clipRect(ps->rcPaint.left, ps.rcPaint.top, ps->rcPaint.right - ps->rcPaint.left, ps->rcPaint.bottom - ps.rcPaint.top);
g.FillRectangle(&backgroundBrush, Rect(ps->rcPaint.left, ps.rcPaint));
链接地址: http://www.djcxy.com/p/66239.html

上一篇: How to properly paint in WM

下一篇: Read file line by line