WinForm控件与WPF控件的交互

翻译|其它|编辑:郝浩|2007-09-04 09:49:50.000|阅读 2224 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

这个问题其实也可以理解为:怎样在  WPF/XAML  中使用  Winform  中的控件(如PictureBox?

首先看看  XAML  代码:(注意下面加粗的部分)

<Window x:Class="WindowsApplication1.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Title="WinForm  控件与  WPF  控件的交互" Height="400" Width="600"

        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

    >

  <StackPanel>

    <Grid>

      <Grid.ColumnDefinitions>

        <ColumnDefinition/>

        <ColumnDefinition/>

      </Grid.ColumnDefinitions>

      <Image Source="Girl.jpg" MaxHeight="300"  Grid.Column="0" Name="WPFImage"/>

      <WindowsFormsHost Grid.Column="1" MaxHeight="300" Name="pictureHost" >

        <wf:PictureBox />

      </WindowsFormsHost>

    </Grid>

  </StackPanel>

</Window>

C#代码:

       System.Windows.Forms.PictureBox _pictureBox = null;

        void Window1_Loaded(object sender, RoutedEventArgs e)

        {

            _pictureBox = pictureHost.Child as System.Windows.Forms.PictureBox;

            _pictureBox.Image = GetBitmap(WPFImage);

        }

 

        #region Image Functions

        // 以下代码实现了两者  WPF    GDI+的交互

        public void ConvertToGrayscale(System.Drawing.Bitmap source , int sliderVal)

        {

            System.Drawing.Bitmap bm = new System.Drawing.Bitmap(source.Width, source.Height);

            //下面代码还可以使用不安全代码,以提高效率

            for (int y = 0; y < bm.Height; y++)

            {

                for (int x = 0; x < bm.Width; x++)

                {

                    System.Drawing.Color c = source.GetPixel(x, y);

                    int luma = (int)(c.R * ((double)sliderVal / (double)10) * 0.3 + c.G * ((double)sliderVal / (double)10) * 0.59 + c.B * ((double)sliderVal / (double)10) * 0.11);

                    bm.SetPixel(x, y, System.Drawing.Color.FromArgb(luma, luma, luma));

                }

            }

            _pictureBox.Image = bm;

        }

 

        System.Drawing.Bitmap AdjustBrightnessMatrix(System.Drawing.Bitmap img, int value)

        {

            if (value == 0) // No change, so just return

                return img;

 

            float sb = (float)value / 255F;

            float[][] colorMatrixElements =

                           {

                                 new float[] {1,  0,  0,  0, 0},

                                 new float[] {0,  1,  0,  0, 0},

                                 new float[] {0,  0,  1,  0, 0},

                                 new float[] {0,  0,  0,  1, 0},

                                 new float[] {sb, sb, sb, 1, 1}

                           };

 

            System.Drawing.Imaging.ColorMatrix cm = new System.Drawing.Imaging.ColorMatrix(colorMatrixElements);

            System.Drawing.Imaging.ImageAttributes imgattr = new System.Drawing.Imaging.ImageAttributes();

            System.Drawing.Rectangle rc = new System.Drawing.Rectangle(0, 0, img.Width, img.Height);

            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(img);

            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

            imgattr.SetColorMatrix(cm);

            g.DrawImage(img, rc, 0, 0, img.Width, img.Height, System.Drawing.GraphicsUnit.Pixel, imgattr);

 

            imgattr.Dispose();

            g.Dispose();

            return img;

        }

        #endregion Image Functions

 

        #region Image-Bitmap Interop Helpers

        private void convertBitmapToBitmapSource(System.Drawing.Bitmap bitmap)

        {

            using (bitmap)

            {

                System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(

                    bitmap.GetHbitmap(),

                    IntPtr.Zero,

                    Int32Rect.Empty,

                    System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

 

                WPFImage.Source = bitmapSource;

            }

        }

 

        private System.Drawing.Bitmap GetBitmap(Image image)

        {

            System.Windows.Forms.PictureBox picture = _pictureBox;

                // Stream stm = File.Open("Waterfall.jpg", FileMode.Open, FileAccess.Read))

                //// Since we're not specifying a System.Windows.Media.Imaging.BitmapCacheOption, the pixel format

                //// will be System.Windows.Media.PixelFormats.Pbgra32.

                // System.Windows.Media.Imaging.BitmapSource bitmapSource = System.Windows.Media.Imaging.BitmapFrame.Create(

                //    stm,

                //    System.Windows.Media.Imaging.BitmapCreateOptions.None,

                //    System.Windows.Media.Imaging.BitmapCacheOption.OnLoad);

 

                System.Windows.Media.Imaging.BitmapSource bitmapSource = WPFImage.Source as BitmapSource;

 

                // Scale the image so that it will display similarly to the WPF Image.

                double newWidthRatio = picture.Width / (double)bitmapSource.PixelWidth;

                double newHeightRatio = ((picture.Width * bitmapSource.PixelHeight) / (double)bitmapSource.PixelWidth) / (double)bitmapSource.PixelHeight;

 

                System.Windows.Media.Imaging.BitmapSource transformedBitmapSource = new System.Windows.Media.Imaging.TransformedBitmap(

                    bitmapSource,

                    new System.Windows.Media.ScaleTransform(newWidthRatio, newHeightRatio));

 

                int width = transformedBitmapSource.PixelWidth;

                int height = transformedBitmapSource.PixelHeight;

                int stride = width * ((transformedBitmapSource.Format.BitsPerPixel + 7) / 8);

 

                byte[] bits = new byte[height * stride];

 

                transformedBitmapSource.CopyPixels(bits, stride, 0);

 

                unsafe

                {

                    fixed (byte* pBits = bits)

                    {

                        IntPtr ptr = new IntPtr(pBits);

 

                        System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(

                            width,

                            height,

                            stride,

                            System.Drawing.Imaging.PixelFormat.Format32bppPArgb,

                            ptr);

 

                        return bitmap;

                    }

                }

            }

        #endregion Image-Bitmap Interop Helpers

想像一下,通过相互转换、相互调用,可以很方便地实现一些功能(彼此功能互补嘛)。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:csdn

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP