普通控件截图 与 Panel跨越滚动条截图

来源:互联网 发布:吾爱免流流控源码 编辑:程序博客网 时间:2024/06/06 15:53
/// <summary>/// 传入控件取得控件的图像/// </summary>/// <param name="cl">控件</param>/// <returns>Bitmap控件截图</returns>public static Bitmap GetControl(Control cl) {    Bitmap _BitMap = null;    //判断如果是Panel,则调用Panel滚动截图的截图方法    if (cl is Panel) {        Panel c = (Panel)cl;        bool _PanelAotu = c.AutoScroll;        Size _PanelSize = c.Size;        c.Visible = false;        c.AutoScroll = true;        MoveBar(0, 0, c);        MoveBar(1, 0, c);        Point _Point = GetScrollPoint(c);        c.Width += _Point.X + 5;        c.Height += _Point.Y + 5;        _BitMap = new Bitmap(c.Width, c.Height);        c.DrawToBitmap(_BitMap, new Rectangle(0, 0, _BitMap.Width, _BitMap.Height));        c.AutoScroll = _PanelAotu;        c.Size = _PanelSize;        c.Visible = true;    } else {        //否则使用普通的控件截图方法        _BitMap = new Bitmap(cl.Width, cl.Height);        cl.DrawToBitmap(_BitMap, cl.ClientRectangle);    }     return _BitMap;} /// <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);    }} #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
//使用方式
GetControl(panel1).Save(@"C:/1.bmp");



0 0