728x90
반응형
728x170
■ 이미지 리스트를 편집하는 방법을 보여준다.
▶ MainForm.cs
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace TestProject
{
/// <summary>
/// 메인 폼
/// </summary>
public partial class MainForm : Form
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region Field
/// <summary>
/// 비트맵 리스트
/// </summary>
private List<Bitmap> bitmapList = new List<Bitmap>();
/// <summary>
/// 비트맵 마진
/// </summary>
private const int BITMAP_MARGIN = 10;
/// <summary>
/// 클릭 인덱스
/// </summary>
private int indexClicked = -1;
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 생성자 - MainForm()
/// <summary>
/// 생성자
/// </summary>
public MainForm()
{
InitializeComponent();
this.bitmapPanel.MouseDown += bitmapPanel_MouseDown;
this.moveLeftMenuItem.Click += moveLeftMenuItem_Click;
this.moveRightMenuItem.Click += moveRightMenuItem_Click;
this.deletePictureMenuItem.Click += deletePictureMenuItem_Click;
this.addPictureMenuItem.Click += addPictureMenuItem_Click;
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Private
//////////////////////////////////////////////////////////////////////////////// Event
#region 비트맵 패널 마우스 DOWN 처리하기 - bitmapPanel_MouseDown(sender, e)
/// <summary>
/// 비트맵 패널 마우스 DOWN 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void bitmapPanel_MouseDown(object sender, MouseEventArgs e)
{
if(e.Button != MouseButtons.Right)
{
return;
}
ShowContextMenu(e.Location);
}
#endregion
#region 왼쪽으로 이동 메뉴 항목 클릭시 처리하기 - moveLeftMenuItem_Click(sender, e)
/// <summary>
/// 왼쪽으로 이동 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void moveLeftMenuItem_Click(object sender, EventArgs e)
{
Bitmap bitmap = this.bitmapList[this.indexClicked];
this.bitmapList.RemoveAt(this.indexClicked);
this.bitmapList.Insert(this.indexClicked - 1, bitmap);
ArrangePanel();
}
#endregion
#region 오른쪽으로 이동 메뉴 항목 클릭시 처리하기 - moveRightMenuItem_Click(sender, e)
/// <summary>
/// 오른쪽으로 이동 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void moveRightMenuItem_Click(object sender, EventArgs e)
{
Bitmap bitmap = this.bitmapList[this.indexClicked];
this.bitmapList.RemoveAt(this.indexClicked);
this.bitmapList.Insert(this.indexClicked + 1, bitmap);
ArrangePanel();
}
#endregion
#region 그림 삭제 메뉴 항목 클릭시 처리하기 - deletePictureMenuItem_Click(sender, e)
/// <summary>
/// 그림 삭제 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void deletePictureMenuItem_Click(object sender, EventArgs e)
{
if(MessageBox.Show("이 그림을 삭제하시겠습니까?", "확인", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
this.bitmapList.RemoveAt(this.indexClicked);
ArrangePanel();
}
}
#endregion
#region 그림 추가 메뉴 항목 클릭시 처리하기 - addPictureMenuItem_Click(sender, e)
/// <summary>
/// 그림 추가 메뉴 항목 클릭시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void addPictureMenuItem_Click(object sender, EventArgs e)
{
try
{
if(this.openFileDialog.ShowDialog() == DialogResult.OK)
{
int i = 0;
foreach(string filePath in this.openFileDialog.FileNames)
{
Bitmap bitmap = new Bitmap(filePath);
this.bitmapList.Insert(this.indexClicked + i, bitmap);
i++;
}
ArrangePanel();
}
}
catch(Exception exception)
{
MessageBox.Show(exception.Message);
}
}
#endregion
#region 픽처 박스 마우스 DOWN 처리하기 - pictureBox_MouseDown(sender, e)
/// <summary>
/// 픽처 박스 마우스 DOWN 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private void pictureBox_MouseDown(object sender, MouseEventArgs e)
{
if(e.Button != MouseButtons.Right)
{
return;
}
PictureBox pictureBox = sender as PictureBox;
ShowContextMenu(new Point(pictureBox.Left + e.X, pictureBox.Top + e.Y));
}
#endregion
//////////////////////////////////////////////////////////////////////////////// Function
#region 패널 배열하기 - ArrangePanel()
/// <summary>
/// 패널 배열하기
/// </summary>
private void ArrangePanel()
{
this.bitmapPanel.Controls.Clear();
int x = BITMAP_MARGIN;
int y = BITMAP_MARGIN;
foreach(Bitmap bitmap in this.bitmapList)
{
PictureBox pictureBox = new PictureBox();
pictureBox.SizeMode = PictureBoxSizeMode.AutoSize;
pictureBox.Location = new Point(x, y);
pictureBox.Image = bitmap;
pictureBox.Visible = true;
pictureBox.MouseDown += pictureBox_MouseDown;
this.bitmapPanel.Controls.Add(pictureBox);
x += pictureBox.Width + BITMAP_MARGIN;
}
PictureBox placeHolderPictureBox = new PictureBox();
placeHolderPictureBox.Location = new Point(x, y);
placeHolderPictureBox.Size = new Size(0, 0);
placeHolderPictureBox.Visible = true;
placeHolderPictureBox.MouseDown += pictureBox_MouseDown;
this.bitmapPanel.Controls.Add(placeHolderPictureBox);
}
#endregion
#region 컨텍스트 메뉴 표시하기 - ShowContextMenu(point)
/// <summary>
/// 컨텍스트 메뉴 표시하기
/// </summary>
/// <param name="point">포인트</param>
private void ShowContextMenu(Point point)
{
bool clickedOnPicture = false;
this.indexClicked = this.bitmapList.Count;
int x = point.X + this.bitmapPanel.HorizontalScroll.Value;
for(int i = 0; i < this.bitmapList.Count; i++)
{
x -= BITMAP_MARGIN;
if(x < 0)
{
this.indexClicked = i;
break;
}
x -= this.bitmapPanel.Controls[i].Width;
if(x < 0)
{
this.indexClicked = i;
clickedOnPicture = true;
break;
}
}
this.moveLeftMenuItem.Enabled = (clickedOnPicture && (this.indexClicked > 0 ));
this.moveRightMenuItem.Enabled = (clickedOnPicture && (this.indexClicked < this.bitmapList.Count - 1));
this.deletePictureMenuItem.Enabled = clickedOnPicture;
this.addPictureMenuItem.Enabled = !clickedOnPicture;
this.contextMenu.Show(this.bitmapPanel, point);
}
#endregion
}
}
728x90
반응형
그리드형(광고전용)
'C# > WinForm' 카테고리의 다른 글
[C#/WINFORM] 핀터레스트 스타일 대각선 그림 몽타지 사용하기 (0) | 2020.07.24 |
---|---|
[C#/WINFORM] Bitmap 클래스 : 색상 영역 설정하기 (0) | 2020.07.23 |
[C#/WINFORM] Bitmap 클래스 : 모노크롬 비트맵 구하기 (0) | 2020.07.23 |
[C#/WINFORM] DataGridView 클래스 : CellDoubleClick 이벤트를 사용해 체크 박스 컬럼 입력하기 (0) | 2020.07.23 |
[C#/WINFORM] 이미지 리스트에서 이미지 드래그하기 (0) | 2020.07.22 |
[C#/WINFORM] PrivateFontCollection 클래스 : 커스텀 폰트 사용하기 (0) | 2020.07.22 |
[C#/WINFORM] 싸인파를 따라 반전된 색상으로 텍스트 그리기 (0) | 2020.07.21 |
[C#/WINFORM] 대각선을 따라 반전된 색상으로 텍스트 그리기 (0) | 2020.07.21 |
[C#/WINFORM] 위쪽 및 아래쪽 절반의 색상으로 반전된 텍스트 그리기 (0) | 2020.07.20 |
[C#/WINFORM] 개선된 투명 배경 이미지 구하기 (0) | 2020.07.20 |
댓글을 달아 주세요