none
C#调用AlphaBlend透明融合的问题 RRS feed

  • 问题

  • 首先,我继承了Control封装了一个用户控件,暂时没有写入复杂的功能,只是设置了默认样式:
    SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.SupportsTransparentBackColor, true);

    然后我通过一段调用AlphaBlend的代码淡入一幅包含透明部分的PNG图像。

    public static void FadeInEffect(int delay, IntPtr handle, Bitmap image, Rectangle rect)
    {
     Graphics g = Graphics.FromHwnd(handle);
     IntPtr hdcDest = g.GetHdc()
     IntPtr hdcMem = IntPtr.Zero;
     IntPtr hbmp = image.GetHbitmap();
     hdcMem = CGdiplus.CreateCompatibleDC(hdcDest);
     CGdiplus.SelectObject(hdcMem, hbmp);
     Thread td = new Thread(new ThreadStart(delegate
     {
      lock (image)
      {
       int alpha = 0;
       while (alpha <= 255)
       {
        CGdiplus.AlphaBlend(hdcDest, rect.Left, rect.Top, rect.Width, rect.Height, hdcMem, 0, 0, image.Width, image.Height, new CGdiplus.BLENDFUNCTION(CGdiplus.AC_SRC_OVER, 0, (byte)alpha, CGdiplus.AC_SRC_ALPHA));
        alpha += 2;
        Thread.Sleep(delay);
       }
      }
      g.ReleaseHdc(hdcDest);
      g.Dispose();
      CGdiplus.DeleteDC(hdcMem);
      CGdiplus.DeleteObject(hbmp);
     }));
     td.Start();
    }

    调用时传入自己的那个用户控件的句柄和一些普通的参数。

    实际效果是把PNG的透明部分绘制成了白色。

    请问,如何使用AlphaBlend才能正确显示Alpha通道?

    2010年7月15日 19:03

答案

  • 在WinForm应用程序中实现窗体Alpha Blend是比较麻烦而且难以控制的事情。

    如果对界面的外观要求比较高,我个人是推荐使用WPF这种新的GUI技术的。

    2010年7月16日 0:37