C#中,关于在一个窗口显示多张图片的问题

duduji 2012-06-11 02:12:05
我想在一个窗口中,建立小的显示窗口,下面有两个按钮,“上一部分”“下一部分”,每次按按钮,出现一张图片。这个该怎么实现啊?是用panel还是用picture??
谢谢大神们了,菜鸟感激不尽!
...全文
1433 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
ar 2014-04-10
  • 打赏
  • 举报
回复
picturebox.读取文件夹中的图片 你可以 先把目录下面的文件名保存起来. 然后通过文件名来读取文件.显示
LizZheng 2014-04-10
  • 打赏
  • 举报
回复
shushufang 2013-12-22
  • 打赏
  • 举报
回复
引用 14 楼 duduji 的回复:
是在 _ShowPic.Load(@"F:\Files\相片\2", SearchOption.TopDirectoryOnly); 换上图片所在路径么?为什么我点击之后会出现: _ShowPic.Last(); 未将对象引用设置到对象的实例。
我也是这个情况,请问怎么解决啊?
SocketUp 2012-06-12
  • 打赏
  • 举报
回复
不解释
cca313 2012-06-12
  • 打赏
  • 举报
回复
大牛能解释下,为什么imglist会占用很大的内存,而且会把图片质量拉下来?
karnyang 2012-06-12
  • 打赏
  • 举报
回复
ceshi网络测试yyyyyyyyyyyyyyyyyyyyyy!
SocketUp 2012-06-12
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;

namespace WindowsFormsApplication1
{
/// <summary>
/// 改变图片委托,我又滥用委托了
/// </summary>
/// <param name="message"></param>
public delegate void ChangeImageHandler(String message);

public partial class Form1 : Form
{
private ShowPic _ShowPic;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
_ShowPic = new ShowPic(pictureBox1);
_ShowPic.ChangeImage += new ChangeImageHandler(ChangeImage);
_ShowPic.Load(@"F:\Files\相片\2", SearchOption.TopDirectoryOnly);
}

private void button1_Click(object sender, EventArgs e)
{
// 显示上一张图片
_ShowPic.Last();
}

private void button2_Click(object sender, EventArgs e)
{
// 显示下一张图片
_ShowPic.Next();
}

private void ChangeImage(String message)
{
// 改变图片事件
this.Text = message;
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (_ShowPic != null)
{
_ShowPic = null;
}
}
}

/// <summary>
/// 显示图片类
/// </summary>
public sealed class ShowPic
{
/// <summary>
/// 改变图片事件,我又滥用事件了
/// </summary>
public event ChangeImageHandler ChangeImage;

/// <summary>
/// 图片列表
/// </summary>
private String[] _ArrPicPath;

/// <summary>
/// 图片索引值
/// </summary>
private Int32 _Index;

/// <summary>
/// 要显示图片的PictureBox控件
/// </summary>
private PictureBox _PictureBox;

/// <summary>
/// 改变图片事件触发函数
/// </summary>
/// <param name="message"></param>
private void OnChangeImage(String message)
{
ChangeImageHandler temp = Interlocked.CompareExchange<ChangeImageHandler>(ref ChangeImage, null, null);
if (temp != null)
{
temp(message);
}
}

/// <summary>
/// 构造函数
/// </summary>
/// <param name="pictureBox">PictureBox控件</param>
public ShowPic(PictureBox pictureBox)
{
_PictureBox = pictureBox;
_Index = 0;
}

/// <summary>
/// 加载图片
/// </summary>
/// <param name="path">文件夹路径</param>
/// <param name="searchOption">搜索参数</param>
public void Load(String path, SearchOption searchOption)
{
if (!Directory.Exists(path))
{
OnChangeImage(path + " 路径不存在");
throw new DirectoryNotFoundException(path + " 路径不存在");
}

// 获取文件夹下所有图片
_ArrPicPath = System.IO.Directory.GetFiles(path,"*.jpg", searchOption);

// 加载第一步图片
LoadImage();
}

/// <summary>
/// 上一张
/// </summary>
public void Last()
{
lock (_ArrPicPath)
{
if (_Index > 0)
{
_Index--;
}
else
{
OnChangeImage("已经是第一张");
return;
}
}

LoadImage();
}

/// <summary>
/// 下一张
/// </summary>
public void Next()
{
lock (_ArrPicPath)
{
if (_Index < _ArrPicPath.Length - 1)
{
_Index++;
}
else
{
OnChangeImage("已经是最后一张");
return;
}
}

LoadImage();
}

/// <summary>
/// 加载图片到PictureBox
/// </summary>
private void LoadImage()
{
if (_ArrPicPath == null || _ArrPicPath.Length <= 0)
{
OnChangeImage("没有图片");
return;
}

String path = _ArrPicPath[_Index];
if (File.Exists(path))
{
_PictureBox.Load(path);
OnChangeImage(path);
}
}
}
}
SocketUp 2012-06-12
  • 打赏
  • 举报
回复
上班先
duduji 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
千万别听楼上两位说的,把图片放到ImageList:
1. 放到ImageList里,启动运行时是会占内存的,如果图片很多很大~~~~
2. ImageList里放的一般都是很小的图片,如果大图片扔进去,图片质量,大小都会被严重改造
3. 不明白为什么会想到放到ImageList里,就算说放到资源里,也比ImageList强太多
[/Quote]
大神可否贴些代码??
duduji 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
能不能重新表述下,没看懂。 最好带上一个 想要实现什么效果的草图
[/Quote]


duduji 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

public partial class Form1 : Form
{
int i=0;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
//……
[/Quote]
imageList 控件是不是要先拖到界面中啊?但是我试了一下,拖不进去
SocketUp 2012-06-12
  • 打赏
  • 举报
回复
千万别听楼上两位说的,把图片放到ImageList:
1. 放到ImageList里,启动运行时是会占内存的,如果图片很多很大~~~~
2. ImageList里放的一般都是很小的图片,如果大图片扔进去,图片质量,大小都会被严重改造
3. 不明白为什么会想到放到ImageList里,就算说放到资源里,也比ImageList强太多
nokisslinying 2012-06-12
  • 打赏
  • 举报
回复

public partial class Form1 : Form
{
int i=0;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
//初始化
pictureBox1.Image = imageList1.Images[0];
}
//下一步
private void button2_Click(object sender, EventArgs e)
{

if (i == imageList1.Images.Count-1)
{
i = 0;
pictureBox1.Image = imageList1.Images[i];
}
else
{
i = i + 1;
pictureBox1.Image = imageList1.Images[i];
}
}
// 上一步
private void button3_Click(object sender, EventArgs e)
{
if (i == 0)
{
i = imageList1.Images.Count - 1;
pictureBox1.Image = imageList1.Images[i];

}
else
{
i = i - 1;
pictureBox1.Image = imageList1.Images[i];
}
}
}
christ 2012-06-12
  • 打赏
  • 举报
回复
比较简单的方法
LZ可以在打开小窗体的时候把图片地址放入一个string数组里面
在小窗体上面放一个picturebox ,根据传过来的图片地址显示图片,根据数组中index 上一张 下一张

SocketUp 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

不理解 所以不解释!
[/Quote]

那你解释给我听嘛
  • 打赏
  • 举报
回复
不理解 所以不解释!
SocketUp 2012-06-12
  • 打赏
  • 举报
回复
自己调试
duduji 2012-06-12
  • 打赏
  • 举报
回复
是在 _ShowPic.Load(@"F:\Files\相片\2", SearchOption.TopDirectoryOnly);
换上图片所在路径么?为什么我点击之后会出现:
_ShowPic.Last(); 未将对象引用设置到对象的实例。
熙风 2012-06-11
  • 打赏
  • 举报
回复
用Imagelist控件存放图片
int j=0;
下一部分按钮事件
if (j == imageList1.Images.Count)
{
j = 0;
}
pictureBox1.Image = imageList1.Images[j];
j++;

下一部分按钮事件
if (j ==0)
{
j = imageList1.Images.Count-1;
}
pictureBox1.Image = imageList1.Images[j];
j--;
小D2013 2012-06-11
  • 打赏
  • 举报
回复
用什么都可以,这个没什么关系的,在显示图片的地方,你可以假设他是一个button,也可以假设它是一个picture,或其他什么的,你要做的只是在点击上一部分时,要更新那个显示图片的控件的某个属性
加载更多回复(1)
项目名称:高仿QQ2013通讯DEMO-10.30更新 版本号:10.30 最新版本 下载内容: (C#)CC2013局域网通讯源码一份, 可引用至工具箱最新版CSkin.dll-10.30版本界面库一份。 界面库更新说明: CC2013-10.30 1.由于SkinForm名字太多人使用,界面库命名正式改为CSkin.dll,官网www.cskin.net。 2.SkinTabControl标签添加菜单箭头,可点击展开菜单。 3.SkinTabControl添加标签关闭按钮。 4.修复部分文乱码问题。 5.优化好友列表右键菜单。 6.将窗体自定义系统按钮改为集合模式,可添加无数个自定义系统按钮。自定义系统按钮事件可以 e.参数 来判断。 7.增加360安全卫士-DEMO案例。 8.增加SkinAnimatorImg控件,用于支持位图动画的播放。如360的动态logo。 9.各种细节BUG优化。 CC2013-10.11 1.添加SkinTabControlEx,加入更加自定义的美化属性和动画效果。 2.添加SkinAnimator,通用动画控件。 3.添加Html编辑器控件 4.修复SkinButton图标和文本相对位置的BUG CC2013-9.26 1.优化好友列表CPU占用 2.好友列表加入好友登录平台属性:安卓 苹果 WEBQQ PC 3.优化标题绘制模式,新添标题绘制模式属性。 4.新添标题偏移度属性。 5.加入圆形进度条控件:ProgressIndicator。 CC2013-9.5.2 1.优化截图控件,截图工具栏加入新功能。 2.解决个人信息卡和天气窗体显示后不会消失的问题。 3.各种细节BUG优化。 CC2013-9.5.1 1.解决贴边左右隐藏的BUG。 2.解决窗体点击事件不能触发的问题。 3.优化SkinButton继承父容器背景色的代码。 4.解决SkinButton异常错误。 CC2013-9.3 1.好友列表右键菜单没反应问题。 2.新增美化控件SkinDatagridview。 3.密码软件盘回删不了文字问题。 4.双击窗体最大化,最大化后再双击恢复原大小,(win7)。 5.部分细节调优。 实现功能: 1.界面库多达25个自定义换肤控件,让每个控件设设属性就能达到你想要的效果,支持图片换肤和色调绘制。 2.四边阴影,毛边效果,可以设置阴影宽度和阴影颜色,支持所有系统。 3.拥有密码键盘输入,防护更贴心。 4.8种圆角窗体模式供你选择,淋漓尽致,润滑如圆。 5.登录主界面后,有登陆提示窗,提示上次登录的城市和时间。 6.皮肤随心变:拖动任意一张图片至主界面,就可以改变皮肤。 7.皮肤色调获取:改变皮肤的同时,将计算图片色调,再将其运用到窗体背景色。 8.皮肤尾部渐变:上下左右方均可实现,渐变皮肤。 9.皮肤拖拉方向:可以选择皮肤在拉伸的时候,粘着哪一边拖拉。 10.GDI+界面重绘,处理消息机制,3种移动模式和拉伸是否启用只需要设置一个属性的事就可以解决。 11.界面渐变闪现和闪退:不再像平凡的突然出现,采用API渐变机制,渐渐出现和消失,win7系统下还有动态缩小至任务的效果。 12.完美好友列表,可添加上千好友,不卡不掉线,还可以拖动好友到其他分组。 13.好友悬浮至头像可以查看详细资料卡。 14.窗口可调渐变后透明度:让窗体看起来更像是Vista玻璃窗体风格。 15.聊天窗口可发送图片,大文件,表情,还有震动。 16.按钮控件背景色拥有继承窗体背景主色调的功能,让整体色调保持一致。 17.更是有和如出一辙的扣扣截图。仿真度也达到100%,完美修复所有已知BUG。 18.聊天窗口,可以调字体颜色和字体样式等多项功能。 20.SkinLabel与SkinButton控件字体与窗体标题可以根据背景色暗亮度自动调节字体为黑还是白。 21.MessageBox提示框的美化,并继承调用窗口的色调与背景,MessageBox可所谓已达到帅气的不能再帅气的境界了。 22.天气皮肤自动变,所有窗体根据当地天气自动决定皮肤背景,CC最帅气功能之一。 23.个人资料卡及聊天窗体拥有动态CC秀展示。 24.主界面拖动换肤的同时,所关联的子窗体皮肤也会跟着变。 25.多线程大文件传输功能,支持无上限大文件传输,有进度条显示进程度。 26.界面库已封装了大图取主色调,颜色判断暗亮等多项功能。 27.如果你觉得获取天气让你的登录太慢不想要的话,注释相关调用方法即可快速登录。 界面库交流群:306485590 本人QQ:345015918 注意: Demo版不包括更新,为方便用户查看和使用属性等方法,dll只轻微加密。想反编译的就不要尝试了,里面有上百个类,改错改到你哭。 介意购买正版,永久更新配源码。 看截图或者想购买商业版的用户请访问以下地址: http://www.51aspx.com/code/TotalLikeQQ2013 特权:购买商业版的用户,有权利享有最快的更新服务,第一时间将最新版本的dll源码送到你手上。 使本项目源码或本项目生成的DLL前请仔细阅读以下协议内容,如果你同意以下协议才能使用本项目所有的功能,否则如果你违反了以下协议,有可能陷入法律纠纷和赔偿,作者保留追究法律责任的权利。 1、你可以在开发的软件产品使用和修改本项目的源码和DLL,但是请保留所有相关的版权信息。 2、不能将本项目源码与作者的其他项目整合作为一个单独的软件售卖给他人使用。 3、不能传播本项目的源码和DLL,包括上传到网上、拷贝给他人等方式。 4、以上协议暂时定制,由于还不完善,作者保留以后修改协议的权利。 时间:2013-7-5 作者: 乔克斯 请保留以上版权信息,否则作者将保留追究法律责任。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧