2012-07-03 2 views
0

체스 테이블이 있고 규칙에 따라 요소가 움직이고 있습니다. 그러나 규칙에서 드래그하면 버튼이 사라집니다 ... 어떻게 해결할 수 있습니까 ??? (빨간 버튼은 내 요소를 이동할 수있는 위치를 표시합니다) 예를 들어 기사가 규칙으로 이동 중입니다 (빨간색 버튼을 넘겨주지 않으면 아무런 문제가 없습니다). 그러나 빨간색 장소를 지나칠 때 드롭합니다. 거기에 기사가 사라지고 붉은 색의 장소가 원래 색으로 바뀝니다. (기사가있는 곳을 가리키는 빨간 장소가 없습니다.) 나는 디버그를 만들려고했지만, C#과 디버깅에서 나는 문제가 해결되지 않았기 때문에 새로운 것이다. 나는 내 길을 밝혀 주면 행복 할거야. 내가 어떻게 해결할 수 있니? 감사합니다체스 테이블에 문제 끌기

 void btn_DragEnter(object sender, DragEventArgs e) 
     { 
     Button button = (Button)sender; 
     e.Effect = DragDropEffects.Move; 
     for (int x = 0; x <= 7; x++) 
     { 
     for (int y = 0; y <= 7; y++) 
     { 
     btn[x, y].Image = null; 
     if ((x + y) % 2 == 0) 
     btn[x, y].BackColor = Color.Black; 
     else 
     btn[x, y].BackColor = Color.White; 
     } 
     } 
     } 

     void btn_DragDrop(object sender, DragEventArgs e) 
     { 
     Button button = (Button)sender; 
     button.Image = (Bitmap)e.Data.GetData(DataFormats.Bitmap); 

     int[] dizi = (int[])button.Tag; 
     int x = dizi[0]; 
     int y = dizi[1]; 

     for (int a = 0; a <= 7; a++) 
     { 
     for (int b = 0; b <= 7; b++) 
     { 
     btn[a, b].AllowDrop = false; 
     } 
     } 

     if ((x + 1 >= 0 && y + 2 <= 7) && (y + 2 >= 0 && x + 1 <= 7)) 
     { 
     btn[x + 1, y + 2].BackColor = Color.Red; 
     btn[x + 1, y + 2].AllowDrop = true; 
     } 
     if ((x + 1 >= 0 && y - 2 <= 7) && (y - 2 >= 0 && x + 1 <= 7)) 
     { 
     btn[x + 1, y - 2].BackColor = Color.Red; 
     btn[x + 1, y - 2].AllowDrop = true; 
     } 
     if ((x - 1 >= 0 && y + 2 <= 7) && (y + 2 >= 0 && x - 1 <= 7)) 
     { 
     btn[x - 1, y + 2].BackColor = Color.Red; 
     btn[x - 1, y + 2].AllowDrop = true; 
     } 
     if ((x - 1 >= 0 && y - 2 <= 7) && (y - 2 >= 0 && x - 1 <= 7)) 
     { 
     btn[x - 1, y - 2].BackColor = Color.Red; 
     btn[x - 1, y - 2].AllowDrop = true; 
     } 
     if ((x + 2 >= 0 && y + 1 <= 7) && (y + 1 >= 0 && x + 2 <= 7)) 
     { 
     btn[x + 2, y + 1].BackColor = Color.Red; 
     btn[x + 2, y + 1].AllowDrop = true; 
     } 
     if ((x + 2 >= 0 && y - 1 <= 7) && (y - 1 >= 0 && x + 2 <= 7)) 
     { 
     btn[x + 2, y - 1].BackColor = Color.Red; 
     btn[x + 2, y - 1].AllowDrop = true; 
     } 
     if ((x - 2 >= 0 && y + 1 <= 7) && (y + 1 >= 0 && x - 2 <= 7)) 
     { 
     btn[x - 2, y + 1].BackColor = Color.Red; 
     btn[x - 2, y + 1].AllowDrop = true; 
     } 
     if ((x - 2 >= 0 && y - 1 <= 7) && (y - 1 >= 0 && x - 2 <= 7)) 
     { 
     btn[x - 2, y - 1].BackColor = Color.Red; 
     btn[x - 2, y - 1].AllowDrop = true; 
     } 
     } 

답변

0

DoDragDrop은 실제로 조각을 떨어 뜨렸을 때만 호출됩니다. MouseDown 또는 MouseMove에서 끌기 시작시 DoDragDrop 호출 전에 조각을 놓을 수있는 위치를 결정하는 논리를 실행해야합니다. 또한 DragEnter 함수에서 빨간색 버튼을 비우는 것 같습니다. DoDragDrop에 대한 호출 후에 MouseDown/MouseMove 함수에서도이를 수행해야합니다.

+0

감사합니다. 알렉스 덕분에 도움이되었습니다. 당신 DragEnter로 맞습니다. 그래서 나는 DragEnter에서 for 루프를 지웠다. 괜찮 았지만 이번에는 움직 인 기사를 움직이면 나이트의 이미지는 이전 위치에 머물러 있습니다. (기사를 움직일 때마다 기사의 이전 이미지가 유지 될 때마다 의미합니다.) –

+0

DragEnter에서 for 루프를 지우는 대신 DragDrop의 끝으로 이동하거나 DoDragDrop 호출 후 배치하십시오. – AlexDev

+0

감사합니다. Alex 나는 당신에게 많은 것을 감사했습니다. 그것은 문제를 해결했습니다. mousedown 이벤트에서 button.DoDragDrop .... statement 버튼 backcolar가 빨간색인지 확인한 다음 버튼 이미지를 null로 지정했습니다. 그렇지 않으면 나이트 이미지를 버튼 이미지에 할당했습니다. –