여러 페이지가있는 .TIFF 파일을 표시하는 FlowLayoutPanel을 사용하는 WinForm 응용 프로그램이 있습니다. FlowLayoutPanel은 모든 페이지를 축소판보기로 표시합니다.
개별 항목에 대해 잘 작동하는 끌어서 놓기 논리를 구현했습니다. 이제는 사용자가 여러 축소판을 선택하고 (CTRL이나 Shift 키 사용) 드래그 드롭을 다른 지점으로 드래그 할 수 있도록 변경하려고합니다.FlowLayoutPanel에서 여러 항목 끌어 놓기
//** Logic after each thumbnail is generated:
PictureBox thumb = new myProject.utility.PictureBox(pageNum);
thumb.Image = doc.getThumb(pageNum); //since we pre loaded, we won't stall the gui thread.
thumb.Click += new System.EventHandler(
(thumbSend, thumbEvent) =>
{
highLightThumb(thumb.getPage());
}
);
thumb.DoubleClick += new System.EventHandler(
(thumbSend, thumbEvent) =>
{
selectedDoc = thumb.getPage();
me.Visible = false;
}
);
thumbFlow.Controls.Add(thumb);
if (selectedDoc == pageNum)
highLightThumb(pageNum);
//** Highlight Methods
private void highLightThumb(int page)
{
//clear highlight
foreach (Control c in thumbFlow.Controls)
{
if (c is PictureBox)
{
((PictureBox)c).highlight = false;
}
}
//apply highlight
foreach (Control c in thumbFlow.Controls)
{
if (c is PictureBox)
{
PictureBox thumbFrame = (PictureBox)c;
if (page == thumbFrame.getPage())
thumbFrame.highlight = true;
}
}
}
아래는 기존 드래그 드롭 논리입니다.
//**********************//
//** Drag/Drop Events **//
//**********************//
private void thumbFlow_DragDrop(object sender, DragEventArgs e)
{
PictureBox data = (PictureBox)e.Data.GetData(typeof(PictureBox));
FlowLayoutPanel _destination = (FlowLayoutPanel)sender;
Point p = _destination.PointToClient(new Point(e.X, e.Y));
var item = _destination.GetChildAtPoint(p);
if (item == null)
{
p.Y = p.Y - 10;
item = _destination.GetChildAtPoint(p);
}
int index = _destination.Controls.GetChildIndex(item, false);
if (index < 0)
return;
_destination.Controls.SetChildIndex(data, index);
_destination.Invalidate();
}
private void thumbFlow_DragEnter(object sender, DragEventArgs e)
{
//apply/clear highlight
foreach (Control c in thumbFlow.Controls)
{
if (c is PictureBox)
{
PictureBox thumbFrame = (PictureBox)c;
if (thumbFrame == ActiveControl)
{
thumbFrame.highlight = true;
}
else
{
((PictureBox)c).highlight = false;
}
}
}
e.Effect = DragDropEffects.Move;
if (dragDropOccurred == false)
{
dragDropOccurred = true;
}
}
//** Scroll when user drags above or below the window object **//
private void thumbFlow_DragLeave(object sender, EventArgs e)
{
int BegY_ThumbFlow = this.thumbFlow.FindForm().PointToClient(this.thumbFlow.Parent.PointToScreen(this.thumbFlow.Location)).Y;
int thumbFlowBound_Y = this.thumbFlow.Height + BegY_ThumbFlow;
int mouseY = this.thumbFlow.FindForm().PointToClient(MousePosition).Y;
while (mouseY >= thumbFlowBound_Y)
{
thumbFlow.VerticalScroll.Value = thumbFlow.VerticalScroll.Value + DRAG_DROP_SCROLL_AMT;
mouseY = thumbFlow.FindForm().PointToClient(MousePosition).Y;
thumbFlow.Refresh();
}
while (mouseY <= BegY_ThumbFlow)
{
thumbFlow.VerticalScroll.Value = thumbFlow.VerticalScroll.Value - DRAG_DROP_SCROLL_AMT;
mouseY = thumbFlow.FindForm().PointToClient(MousePosition).Y;
thumbFlow.Refresh();
}
}
내가에서 찾고있는 옵션은 그 다음 끌어서 놓기의 dragEnter 루틴을 변경 하이라이트
if (Control.ModifierKeys != Keys.Control)
//**
if (Control.ModifierKeys != Keys.Shift)
비활성화를 선택하려면 Ctrl 있는지 확인 또는 Shift 키를 위해 highLightThumb 방법을 변경하지 것이다. 어떤 도움이라도 대단히 감사하겠습니다. 여기