zoukankan      html  css  js  c++  java
  • winfrom中将panel另存为图片

    private void button1_Click(object sender, EventArgs e)
            {
                Point ScrollMaxInfo = GetScrollPoint(panel1);
                Size ControlMaxSize = GetControlSize(panel1, ScrollMaxInfo);

                Bitmap ControlImage = new Bitmap(ControlMaxSize.Width, ControlMaxSize.Height);
                Graphics MainGraphics = Graphics.FromImage(ControlImage);
                Bitmap TempImage = new Bitmap(panel1.Width - 16, panel1.Height - 16);

                int StepWidth = GetScrollNumb(panel1.Width - 16, ScrollMaxInfo.X);
                int StepHeight = GetScrollNumb(panel1.Height - 16, ScrollMaxInfo.Y);

                int LogWidth = 0;
                int LogHeigh = 0;
                MoveBar(0, 0, panel1);

                for (int i = 0; i != StepWidth; i++)
                {
                    MoveBar(1, 0, panel1);
                    LogHeigh = 0;
                    for (int z = 0; z != StepHeight; z++)
                    {
                        panel1.DrawToBitmap(TempImage, new Rectangle(0, 0, panel1.Width - 16, panel1.Height - 16));
                        MainGraphics.DrawImage(TempImage, LogWidth, LogHeigh);
                        MoveBar(1, panel1.Height - 16 + LogHeigh, panel1);
                        LogHeigh = GetScrollPoint(1, panel1);
                    }
                    MoveBar(0, panel1.Width - 16 + LogWidth, panel1);
                    LogWidth = GetScrollPoint(0, panel1);
                }
                MainGraphics.Dispose();
                TempImage.Dispose();
                ControlImage.Save(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "123.png");
            }

            #region API
            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
            public struct SCROLLINFO
            {
                public uint cbSize;
                public uint fMask;
                public int nMin;
                public int nMax;
                public uint nPage;
                public int nPos;
                public int nTrackPos;
            }
            public enum ScrollBarInfoFlags
            {
                SIF_RANGE = 0x0001,
                SIF_PAGE = 0x0002,
                SIF_POS = 0x0004,
                SIF_DISABLENOSCROLL = 0x0008,
                SIF_TRACKPOS = 0x0010,
                SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS)
            }
            public enum ScrollBarRequests
            {
                SB_LINEUP = 0,
                SB_LINELEFT = 0,
                SB_LINEDOWN = 1,
                SB_LINERIGHT = 1,
                SB_PAGEUP = 2,
                SB_PAGELEFT = 2,
                SB_PAGEDOWN = 3,
                SB_PAGERIGHT = 3,
                SB_THUMBPOSITION = 4,
                SB_THUMBTRACK = 5,
                SB_TOP = 6,
                SB_LEFT = 6,
                SB_BOTTOM = 7,
                SB_RIGHT = 7,
                SB_ENDSCROLL = 8
            }
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int GetScrollInfo(IntPtr hwnd, int bar, ref SCROLLINFO si);
            [DllImport("user32")]
            public static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool Rush);
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
            #endregion

            /// <summary>
            /// 获取目前滚动条位置
            /// </summary>
            /// <param name="Bar"></param>
            /// <param name="MyControl"></param>
            /// <returns></returns>
            public static int GetScrollPoint(int Bar, Control MyControl)
            {
                SCROLLINFO ScrollInfo = new SCROLLINFO();
                ScrollInfo.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(ScrollInfo);
                ScrollInfo.fMask = (uint)ScrollBarInfoFlags.SIF_ALL;

                GetScrollInfo(MyControl.Handle, Bar, ref ScrollInfo);

                return ScrollInfo.nPos;
            }
            /// <summary>
            /// 获取循环几次获得图形
            /// </summary>
            /// <returns></returns>
            private static int GetScrollNumb(int MyControlNumb, int ScrollMaxInfoNumb)
            {
                double Step = (double)ScrollMaxInfoNumb / (double)MyControlNumb;
                Step++;

                if ((int)Step == Step)
                {
                    return (int)Step;
                }
                else
                {
                    return (int)Step + 1;
                }
            }
            /// <summary>
            /// 获得控件不需要滚动条的宽和高(最终图形大小)
            /// </summary>
            /// <param name="MyControl"></param>
            /// <param name="ScrollMaxInfo"></param>
            /// <returns></returns>
            private static Size GetControlSize(Control MyControl, Point ScrollMaxInfo)
            {
                return new Size(MyControl.Size.Width + ScrollMaxInfo.X - 16, MyControl.Size.Height + ScrollMaxInfo.Y - 16);
            }
            /// <summary>
            /// 获取滚动条数据
            /// </summary>
            /// <param name="MyControl"></param>
            /// <param name="ScrollSize"></param>
            /// <returns></returns>
            private static Point GetScrollPoint(Control MyControl)
            {
                Point MaxScroll = new Point();

                SCROLLINFO ScrollInfo = new SCROLLINFO();
                ScrollInfo.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(ScrollInfo);
                ScrollInfo.fMask = (uint)ScrollBarInfoFlags.SIF_ALL;

                GetScrollInfo(MyControl.Handle, 1, ref ScrollInfo);
                MaxScroll.Y = ScrollInfo.nMax - (int)ScrollInfo.nPage;
                if ((int)ScrollInfo.nPage == 0) MaxScroll.Y = 0;
                GetScrollInfo(MyControl.Handle, 0, ref ScrollInfo);
                MaxScroll.X = ScrollInfo.nMax - (int)ScrollInfo.nPage;
                if ((int)ScrollInfo.nPage == 0) MaxScroll.X = 0;
                return MaxScroll;
            }
            /// <summary>
            /// 移动控件滚动条位置
            /// </summary>
            /// <param name="Bar"></param>
            /// <param name="Point"></param>
            /// <param name="MyControl"></param>
            private static void MoveBar(int Bar, int Point, Control MyControl)
            {
                if (Bar == 0)
                {
                    SetScrollPos(MyControl.Handle, 0, Point, true);
                    SendMessage(MyControl.Handle, (int)0x0114, (int)ScrollBarRequests.SB_THUMBPOSITION, 0);
                }
                else
                {
                    SetScrollPos(MyControl.Handle, 1, Point, true);
                    SendMessage(MyControl.Handle, (int)0x0115, (int)ScrollBarRequests.SB_THUMBPOSITION, 0);
                }
            }

  • 相关阅读:
    操作系统复习
    Google hack语法
    c++的set重载运算符
    华为笔试题
    Flume+Kafka整合
    kafka相关知识点总结
    kafka中生产者和消费者API
    Kafka集群环境搭建
    Storm消息容错机制(ack-fail机制)
    Storm通信机制(了解)
  • 原文地址:https://www.cnblogs.com/FLWL/p/6925261.html
Copyright © 2011-2022 走看看