给窗体中控件绘图的几种方法

xiaoxiao2021-02-28  8

方法一:WINDOWS API画法

//获取要绘制的控件句柄 Image img = GetWindow(this.tabPage12.Handle); //在母容器上创建图形对象  Graphics gOut = mOut.pnlOut.CreateGraphics(); //在指定位置按指定大小绘出image  gOut.DrawImage((Image)img, form1.pnlImage.DisplayRectangle, this.tabPage12.DisplayRectangle, GraphicsUnit.Pixel); //释放图形对象所有资源  gOut.Dispose();  img.Dispose();  GC.Collect();  form1.pnlImage.BringToFront();   #region 截图函数     [DllImport("gdi32.dll")]      public static extern IntPtr CreateDC(       string lpszDriver, // driver name驱动名       string lpszDevice, // device name设备名       string lpszOutput, // not used; should be NULL       IntPtr lpInitData // optional printer data       );      [DllImport("gdi32.dll")]      public static extern int BitBlt(       IntPtr hdcDest, // handle to destination DC目标设备的句柄       int nXDest, // x-coord of destination upper-left corner目标对象的左上角的X坐标       int nYDest, // y-coord of destination upper-left corner目标对象的左上角的Y坐标       int nWidth, // width of destination rectangle目标对象的矩形宽度       int nHeight, // height of destination rectangle目标对象的矩形长度       IntPtr hdcSrc, // handle to source DC源设备的句柄       int nXSrc, // x-coordinate of source upper-left corner源对象的左上角的X坐标       int nYSrc, // y-coordinate of source upper-left corner源对象的左上角的Y坐标       UInt32 dwRop // raster operation code光栅的操作值       );     [DllImport("gdi32.dll")]      public static extern IntPtr CreateCompatibleDC(       IntPtr hdc // handle to DC       );     [DllImport("gdi32.dll")]      public static extern IntPtr CreateCompatibleBitmap(       IntPtr hdc, // handle to DC       int nWidth, // width of bitmap, in pixels       int nHeight // height of bitmap, in pixels       );     [DllImport("gdi32.dll")]      public static extern IntPtr SelectObject(       IntPtr hdc, // handle to DC       IntPtr hgdiobj // handle to object       );     [DllImport("gdi32.dll")]      public static extern int DeleteDC(       IntPtr hdc // handle to DC       );     [DllImport("user32.dll")]      public static extern bool PrintWindow(       IntPtr hwnd, // Window to copy,Handle to the window that will be copied.       IntPtr hdcBlt, // HDC to print into,Handle to the device context.       UInt32 nFlags // Optional flags,Specifies the drawing options. It can be one of the following values.       );     [DllImport("user32.dll")]      public static extern IntPtr GetWindowDC(       IntPtr hwnd       );     public Bitmap GetWindow(IntPtr hWnd)      {          IntPtr hscrdc = GetWindowDC(hWnd);          Control control = Control.FromHandle(hWnd);          IntPtr hbitmap = CreateCompatibleBitmap(hscrdc, control.Width, control.Height);          IntPtr hmemdc = CreateCompatibleDC(hscrdc);          SelectObject(hmemdc, hbitmap);          PrintWindow(hWnd, hmemdc, 0);          Bitmap bmp = Bitmap.FromHbitmap(hbitmap);          DeleteDC(hscrdc);//删除用过的对象          DeleteDC(hmemdc);//删除用过的对象          return bmp;      }      #endregion

方法二、给background赋值

Bitmap bmp = new Bitmap(this.tabPage12.Width, this.tabPage12.Height); //将控件区域显呈到指定位图  this.tabPage12.DrawToBitmap(bmp, this.tabPage12.DisplayRectangle);  form1.pnlImage.BackgroundImage = (Image)bmp; /* 分屏显示座席 */  form1.pnlImage.BackColor = Color.White;  form1.pnlImage.BringToFront();

方法三、将某个屏幕位置拷贝到image

Image img = new Bitmap(tabPage13.Width, tabPage13.Height);  Graphics g = Graphics.FromImage(img);  g.CopyFromScreen(Obj.PointToScreen(Point.Empty), Point.Empty, tabPage13.Size);  IntPtr dc1 = g.GetHdc();  g.ReleaseHdc(dc1);  form1.pnlImage.BackgroundImage = img; form1.pnlImage.BringToFront();
转载请注明原文地址: https://www.6miu.com/read-1100228.html

最新回复(0)