上篇文章实现了winform 中图片的左旋 右旋,在此基础上增加 左移 右移 并记忆移动的位置。 并整合在一起发布。

上篇文章地址。http://blog.csdn.net/kongwei521/article/details/8425421

上贴部分核心代码:

Form1.cs 代码

private List<PreviewControl> poPreviews = null;
public Form1()
{
InitializeComponent();
poPreviews = new List<PreviewControl>();
}
/// <summary>
/// 取得选择的图片
/// </summary>
/// <returns></returns>
private PreviewControl GetCurrentPreview()
{
for (int i = 0; i < poPreviews.Count; i++)
{
if (poPreviews[i].Selected)
{
return poPreviews[i];
}
}
return null;
}
/// <summary>
/// 前移
/// </summary>
/// <param name="eventSender"></param>
/// <param name="eventArgs"></param>
private void btnBackMove_Click(object sender, EventArgs e)
{
PreviewControl oCurrent = GetCurrentPreview();
if (oCurrent == null)
{
return;
}
PreviewControl oTemp = null;
int iAt = poPreviews.IndexOf(oCurrent);
//判断移动的位置
if (iAt >= 1)
{
oTemp = poPreviews[iAt - 1];
poPreviews.RemoveAt(iAt - 1);
poPreviews.Insert(iAt, oTemp);
}
for (int i = 0; i < poPreviews.Count; i++)
{
pnlPreviews.Controls.SetChildIndex(poPreviews[i], i);
}
}
/// <summary>
/// 后移
/// </summary>
/// <param name="eventSender"></param>
/// <param name="eventArgs"></param>
private void btnNextMove_Click(object sender, EventArgs e)
{
PreviewControl oCurrent = GetCurrentPreview();
if (oCurrent == null)
{
return;
}
PreviewControl oTemp = null;
int iAt = poPreviews.IndexOf(oCurrent);
if (iAt < poPreviews.Count - 1)
{
oTemp = poPreviews[iAt + 1];
poPreviews.RemoveAt(iAt + 1);
poPreviews.Insert(iAt, oTemp);
}
for (int i = 0; i < poPreviews.Count; i++)
{
pnlPreviews.Controls.SetChildIndex(poPreviews[i], i);
}
}

PreviewControll.cs 自定义控件中代码

 public partial class PreviewControl : UserControl
{
[DllImport("user32.dll")]
extern static short GetKeyState(int vKey);

        /// <summary>
/// 加载图片
/// </summary>
private string psImageLocation = String.Empty;
/// <summary>
/// 选择状态
/// </summary>
private bool pbSelected = false;

        /// <summary>
/// 多个选择的状态
/// </summary>
private bool pbMultiMode = false;

        /// <summary>
/// 左旋,右旋后直接保存
/// false:不保存、  true:保存
/// </summary>
private bool pbRotateSaveFlg = true;

        /// <summary>
/// PDF文件类型的标志
/// TRUE:PDF文件  FALSE:不是PDF文件
/// </summary>
private bool pbPdfFlg = false;

        /// <summary>
/// 选择时的颜色
/// </summary>
private Color poSelectColor = SystemColors.Highlight;

        /// <summary>
/// 未选择的颜色
/// </summary>
private Color poUnSelectColor = SystemColors.Control;

        /// <summary>
/// 图片左旋右旋的值
/// </summary>
private int piRoteSum = 0;

        /// <summary>
/// 右击点击标签
/// </summary>
private bool pbRightClickFlg = false;

        /// <summary>
/// PictrueBoxのセレクトイベントハンドラー
/// </summary>
private event EventHandler poPictureSelected;
/// <summary>
/// 图片预览控件初始化
/// </summary>
public PreviewControl()
{
InitializeComponent();
pictureBox1.Click -= new EventHandler(pictureBox1_Click);
pictureBox1.Click += new EventHandler(pictureBox1_Click);
pictureBox2.Click -= new EventHandler(pictureBox2_Click);
pictureBox2.Click += new EventHandler(pictureBox2_Click);
}

        private bool IsControlKeyDown()
{
return (GetKeyState(0x0011) & 0x0000FF00) != 0;
}

        private bool IsShiftKeyDown()
{
return (GetKeyState(0x0010) & 0x0000FF00) != 0;
}

        /// <summary>
/// 右击的标签
/// </summary>
public bool RightClickFlg
{
get
{
return pbRightClickFlg;
}
set
{
pbRightClickFlg = value;
}
}

        /// <summary>
/// 加载的图片
/// </summary>
public string ImageLocation
{
set
{
psImageLocation = value;
if (psImageLocation.Length == 0)
{
pictureBox1.Visible = false;
webBrowser1.Visible = false;
}
else if (value.EndsWith(".pdf", StringComparison.CurrentCultureIgnoreCase))
{
webBrowser1.Visible = true;
webBrowser1.Navigate(value);
pictureBox2.Tag = value;
pictureBox2.Visible = true;
pictureBox1.Visible = false;
pbPdfFlg = true;
}
else
{
webBrowser1.Visible = false;
pictureBox1.Visible = true;
pictureBox1.ImageLocation = value;
}
}
get
{
return psImageLocation;
}
}
/// <summary>
/// 选择时的颜色
/// </summary>
public Color SelectColor
{
get
{
return poSelectColor;
}
set
{
poSelectColor = value;
}
}

        /// <summary>
/// 没有选择的颜色
/// </summary>
public Color UnSelectColor
{
get
{
return poUnSelectColor;
}
set
{
poUnSelectColor = value;
}
}

/// <summary>
/// 多选的场合为True
/// </summary>
public bool MultiMode
{
get
{
return pbMultiMode;
}
set
{
pbMultiMode = value;
}
}

        /// <summary>
/// 多选
/// </summary>
public bool MultiSelected
{
get
{
return pbSelected;
}
set
{
if (value == pbSelected)
{
return;
}
pbSelected = value;
if (value)
{
BackColor = poSelectColor;
}
else
{
BackColor = poUnSelectColor;
}
}
}

        /// <summary>
/// 单选
/// </summary>
public bool Selected
{
get
{
return pbSelected;
}
set
{
if (value == pbSelected)
{
if (!pbMultiMode)
{
return;
}
else
{
BackColor = poUnSelectColor;
}
}
pbSelected = value;
if (value)
{
BackColor = poSelectColor;
Control oParent = Parent;
if (oParent != null)
{
for (int i = 0; i < oParent.Controls.Count; i++)
{
if (oParent.Controls[i] != this &&
((oParent.Controls[i] is PreviewControl)
|| (oParent.Controls[i] is WebBrowser))
)
{
((PreviewControl)oParent.Controls[i]).Selected = false;
}
}
}
}
else
{
BackColor = poUnSelectColor;
}
}
}

        /// <summary>
/// 图片旋转的值入 90 180 270 度
/// </summary>
public int RotateSum
{
get
{
return piRoteSum;
}
set
{
piRoteSum = value;
}
}

/// <summary>
/// 保存旋转后位置的状态
/// </summary>
public bool RotateSaveFlg
{
set
{
pbRotateSaveFlg = value;
}
}

        /// <summary>
/// 左旋
/// </summary>
public void RotateLeft()
{
if (pictureBox1.Image != null)
{
//扩展名判断
if (CheckFileExtension(this.Tag.ToString()) == FileExtension.PDF)
{
return;
}
Image oSrc = pictureBox1.Image;
Bitmap oDst = new Bitmap(oSrc);
oDst.RotateFlip(RotateFlipType.Rotate270FlipNone);
pictureBox1.Image = oDst;
piRoteSum = piRoteSum + 270;
if (!pbRotateSaveFlg)
{
return;
}
ImageSave((Bitmap)pictureBox1.Image, 100, pictureBox1.ImageLocation,0,0);
}
}
/// <summary>
/// 右旋
/// </summary>
public void RotateRight()
{
if (pictureBox1.Image != null)
{
//扩展名判断
if (CheckFileExtension(this.Tag.ToString()) == FileExtension.PDF)
{
return;
}
Image oSrc = pictureBox1.Image;
Bitmap oDst = new Bitmap(oSrc);
oDst.RotateFlip(RotateFlipType.Rotate90FlipNone);
pictureBox1.Image = oDst;
piRoteSum = piRoteSum + 90;
if (!pbRotateSaveFlg)
{
return;
}
ImageSave((Bitmap)pictureBox1.Image, 100, pictureBox1.ImageLocation,0,0);
}
}

/// <summary>
/// 清除图片的记忆位置
/// </summary>
public void ClearImageMemory()
{
if (pictureBox1.Image != null)
{
pictureBox1.Image.Dispose();
}
if (pictureBox2.Image != null)
{
pictureBox2.Image.Dispose();
}
if (!webBrowser1.IsDisposed)
{
webBrowser1.Dispose();
}
}

        /// <summary>
/// 利用GC回收释放内存
/// </summary>
public void GCCollect()
{
pictureBox1.Image = null;
pictureBox2.Image = null;
webBrowser1 = null;
}
private void pictureBox2_Click(object sender, EventArgs e)
{
PictureBoxClick(sender, e);
}
private void pictureBox1_Click(object sender, EventArgs e)
{
PictureBoxClick(sender, e);
}

        private void PictureBoxClick(object sender, EventArgs e)
{
if (pbMultiMode)
{
if (IsControlKeyDown())
{
MultiSelected = !MultiSelected;
}
else if (IsShiftKeyDown())
{
Control oParent = Parent;
if (oParent != null)
{
int iFromIndex = 0;
//选择图片的标签
bool bHadSelected = false;
for (int i = 0; i < oParent.Controls.Count; i++)
{
if (oParent.Controls[i] != this &&
oParent.Controls[i] is PreviewControl
&& oParent.Controls[i].BackColor == SelectColor)
{
bHadSelected = true;
iFromIndex = i;
break;
}
}

                        int iToIndex = 0;
for (int j = 0; j < oParent.Controls.Count; j++)
{
if (oParent.Controls[j] == this &&
oParent.Controls[j] is PreviewControl)
{
iToIndex = j;
break;
}
}

                        if (!bHadSelected)
{
iFromIndex = iToIndex;
}

if (iToIndex < iFromIndex)
{
int temp = iFromIndex;
iFromIndex = iToIndex;
iToIndex = temp;
}

                        for (int k = iFromIndex; k <= iToIndex; k++)
{
if (oParent.Controls[k] is PreviewControl)
{
oParent.Controls[k].BackColor = SelectColor;
((PreviewControl)oParent.Controls[k]).MultiSelected = true;
}
}
}
}
else
{
Selected = true;
}
}
else
{
Selected = true;
if (poPictureSelected != null)
{
poPictureSelected(sender, e);
}
}
}

#region 文件扩展名格式check
public static FileExtension CheckFileExtension(string fileName)
{
if (!File.Exists(fileName))
{
return FileExtension.VALIDFILE;
}
FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
System.IO.BinaryReader br = new System.IO.BinaryReader(fs);
string fileType = string.Empty;
FileExtension extension = FileExtension.VALIDFILE;
try
{
byte data = br.ReadByte();
fileType += data.ToString();
data = br.ReadByte();
fileType += data.ToString();
extension = (FileExtension)Enum.Parse(typeof(FileExtension), fileType);
if (extension.ToString().Equals(fileType))
{
extension = FileExtension.VALIDFILE;
}
}
catch
{
extension = FileExtension.VALIDFILE;
}
finally
{
if (fs != null)
{
fs.Close();
br.Close();
}
}

   return extension;
}
//文件枚举类型
public enum FileExtension
{
JPEG = 255216,
TIF = 7373,
GIF = 7173,
BMP = 6677,
PNG = 13780,
PDF = 3780,
VALIDFILE = 9999999
}
#endregion

  /// <summary>
/// 保存图片
/// </summary>
/// <param name="src">图片路径</param>
/// <param name="scale">比例</param>
/// <param name="asSaveFile"></param>
/// <param name="aiWidth">宽度</param>
/// <param name="aiHeight">高度</param>
public static void ImageSave(Bitmap src, int scale, string asSaveFile, int aiWidth, int aiHeight)
{
int w = src.Width;
int h = src.Height;
if (scale < 100)
{
w = aiWidth;
h = aiHeight;
}
Bitmap dest = new Bitmap(w, h);
Graphics g = Graphics.FromImage(dest);
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.High;
g.DrawImage(src, 0, 0, w, h);
g.Dispose();
dest.Save(asSaveFile, ImageFormat.Jpeg);
dest.Dispose();
}
}

好了。代码都在这了。希望对各位能有所帮助,

下载地址:

http://files.cnblogs.com/kongwei521/WindowsFormsApplication.7z

winform中图片的左移 右移并记忆移动的位置相关推荐

  1. JS中或﹑与﹑否﹑异或﹑左移﹑右移﹑头尾补零的右移运算符

    1.二进制或运算符(or):符号为 | 逐位比较两个运算子,两个二进制位之中只要有一个为1,就返回1,否则返回0. 0 | 3 // 3 上面代码中,0和3的二进制形式分别是00和11,所以进行二进制 ...

  2. C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左移1位,其结果相当于什么?

    C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左移1位,其结果相当于什么? 答案: 右移,除以2   左移,乘以2 比如5,5的二进制表示是101那么右移一位之后是10就是2了,是整除 ...

  3. c语言左移15位,关于c语言中左移右移运算符的问题

    参照<c与指针>,在c语言中左移时,不论算术左移还是逻辑左移效果都是相同的.而且对于有符号和无符号类型执行相同的操作,即按照二进制位向左左移N位.例如: 1 clude 2 intmain ...

  4. java中的 31 和左移右移的关系简述

    java中的 31 和左移右移的关系简述 任何数乘以31 等于 这个数左移 五位 减去这个数 ​ n * 31 == (n << 5) - n " << " ...

  5. EASYUI- EASYUI左移右移 GRID中值

    EASYUI左移右移 GRID中值 $("#addAll").click(function(){var ids = [];var names = [];var srcrows = ...

  6. 图片放大缩小旋转左移右移镜像倒影android

    图片放大缩小旋转左移右移镜像倒影 demo: TestImage 1. 将 meinv.jpg 图片拷贝到以下目录TestImage\app\src\main\res\mipmap-hdpi 1.An ...

  7. picturebox显示服务器图片大小,WinForm中实现picturebox自适应图片大小的方法

    本文实例讲述了winform中实现picturebox自适应图片大小的方法.分享给大家供大家参考,具体如下: picturebox控件共有两种载入图片方式,分别为: picturebox1.backg ...

  8. C#Winform中picturebox控件加载图片后无法释放

    问题描述   最近测试程序功能时发现存在图片资源一直被占用无法释放的问题.   程序的功能大致为打开窗口时从服务器端临时下载图片到本地,然后在窗口中显示,窗口关闭时清除下载的文件.在最后关闭窗口时会报 ...

  9. 单片机c语言左移的作用,单片机c语言中的左移右移

    // 据说有些编译器采用逻辑右移,即左端补0 结果:a = 0xe3 (11100011) 1当左移移出的是"1"而不是0时,你该怎么想? 2 当左移的操作数是一个sign型是,你 ...

最新文章

  1. adb 显示手机分辨率
  2. 【Python】Spyder编译器“updating indices”问题导致程序无法运行或调试
  3. 接口自动化实现图片上传(selenium/RF)
  4. 【BZOJ2131】免费的馅饼,坐标转换与DP
  5. tp5 集成支付宝h5支付接口
  6. thinkphp开启子域名无法正常访问_解决TP6报错“当前访问路由未定义或不匹配”...
  7. Python 包管理工具poetry配置国内PyPI镜像源
  8. 计算机四级等级考试网络工程师知识点-【操作系统原理+计算机网络两科完整】
  9. 怎么样可以对腾讯云IM-SDK集成(web端)完成IM登录
  10. linux三星电脑开机怎么进入页面,三星Samsung笔记本怎么开机进入BIOS
  11. pandas学习(四)之数据填充
  12. 为人处世之道,与君共勉!
  13. java fly bird小游戏_Flappy Bird 小游戏
  14. Android调用系统输入法
  15. 全球著名化妆品品牌--SEPHORA丝芙兰验厂
  16. Element ui 中的tree 在数据前面添加自定义图标
  17. 会声会影老牌视频剪辑软件2023新版本升级
  18. 4.4 使用倾斜工具和整形工具制作图标 [Illustrator CC教程]
  19. Java面试手写编程题(面试官经常让人手写)
  20. VSCode的配置和插件同步到多台电脑

热门文章

  1. 基于jupyter notebook的python编程-----利用梯度下降算法求解多元线性回归方程,并与最小二乘法求解进行精度对比
  2. 运用C语言实现向量积
  3. 基于搜索的路径寻找方法(Dijkstra, A*和Jump Point Search)
  4. 按头安利 好看又实用的日式虚幻UE4素材看这里
  5. 爬虫神器之 PyQuery 实用教程(一)
  6. 多目标规划(数学建模)
  7. 博客人少的原因(给大一大二同学说的)
  8. 搭建开源Jumpserver跳板机
  9. Oracle Hints,Oracle并行模式(Parallel) /*+parallel(t,4)*/ 在SQL调优中的重要作用
  10. docker一个简单易用的容器管理平台-Humpback