我想構建一個應用程式來使用 C# 可視化搜索演算法(例如 DFS、BFS)。
我使用的是 .cs 檔案,而不是 xaml 或 xml。
所以我做了一個 50X50 圖片框的矩陣,每個都有自己的矩陣索引,它在 gui 視窗上的位置。

所以這是我到目前為止的地圖。我想要實作的是,每次遇到 MouseDownEvent 時,我都希望選擇特定的圖片框,并更改它的顏色。
但我不知道該怎么做。
我有我的 initBoard 代碼:
private void initBoard()
{
m_VisualizerPictureBox = new UpgradedPictureBox[m_BoardHeight, m_BoardWidth];
int left = 0, top = (Top / 2 - m_BoardHeight);
for (int i = 0; i < m_BoardHeight; i )
{
left = Left / 2 - (m_BoardWidth - 1);
for(int j = 0; j < m_BoardWidth; j )
{
m_VisualizerPictureBox[i, j] = new UpgradedPictureBox(new Point(i, j))
{
Size = m_ButtonSize,
Top = (i * m_ButtonSize.Width),
Left = (j * m_ButtonSize.Width),
Location = new Point(left, top),
BackColor = Color.Aqua,
BorderStyle = BorderStyle.FixedSingle
};
left = m_ButtonSize.Width;
m_VisualizerPictureBox[i, j].m_PositionOnBoard = new Point(i, j);
int x = ((i 1) * top) left;
int y = ((j 1) * left) top;
Point XYPoint = new Point(x,y);
m_VisualizerPictureBox[i, j].m_XYPosition = XYPoint;
Controls.Add(m_VisualizerPictureBox[i, j]);
int copyOfI = i, copyOfJ = j;
m_VisualizerRectangles[i, j].Click = (sender, e) => buttonClicked(copyOfI, copyOfJ);
m_VisualizerRectangles[i, j].MouseDown = (MouseDownEvent);
m_VisualizerRectangles[i, j].MouseUp = (MouseUpEvent);
m_VisualizerRectangles[i, j].MouseEnter = (mouseEnterEvent);
}
top = m_ButtonSize.Height;
}
}
我不希望用戶在不同的壓力機中按下每個圖片框,我希望用戶按下滑鼠,按住它,它會根據我的需要繼續標記圖片框。
所以我認為下一個代碼應該這樣做:
private void buttonClicked(int i_Row, int i_Col)
{
UpgradedPictureBox buttonClicked = m_VisualizerRectangles[i_Row, i_Col];
if(m_VisualizerRectangles[i_Row,i_Col].BackColor == buttonClicked.m_DefaultBackColor)
{
m_VisualizerRectangles[i_Row, i_Col].BackColor = Color.Black;
}
else
{
m_VisualizerRectangles[i_Row, i_Col].BackColor = buttonClicked.m_DefaultBackColor;
}
}
private void MouseDownEvent(object sender, EventArgs e)
{
m_MouseIsDown = true;
m_MouseIsUp = false;
}
private void MouseUpEvent(object sender, EventArgs e)
{
m_MouseIsUp = true;
m_MouseIsDown = false;
}
private void mouseEnterEvent(object sender, EventArgs e)
{
if(m_MouseIsDown)
{
UpgradedPictureBox pictureClicked = sender as UpgradedPictureBox;
int row = pictureClicked.m_PositionOnBoard.X;
int col = pictureClicked.m_PositionOnBoard.Y;
if(m_VisualizerRectangles[row, col].BackColor == pictureClicked.m_DefaultBackColor)
{
m_VisualizerRectangles[row, col].BackColor = Color.Black;
}
else
{
m_VisualizerRectangles[row, col].BackColor = pictureClicked.m_DefaultBackColor;
}
}
}
但是,m_MouseIsDown 的 if 陳述句不允許我在按下滑鼠時標記圖片框。當我取消這個 if 陳述句時,它可以讓我準確地標記我想要的方式,但無需按下滑鼠。我在這里想念什么?
uj5u.com熱心網友回復:
我相信您會看到這種行為,因為PictureBox嘗試在事件中
Capture通過將屬性設定為覆寫事件false的方法,我能夠實作此結果。UpgradedPictureBoxMouseDown
public class UpgradedPictureBox : PictureBox
{
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
BackColor = Color.Fuchsia;
Capture = false;
}
protected override void OnMouseEnter(EventArgs e)
{
base.OnMouseEnter(e);
if (MouseButtons == MouseButtons.Left)
{
BackColor = Color.Fuchsia;
}
}
}
所以也許試試這個并測驗它是否對你有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/497117.html
上一篇:WPF 視頻硬解碼渲染播放(無空域)(支持4K、8K、高幀率視頻)
下一篇:使按鈕與另一個按鈕動態保持距離
