How to Alpha Blending During Development for Compact Framework Control

I am developing a Compact Framework Control that supports transparency and for the runtime runtime everything works just by finding that the framework is being called in this API:

[DllImport("coredll.dll")]
    extern public static Int32 AlphaBlend(IntPtr hdcDest, Int32 xDest, Int32 yDest, Int32 cxDest, Int32 cyDest, IntPtr hdcSrc, Int32 xSrc, Int32 ySrc, Int32 cxSrc, Int32 cySrc, BlendFunction blendFunction);

      

Obviously the call to "coredll.dll" will not work while working with the desktop design, and for now when the picture happens I just find that the control is being designed and draws it without any transparency, I would like to be able to give Better development experience and show the same transparency in Visual Studio Designer.

I've tried making this platform call:

[DllImport("gdi32.dll", EntryPoint = "GdiAlphaBlend")]
    public static extern bool AlphaBlendDesktop(IntPtr hdcDest, int nXOriginDest, int nYOriginDest,
        int nWidthDest, int nHeightDest,
        IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc,
        BlendFunction blendFunction);

      

but as long as it returns true, the result is not displayed at all for the duration of the design submission.

Any thoughts?

+1


a source to share


2 answers


This helped me trick the designer into doing AlphaBlend operations.



// PixelFormatIndexed = 0x00010000, // Indexes into a palette
// PixelFormatGDI = 0x00020000, // Is a GDI-supported format
// PixelFormatAlpha = 0x00040000, // Has an alpha component
// PixelFormatPAlpha = 0x00080000, // Pre-multiplied alpha
// PixelFormatExtended = 0x00100000, // Extended color 16 bits/channel
// PixelFormatCanonical = 0x00200000,
// PixelFormat32bppARGB = (10 | (32 << 8) | PixelFormatAlpha | PixelFormatGDI | PixelFormatCanonical),

// cheat the design time to create a bitmap with an alpha channel
using (Bitmap bmp = new Bitmap(image.Width, image.Height, (PixelFormat) 
                                           PixelFormat32bppARGB))
{
  // copy the original image
  using(Graphics g = Graphics.FromImage(bmp))
  {
    g.DrawImage(image,0,0);
  }

  // Lock the bitmap bits.  
  Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
  System.Drawing.Imaging.BitmapData bmpData =
  bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                            (PixelFormat)PixelFormat32bppARGB);

  // Get the address of the first line.
  IntPtr ptr = bmpData.Scan0;

  // Declare an array to hold the bytes of the bitmap.
  // This code is specific to a bitmap with 32 bits per pixels.
  int bytes = bmp.Width * bmp.Height * 4;
  byte[] argbValues = new byte[bytes];

  // Copy the ARGB values into the array.
  System.Runtime.InteropServices.Marshal.Copy(ptr, argbValues, 0, bytes);

  // Set every alpha value to the given transparency.  
  for (int counter = 3; counter < argbValues.Length; counter += 4)
                           argbValues[counter] = transparency;

  // Copy the ARGB values back to the bitmap
  System.Runtime.InteropServices.Marshal.Copy(argbValues, 0, ptr, bytes);

  // Unlock the bits.
  bmp.UnlockBits(bmpData);

  gx.DrawImage(bmp, x, y);
}

      

+2


a source


Sorry this doesn't exactly answer your question ... but you should check out the UI Framework for the .Net Compact Framework, which already does alpha blending.



http://code.msdn.microsoft.com/uiframework

0


a source







All Articles