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);
}
}
winfrom中将panel另存为图片的更多相关文章
- angular调用WCF服务,读取文件夹下图片显示列表,下载另存为图片
读取文件夹下的文件 public string ReadImagesPaths() { string result = string.Empty; try { string path = System ...
- Qt开发小工具之gif转换器(使用QMovie截取每一帧为QImage,然后用QFile另存为图片文件)
最近,QQ上好多各种gif表情.每一个都很经典呀..于是我就想把它转换成一张张静态图片...没学过ps.于是写了几行代码.完工.核心代码如下 主要是借助QMovie类.文件读取模式选择QMovie:: ...
- winfrom datagridview ,picturebox,显示图片,以及删除问题
private void write_listview(DataSet ds) { DataTable dt = ds.Tables[0]; ...
- C#winfrom listview 设置显示图片
ListView控件有5种显示图片方式:LargeIcon(大图标),Detail(详细),SmallIcon(小图标),List(列表),Tile,常用前4种. 这里说一下设置方式:LargeIc ...
- unity中将多个图片进行椭圆排序
//保存需要排序的精灵容器 public GameObject[] Sprites; public Transform centrePoint;//椭圆的中心点 ;//每个方块间的角度偏移 //保存位 ...
- Winfrom 设置Panel添加滚动条
AutoScroll是自动滚动的属性. 把AutoScroll设置为True;
- Chrome浏览器 无需安装插件将整个网页另存为图片
步骤1 ctrl+shift+i 步骤2 ctrl+shift+p 步骤3 输入full 回车确定 感谢先辈们的无私奉献!原文https://blog.csdn.net/wumingid/articl ...
- winfrom自定义滚动条
panel或图片什么的跟着鼠标走,这里panel自己可以加背景图或直接搞个图就行了.为了演示清楚,有个滚动条控件做对比,与自定义的同步. using System; using System.Coll ...
- 初学c# -- 学习笔记(五) winfrom自定义滚动条
找了些例子,要么庞大.要么搞个安装组件什么的,我要求能用就行了.实在找例子修改麻烦,就做了一个.其实实现挺简单,就是panel或图片什么的跟着鼠标走就行了. 这里panel自己可以加背景图或直接搞个图 ...
随机推荐
- 你说你精通CSS,真的吗?
以前做项目的时候,学习了HTML和CSS,感觉这两个比较简单,在W3school里学习了一下之后,就觉得自己已经没问题了.可是,真正要做一个好看的页面,我还是要写好久.其实,对于CSS,我并没有像我以 ...
- STM32学习笔记(一)——点亮一个LED
引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...
- 浩哥解析MyBatis源码(十)——Type类型模块之类型处理器
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...
- PLSQL创建定时任务
在使用oracle最匹配的工具plsql的时候,如果用plsql创建定时器呢?下面我简单介绍使用工具创建定时器的方法: 1.创建任务执行的存储过程,如名称为YxtestJob,向测试表中插入数据 cr ...
- CSAcademy Beta Round #5 Long Journey
题目链接:https://csacademy.com/contest/arhiva/#task/long_journey/ 大意是有一张无向不带权的图,两个人同时从s点出发,分别前往a点和b点,且每个 ...
- AJAX应用案例之省市联动
jsp 主要是要注意多Document的操作 <%-- Created by IntelliJ IDEA. User: YuWenHui Date: 2017/4/23 0023 Time: 1 ...
- javascript中类式继承和原型式继承的实现方法和区别
在所有面向对象的编程中,继承是一个重要的话题.一般说来,在设计类的时候,我们希望能减少重复性的代码,并且尽量弱化对象间的耦合(让一个类继承另一个类可能会导致二者产生强耦合).关于“解耦”是程序设计中另 ...
- NI Vision for LabVIEW 基础(一):NI Vision 简介
NI Vision 控件模板 Vision控件模板位于LabVIEW控件模板的最顶层,由一下元素组成: IMAQ Image.ctl—该控件是一个类型定义,用于声明图象类型的数据.在VI的前面板中使用 ...
- Java中的多线程Demo
一.关于Java多线程中的一些概念 1.1 线程基本概念 从JDK1.5开始,Java提供了3中方式来创建.启动多线程: 方式一(不推荐).通过继承Thread类来创建线程类,重写run()方法作为线 ...
- 在Mvc中进行异步请求是出现(没有为该对象定义无参数的构造函数)
解决办法就是给相应的类添加无参数的构造函数: