예제 #1
0
        private void RenderImage(IImage image)
        {
            IntPtr imageToRender     = IntPtr.Zero;
            Size   imageToRenderSize = emptySize;

            if (null != image)
            {
                imageToRender     = image.Bitmap.GetHbitmap();
                imageToRenderSize = image.Size;
            }

            lock (_imageToRenderLock)
            {
                if (IntPtr.Zero != _imageToRender)
                {
                    GDI.DeleteObject(_imageToRender);
                }
                _imageToRender     = imageToRender;
                _imageToRenderSize = imageToRenderSize;
            }

            using (Graphics g = pictureBox.CreateGraphics())
                pictureBoxPaint(g, pictureBox.ClientRectangle);
        }
예제 #2
0
        private void pictureBoxPaint(Graphics g, Rectangle clipRectange)
        {
            lock (_imageToRenderLock)
            {
                if (IntPtr.Zero != _imageToRender)
                {
                    Rectangle viewRec = pictureBox.ClientRectangle;
                    Size      imageSz = _imageToRenderSize;
                    int       x       = 0;
                    int       y       = 0;
                    int       w       = viewRec.Width;
                    int       h       = (imageSz.Height * viewRec.Width) / imageSz.Width;

                    if (h > viewRec.Height)
                    {
                        w = (imageSz.Width * viewRec.Height) / imageSz.Height;
                        h = viewRec.Height;
                        x = (viewRec.Width - w) / 2;
                    }
                    else
                    {
                        y = (viewRec.Height - h) / 2;
                    }

                    if (x > 0)
                    {
                        Rectangle rec = new Rectangle(viewRec.Left, viewRec.Top, viewRec.Left + x, viewRec.Bottom);
                        rec.Intersect(clipRectange);
                        if (!rec.IsEmpty)
                        {
                            g.FillRectangle(SystemBrushes.ControlDark, rec);
                        }
                        rec = new Rectangle(viewRec.Left + x + w, viewRec.Top, viewRec.Right, viewRec.Bottom);
                        rec.Intersect(clipRectange);
                        if (!rec.IsEmpty)
                        {
                            g.FillRectangle(SystemBrushes.ControlDark, rec);
                        }
                    }

                    if (y > 0)
                    {
                        Rectangle rec = new Rectangle(viewRec.Left, viewRec.Top, viewRec.Right, viewRec.Top + y);
                        rec.Intersect(clipRectange);
                        if (!rec.IsEmpty)
                        {
                            g.FillRectangle(SystemBrushes.ControlDark, rec);
                        }
                        rec = new Rectangle(viewRec.Left, viewRec.Top + y + h, viewRec.Right, viewRec.Bottom);
                        rec.Intersect(clipRectange);
                        if (!rec.IsEmpty)
                        {
                            g.FillRectangle(SystemBrushes.ControlDark, rec);
                        }
                    }

                    IntPtr destHdc = g.GetHdc();
                    IntPtr srcHdc  = GDI.CreateCompatibleDC(destHdc);

                    IntPtr prevBmp = GDI.SelectObject(srcHdc, _imageToRender);
                    GDI.StretchBlt(destHdc, viewRec.Left + x, viewRec.Top + y, w, h,
                                   srcHdc, 0, 0, imageSz.Width, imageSz.Height, GDI.TernaryRasterOperations.SRCCOPY);
                    GDI.SelectObject(srcHdc, prevBmp);

                    GDI.DeleteDC(srcHdc);
                    g.ReleaseHdc(destHdc);
                }
            }
        }