Как сделать альфа-смешивание во время разработки для элемента управления Compact Framework - PullRequest
1 голос
/ 13 мая 2009

Я разрабатываю элемент управления Compact Framework, который поддерживает прозрачность, и для рабочей версии элемента управления все работает, просто находите вызов платформы на этом 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);

Очевидно, что вызов "coredll.dll" не будет работать во время проектирования рабочего стола, и сейчас, когда происходит рисование, я просто обнаруживаю, что проектируется элемент управления, и рисую его без какой-либо прозрачности. , Я хотел бы иметь возможность улучшить время разработки и продемонстрировать ту же прозрачность в Visual Studio Designer.

Я пытался сделать этот вызов платформы:

[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);

но в то время как он возвращает true, результат вообще ничего не отображается в представлении времени проектирования.

Есть мысли?

Ответы [ 2 ]

2 голосов
/ 26 августа 2009

Это сработало для меня, чтобы обмануть дизайнера для выполнения операций AlphaBlend.

// 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's 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);
}
0 голосов
/ 15 мая 2009

Извините, что это не совсем отвечает на ваш вопрос ... но вы должны проверить UI Framework для .Net Compact Framework, который уже выполняет альфа-смешивание.

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

...