C#,覆盖OnPaint:带双缓冲区的alpha透明度

时间:2009-11-28 10:29:18

标签: c# windows-mobile compact-framework doublebuffered onpaint

我正在使用 .Net Compact Framework 2.0 SP2 开发 Windows Mobile 5.0及以上应用程序 C#

我在自定义消息框上覆盖了OnPaint方法,该消息框绘制了一个用alpha透明度填充整个表单的位图,以及一个带有按钮和半透明背景上的消息的渐变框。

我正在测试它,但它太慢了,所以我将使用双缓冲区。我可以使用双缓冲区来绘制渐变框和测试,但如果我使用带有alpha透明度的背景位图的双缓冲区,则不会绘制alpha透明度。所以我只用渐变框和消息和按钮做双缓冲。 bacground透明位图直接在e.Graphics上绘制。

我想知道我是否可以将e.Graphics保存在位图上以完成所有工作并结束OnPaint方法绘制到e.Graphics这个我之前保存过的位图。

这是我的代码:

protected override void OnPaint(PaintEventArgs e)
{
    Graphics gxOff;
    gxOff = Graphics.FromImage(bmpOffscreen);

    if (!isOuterBackgroundPainted)
    {
        isOuterBackgroundPainted = true;
        DrawingHelper.DrawAlpha(e.Graphics, outerBackground, 180, 0, 0);
        // Here I don't use double buffer because Alpha Blend doesn't work with double buffer.
        //DrawingHelper.DrawAlpha(gxOff, outerBackground, 180, 0, 0);
    }

    // Draw the gradient box
    GradientFill.Fill(gxOff, rectangle, startColor, endColor, FillDirection.TopToBottom);

    gxOff.DrawString(message, font, brush, textLayoutRectangle);

    e.Graphics.DrawImage(bmpOffscreen, 10, 10);
    base.OnPaint(e);
}

bmpOffscreen:双缓冲区的位图。

也许我可以将形式的快餐店放入bmpOffscreen,然后在其上绘制半透明背景,渐变框和文字。

总结: 我想使用带有双缓冲区的alpha混合

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

究竟如何做到这一点实际上非常复杂 - 比这里简单的答案更复杂。看一下Project Resistance的来源。我们有一个双缓冲表格,我们在背景中绘画,并使用透明度Alpha通道进行控制。

答案 1 :(得分:0)

Here是一种在Windows Mobile上运行应用程序快照的方法,无需使用标题栏和菜单。

这是我想要开始双重缓冲的图片。