【问题标题】:C#, Overriding OnPaint: alpha transparency with double bufferC#,覆盖 OnPaint:带双缓冲区的 alpha 透明度
【发布时间】:2010-12-21 04:43:33
【问题描述】:

我正在使用 .Net Compact Framework 2.0 SP2C# 开发 Windows Mobile 5.0 及更高版本 应用程序。

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

我正在测试它,但它太慢了,所以我将使用双缓冲。我可以使用双缓冲区来绘制渐变框和测试,但如果我使用带有 alpha 透明度的背景位图的双缓冲区,它不会绘制 alpha 透明度。所以我只用渐变框和消息和按钮做双缓冲。免费的透明位图直接绘制在 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 混合

有什么建议吗?

【问题讨论】:

  • 我不明白。不要保存 e.Graphics(不起作用),保存位图。在分配消息文本时创建它。
  • 我已经更新了我的问题。我认为如果我可以将图形保存到位图中,我会使用双缓冲区。

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


【解决方案1】:

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

【讨论】:

  • 你做的和我想做的一样吗?
  • 看代码。它绘制背景,然后在其上绘制具有透明度的图像。如果您想使用透明度和双缓冲,这是我知道的唯一示例。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2016-09-28
    相关资源
    最近更新 更多