الساحات سلط الضوء على رقعة الشطرنج CustomControl لا تستمر إلى ما بعد الحدث MouseDown الأولي

StackOverflow https://stackoverflow.com/questions/431739

  •  08-07-2019
  •  | 
  •  

سؤال

ولقد تم ترميز التطبيق لعبة الشطرنج Windows في C # باعتبارها ممارسة في صقل مهاراتي، وأيضا لأنه متعة. ولقد تضمنت الوظائف التي يسمح لاعب لتحديد الخيار لتسليط الضوء على الساحات قطعة يمكن ان تتحرك قانونيا عندما يحصل النقر فوقه. A CustomControl مقابض جعل من رقعة الشطرنج ويسلط الضوء أيضا على الساحات.

ويعمل كل شيء كما هو مخطط لها حتى يبدأ لاعب لسحب قطعة إلى مربع جديد. لحظة تحرك الماوس، ويسلط الضوء تزول. وأظن أن يتم رفع الحدث الطلاء والمجلس يعيد رسم نفسه. ومنذ أبرز ليست جزءا من تخطيط لوحة الأولي، فإنها لا تحصل على الانتباه.

ما أود أن يحدث هو للالساحات أن يبقي أبرز حتى يتم إسقاط قطعة في مربع وجهتها. هل من الممكن تحقيق ذلك؟ سيكون موضع تقدير أي اقتراحات.

وكود الزائف:

    void piece_MouseDown(object sender, MouseEventArgs e)
    {
        Piece piece = (Piece)sender;

        legalSquares = CalculateLegalSquares(piece.CurrentSquare);

        if (legalSquares.Count > 0 && this.showLegalMoves)
        {
            chessBoard1.HighlightSquares(legalSquares);
        }

        // I believe a Paint event gets raised either here...
        piece.DoDragDrop(piece, DragDropEffects.Move);
    }

    void piece_DragEnter(object sender, DragEventArgs e)
    {
        // ...or here, that removes the highlights.
        if (e.Data.GetDataPresent("Chess.Piece"))
        {
            e.Effect = DragDropEffects.Move;
        }
        else
        {
            e.Effect = DragDropEffects.None;
        }
    }

    void piece_DragDrop(object sender, DragEventArgs e)
    {
        Piece piece = (Piece)e.Data.GetData("Chess.Piece");

        if (piece.CurrentSquare != dropSquare)
        {
            if (legalSquares.Contains(dropSquare))
            {
                // This is where I’d like the highlights to stop

                // DoStuff()
            }
        }
    }
هل كانت مفيدة؟

المحلول

وهذا يبدو وكأنه كنت تسليط الضوء على الساحات صالحة من خلال الاعتماد بشكل مباشر، ولكن هذا لن يحصل تمحى على أي إعادة رسم. من المحتمل أن تفقد أبرز إذا تم طلاؤها نافذتك لأسباب أخرى أيضا، مثل تقليل واستعادتها، أو سحب نافذة أخرى على أعلى من ذلك.

وإذا كان هذا هو الحال، وربما كنت بحاجة إلى تجاوز أسلوب OnPaint والقيام إبراز هناك. عندما تريد تغيير ما يتم تمييز، تعيين بعض الدول في صفك للسيطرة على ما يتم رسمها على النحو المبين في طريقة OnPaint، ومن ثم يبطل نافذة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top