天道酬勤,学无止境

How to get Windows for to raise mouseclick event for programatically created PictureBox?

I'm building a virtual board game, and I need to be able to click on the pieces to move them. The board is created as a picture in the background, and the pieces are pictureboxes over top of that. More specifically, they are a custom class GamePiece that inherits from PictureBox. I know PictureBox has a Name_Click method that is called when it's clicked, but I'm creating my pieces programatically, as follows:

    public Player(int identity, GameBoard Board)
    {
        ID = identity;
        for (int i = 0; i < 4; i++)
        {
            Pieces[i] = new GamePiece(ID, Board.GetPlaceSize(), Board.GetPieceColor(ID), Board);
        }
    }

Therefore, I don't want to hardcode in methods to be called for each Gamepiece, because that would defeat my purpose here.

Any suggestions? I can include any other code that would be helpful, and I'm pretty flexible as far as redesigning code, if that would make my life easier later. Thanks in advance.

标签

评论

Just add Control.Click event handler for your control:

public Player(int identity, GameBoard Board)
{
    ID = identity;
    for (int i = 0; i < 4; i++)
    {
        Pieces[i] = new GamePiece(ID, Board.GetPlaceSize(), Board.GetPieceColor(ID), Board);
        Pieces[i].Tag = ID;
        Pieces[i].Click += pieces_Click;
    }

on the Click event:

private void pieces_Click(object sender, EventArgs e)
{
    int id = (int) ((Pieces))sender.Tag;
    DoSomethingForId(id);
}

or using Anonymous Methods:

public Player(int identity, GameBoard Board)
{
    ID = identity;
    for (int i = 0; i < 4; i++)
    {
        Pieces[i] = new ....
        Pieces[i].Click += (sender, e) =>
                        {
                            // Do some thing
                        };
    }
}

(Wire up to an event handler)

Pieces[i].Click += new EventHandler(theOnClickEvent);

(The event handler)

void theOnClickEvent(object sender, EventArgs e)
    {
        //clicked.
    }

Could it be:

gamePiece.Click += myEventHandler;

Where gamePiece is the GamePiece object, and myEventHandler is any form of event handler... delegate, lambda, whatever.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何设置表单的点击事件?(How do I set a click event for a form?)
    问题 我有一个ac#表单(我们称其为MainForm),上面带有许多自定义控件。 我想让MainForm.OnClick()方法在有人单击表单时触发,无论单击是在表单上发生还是在自定义控件之一上发生。 我正在寻找类似于表单的KeyPreview功能的行为,除了鼠标单击而不是按键之外。 回答1 在窗体的ControlAdded事件中,将一个MouseClick处理程序添加到控件中,并带有窗体的click事件的地址。 我还没有测试过,但是可能有效。 Private Sub Example_ControlAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles Me.ControlAdded AddHandler e.Control.MouseClick, AddressOf Example_MouseClick End Sub Private Sub Example_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick MessageBox.Show("Click") End Sub 回答2
  • 从 FlowLayoutPanel 中选择 UserControl(Select UserControl from FlowLayoutPanel)
    问题 我在这个问题的帮助下在 FlowPanelLayout 中设置了 UserControls: For Each DataTable Add UserControl to FlowLayoutPanel 我现在正在尝试实现一个单击事件,该事件允许我在已选择的 UserControl 周围放置边框。 我已经这样做了: private void User_Load(object sender, EventArgs e) { flowlayoutpanelUsers.HorizontalScroll.Visible = false; // Load and Sort Users DataTable DataTable datatableUsers = UserMethods.GetUsers().Tables["Users"]; datatableUsers.DefaultView.Sort = "Name"; DataView dataviewUsers = datatableUsers.DefaultView; // Loop Through Rows and Add UsersGrid to FlowLayoutPael foreach (DataRowView datarowviewUsers in dataviewUsers) { var UsersGrid = new
  • 计算一条线的精确像素(Calculating Exact Pixels for a line)
    问题 说我想尝试做一条直线,尽管有任何角度 public class Line : Control { public Point start { get; set; } public Point end { get; set; } public Pen pen = new Pen(Color.Red); protected override void OnPaint(PaintEventArgs e) { e.Graphics.DrawLine(pen, start, end); base.OnPaint(e); } } 此行是在自定义控件上制作的。 现在我如何计算制作线条的确切像素,以便我可以使用MouseMove实现命中测试。 回答1 有 Win32 调用用于枚举将使用 GDI 调用绘制的线的像素。 我相信这是您想要完成的最佳技术。 请参阅 LineDDA 及其关联的回调 LineDDAProc。 以下是您将如何从 C# 使用它。 请注意,根据 LineDDA 的文档,输出中不包含终点。 using System; using System.Collections.Generic; using System.Drawing; using System.Runtime.InteropServices; public static List<Point>
  • Click、DoubleClick 与 MouseClick 和 MouseDoubleClick 事件(Click, DoubleClick vs MouseClick and MouseDoubleClick events)
    问题 我刚刚发现,有4个同样的名字事件NotifyIcon命名Click , DoubleClick , MouseClick和MouseDoubleClick 。 他们的描述文字说 当组件被(双击)[用鼠标]点击时发生。 但是除了鼠标,你还能点击什么元素? 我尝试用鼠标单击它,然后在使用箭头键和 Tab键进行一些棘手的选择之后按Enter 。 单击鼠标会触发这两个事件,但按Enter只会触发Click事件。 这两对事件之间还有什么其他区别? 回答1 假设您指的是 WinForm Control 事件,来自 Control.Click 的 MSDN 文档: 单击不仅可以由鼠标单击引起,还可以由某些事件(例如按下的键等)引起。 Click 事件将 EventArgs 传递给其事件处理程序,因此它仅指示发生了单击。 如果您需要更具体的鼠标信息(按钮、点击次数、滚轮旋转或位置),请使用 MouseClick 事件。 但是,如果单击是由鼠标以外的操作(例如按下 ENTER 键)引起的,则不会引发 MouseClick 事件。 点击事件 Click 事件将 EventArgs 传递给其事件处理程序,因此它仅指示发生了单击。 如果您需要更具体的鼠标信息(按钮、点击次数、滚轮旋转或位置),请使用 MouseClick 事件。 但是,如果单击是由鼠标以外的操作(例如按下 ENTER 键)引起的
  • 如何捕获面板上的鼠标滚轮?(How to capture mouse wheel on panel?)
    问题 如何在C#中捕获面板上的鼠标滚轮? 我正在使用WinForms 编辑: 我现在尝试在PictureBox上执行此操作。 我的代码: this.pictureBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick); this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseClick); private void pictureBox1_MouseClick(object sender, MouseEventArgs e) { MessageBox.Show("Click"); } 单击有效。 惠灵没有。 为什么? 回答1 Windows将WM_MOUSEWHEEL消息发送到具有焦点的控件。 不会是Panel,它不是可以获得焦点的控件。 只要将控件放在面板上,例如说一个按钮,该按钮就会获得焦点和消息。 但是该按钮对消息无用,没有任何可滚动的内容。 Windows注意到这一点并将消息发送给父级。 那是面板,现在它将滚动。 您将找到一个自定义面板的代码,该代码可以让您重点关注此答案。 更新:请注意,此行为在Windows
  • C# Right mouse click on button does not raise mouseclick event
    I have a button on a form and want to handle both left and right clicks. I am handling the MouseClick event, but this is only raised on a left click. Is this a problem somewhere in my code (a setting that I have missed) or the intended functionality? If this is not possible to fix, what is the best workaround - to handle the MouseUp event? The reason I would like to use MouseClick is so that double clicks are automatically recognised. Thanks for any feedback.
  • 将点击事件添加到图片框 vb.net(add on click event to picturebox vb.net)
    问题 我有一个 flowLayoutPanel,我正在以编程方式向其中添加新的 panelLayouts。 每个panelLayout 中都有一个pictureBox。 一切正常,但我需要检测何时单击该图片框。 如何在图片中添加事件? 我似乎只能找到 c# 示例.... 我添加图像的代码如下... ' add pic to the little panel container Dim pic As New PictureBox() pic.Size = New Size(cover_width, cover_height) pic.Location = New Point(10, 0) pic.Image = Image.FromFile("c:/test.jpg") panel.Controls.Add(pic) 'add pic and other labels (hidden in this example) to the big panel flow albumFlow.Controls.Add(panel) 所以我假设在创建图像时我添加了一个 onclick 事件。 如果可能的话,我也需要获取它的索引! 谢谢你的帮助! 回答1 使用 AddHandler 语句订阅 Click 事件: AddHandler pic.Click, AddressOf pic_Click
  • 在ComboBox中无法检测到鼠标右键(Unable to detect right mouseclick in ComboBox)
    问题 我有一个简单的下拉样式的ComboBox。 当用户右键单击列表中的某个项目时,我想打开一个新窗口,但是在检测到右键单击时遇到了麻烦。 我的代码: private void cmbCardList_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right && cmbCardList.SelectedIndex != -1) { frmViewCard vc = new frmViewCard(); vc.updateCardDisplay(cmbCardList.SelectedItem); vc.Show(); } } 如果我更改e.Button == MouseButtons.Left,整个动作就很好了。 有什么办法可以让我按预期工作吗? 回答1 除非您进行一些严重的黑客攻击,否则恐怕是不可能的。 本文将进行解释。 为您引用: 个别控制 以下控件不符合标准的鼠标单击事件行为: Button,CheckBox, ComboBox和RadioButton控件 左键单击:单击,鼠标单击右键单击:未引发单击事件左键双击:单击,鼠标单击; 点击,鼠标点击右键双击:不引发点击事件 回答2 作为这个问题的墓志铭,您可以使用正常的.NET功能来完成此工作。
  • add on click event to picturebox vb.net
    I have a flowLayoutPanel which I am programatically adding new panelLayouts to. Each panelLayout has a pictureBox within it. It's all working nicely, but I need to detect when that picture box is clicked on. How do I add an event to the picture? I seem to only be able to find c# examples.... my code to add the image is as follows... ' add pic to the little panel container Dim pic As New PictureBox() pic.Size = New Size(cover_width, cover_height) pic.Location = New Point(10, 0) pic.Image = Image.FromFile("c:/test.jpg") panel.Controls.Add(pic) 'add pic and other labels (hidden in this example)
  • 如何在自定义用户控件上创建click事件?(How can I create a click event on a custom user control?)
    问题 我创建了一个自定义用户控件。 我是否可以添加click事件,以便当某人单击控件区域中的任何位置时,都会触发click事件? 用户控件定义为: XAML: <Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}"> <StackPanel Orientation="Vertical"> <Image Source="{Binding TabItemImage}" HorizontalAlignment="Center" Stretch="None" VerticalAlignment="Top" /> <TextBlock Text="{Binding TabItemText}" FontSize="15" HorizontalAlignment="Center" VerticalAlignment="Bottom" /> </StackPanel> </Grid> C#: public partial class TabItem : UserControl { public static readonly DependencyProperty ImageProperty = DependencyProperty.Register("TabItemImage", typeof(string)
  • 捕获用户控件中的所有鼠标单击和按键(Capture ALL mouse clicks and key presses in a user control)
    问题 我想捕获特定用户控件中的所有按键和鼠标单击。 我需要执行此操作才能创建空闲检测,以便如果用户有一段时间没有在用户控件中执行任何操作,则可以解锁实体。 我的第一个尝试是使用PreProcessMessage检测Windows消息,但是似乎没有调用它吗? 我的第二个步骤是使用DefWndProc,但是没有为那些消息调用它。 如何获得WM_KEYDOWN和WM_MOUSEUP作为用户控件及其所有子控件? 更新 ProcessKeyPreview用于检测密钥 回答1 对于键盘方面,您可以尝试覆盖UserControl的ProcessCmdKey事件。 UserControl.cs : protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { //a key has been pressed within your user control //invoke event or some other action //... return base.ProcessCmdKey(ref msg, keyData); } 对于鼠标,我想您实现IMessageFilter接口的PreFilterMessage方法的UserControl可能是前进的方向(尽管我不确定这是否可以特定于用户控件)。 编辑
  • 如何检查 Windows 窗体中的两个控件是否重叠(How to check if two controls are overlapping in Windows Forms)
    问题 我创建了一个类,允许用户在表单上拖动面板。 如何确保用户不会将两个面板放在一起? 如果他们这样做,我想在它们都重叠时移动/或突出显示其中一个控件。 我尝试在 OnMouseDown 事件中设置它,但这并没有完全奏效。 此外,表单上的面板数量取决于表单需要显示的图片数量。 每个面板在面板内都有一个图片框。 回答1 更好的方法是使用 Rectangle.Bounds.IntersectsWith 方法,它会为您进行检查并生成更清晰的代码。 我个人不知道任何性能问题或好处,一种或另一种方式,尽管我敢猜测,简单地循环您的控件并使用它检查它们会比构建列表和循环更快。 Picturebox pic = new Picturebox(); foreach(Control picturebox in Form1){ if (pic.Bounds.IntersectsWith(picturebox.Bounds)) { //We have a problem, Houston, because we just collided! } } 我希望这会有所帮助,即使您前一段时间问过这个问题。 回答2 所以我能够在sgud的建议的帮助下解决这个问题。 诀窍是在引发的 OnMouseUp 事件中使用 Rectangle.Intersect 方法。 这是我在它背后使用的直觉。 (这可能不是最好的解决方案
  • 检测鼠标左键单击Winform(Detecting a left button mouse click Winform)
    问题 我想做的是,当我单击Winform时,让我的Winform显示调试行。 但是,当我这样做时,什么也没发生。 我知道如何使按钮/其他单击事件发生。 但是我需要的是能够单击Winform中的任何位置。 我在过去一个小时内用Google搜索了此信息,但看不到我在做什么错。 据我所知,此代码在检测鼠标单击时应该是正确的。 该方法与form1.cs类一起保存: private void mouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) Trace.WriteLine("Mouse clicked"); } 我已经尝试设置刹车点,但是这些刹车点也不会被触发。 我做错了什么? 对不起,这个愚蠢的新手问题,但是对于Winform编程我还是很陌生。 回答1 如何添加EventHandler: public Form1() { InitializeComponent(); // This line should you place in the InitializeComponent() method. this.MouseClick += mouseClick; } 回答2 使用Visual Studio内置的编辑器: 转到属性窗口(如果看不到,请按Alt + Enter )。
  • 在 Winforms 中显示动画 gif 而不锁定文件(Showing animated gif in Winforms without locking the file)
    问题 我正在尝试在我的 Winforms 应用程序中显示各种文件类型(包括动画 .gif文件)的图像。 我还必须能够修改显示的文件。 (更改文件名,删除它们)。 问题是在使用正常方式时,图片框会锁定图像文件,直到应用程序关闭。 这意味着我不能这样做: private void Form1_Load(object sender, EventArgs e) { PictureBox pic = new PictureBox(); pic.Size = new Size(250, 250); pic.Image = Image.FromFile("someImage.gif"); this.Controls.Add(pic); //No use to call pic.Image = null or .Dispose of it File.Delete("someImage.gif"); //throws exception } 上面链接中的解决方法如下: private void Form1_Load2(object sender, EventArgs e) { PictureBox pic = new PictureBox(); pic.Size = new Size(250, 250); //using a FileStream var fs = new System.IO
  • 如何在用户书写时为RichTextBox中的不同单词涂上不同颜色并单击该彩色文本时引发事件(How to color different words with different colors in a RichTextBox while a user is writing and raise an event when that colored text is clicked)
    问题 当用户在富文本框中输入某些单词时,如果该单词与某些特定单词匹配,则该单词的颜色应自动更改。 当用户单击该特定的彩色文本时,它应该引发一个事件。 回答1 鉴于要求: 1)用户在RichTextBox控件中插入一些文本。 2)如果输入的单词是单词的预定义列表的一部分,则该单词应更改颜色(因此,请定义单词和颜色之间的关系)。 3)当在彩色单词上生成鼠标Click事件时,会引发一个事件,以通知单击了哪个单词。 可能的结果(复制可视示例中的内容): 使用自定义EventArgs定义自定义EventHandler: public class WordsEventArgs : EventArgs { private string m_word; public WordsEventArgs(string word) { m_word = word; } public string Word { get { return m_word; } set { m_word = value; } } } public delegate void WordsEventHandler(object sender, WordsEventArgs e); public event WordsEventHandler WordClicked; protected void OnWordClicked
  • 单击和鼠标单击有什么区别?(What is the difference between a click and mouseclick?)
    问题 单击和鼠标单击有什么区别? 回答1 假设您指的是 WinForm Control 事件,来自 Control.Click 的 MSDN 文档: Click 事件将 EventArgs 传递给其事件处理程序,因此它仅指示发生了单击。 如果您需要更具体的鼠标信息(按钮、点击次数、滚轮旋转或位置),请使用 MouseClick 事件。 但是,如果单击是由鼠标以外的操作(例如按下 ENTER 键)引起的,则不会引发 MouseClick 事件。 回答2 单击不仅可以由鼠标单击引起,还可以由某些事件(如按下的键等)引起。有关更多信息,请参阅Control.Click 事件。
  • 将一个jPanel上的click事件传递给另一个JPanel(Passing the click event on one jPanel to another JPanel)
    问题 我有一个外部面板,在外部面板上有另一个jPanel。 如果我在内部面板上单击鼠标右键,则应该执行外部面板的右键单击操作。 如果我确实在内部面板上单击鼠标左键,则应该发生其自身的内部面板的点击动作。 是否可以将点击事件从一个面板传递到另一面板? 回答1 要解决此问题,您需要解决许多问题。 首先是要了解鼠标事件与创建它的组件有关,尤其是位置信息。 单击点是相对于源组件x / y位置的偏移量(对于鼠标事件,它将为0x0)。 这意味着,如果要重新发送事件,则至少需要将位置上下文转换为父组件空间。 源组件也应更改。 否则,可能会导致其他依赖该API进行确定的API部分出现问题(例如弹出窗口,该弹出窗口希望将位置信息从组件空间转换为屏幕空间)。 其次,您不应对父母做任何假设。 也就是说,您不应假设父级可以实现也可以不实现鼠标侦听器接口。 可能的解决方案是使用SwingUtilities.convertMouseEvent转换内部面板中引发的MouseEvent以与外部面板兼容,然后使用Component#dispatchEvent模仿标准事件处理过程,例如... import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import
  • how to draw multiple rectangles
    so I am trying to make a simple program where you click on the screen and it creates a block that falls and collides with a larger block beneath and sticks to it. Kind of like a simple collision program. The problem is when I create one block it deletes the block previously. I made an array, but it still does this. Do any of you know what Im doing wrong? Im sure its a simple fix. public class Screen extends JPanel implements Runnable { public static JLabel statusbar; //displays a status bar showing what mouse movements are taking place private Image cat; //image of the cat public int xCoord ;
  • TBitmap32.LoadFromStream() 自动识别图片格式(TBitmap32.LoadFromStream() Auto-Recognize Image Format)
    问题 我正在使用 Delphi XE2(更新 3)和 GR32。 我无法使用TBitmap32.LoadFromStream()加载图像数据。 它引发以下异常: Project MyApp.exe raised exception class EInvalidGraphic with message 'Bitmap image is not valid'. 代码 uses GR32, GifImg, PngImage, Vcl.Graphics; var pic: TBitmap32; bs: TBytesStream; begin bs := TBytesStream.Create(TClientDataSet(cds).FieldByName('filedata').AsBytes); try pic := TBitmap32.Create; try // bs.SaveToFile('c:\delme.png'); // pic.LoadFromFile('c:\delme.png'); pic.LoadFromStream(bs); // <- EInvalidGraphic exception // do something with 'pic' finally FreeAndNil(pic); end; finally FreeAndNil(bs); end; end
  • 在 c# Windows 窗体中动态创建控件(Dynamically creating Controls in c# Windows Forms)
    问题 我只是在 C# Windows 窗体中为书店应用程序创建一个应用程序我在这里做的过程是 1.将书名、书本图片插入数据库。 2.现在我需要像在图像中那样检索表单,但所有内容都应该像这样动态创建如果我有两本书,那么应该创建带有图片框、按钮和该教科书的面板,并在那里显示值。 如果我在 DB 中有三个 entereid,则意味着应该创建三个图片框、按钮和该教科书,并且应该在表单中显示值。 有什么办法可以解决这个问题。。 需要根据数据库中的“ n ”行数动态创建这些控件有关我的问题的更多清晰度,请参阅图片 回答1 创建一个包含图像、文本框和按钮的用户控件。 遍历从数据库中检索到的记录列表,并为每个项目创建用户控件的新实例。 将用户控件添加到父控件的 Controls 集合中。 回答2 您可以使用列表视图控件实现此目的: 你可以得到更多的细节: http://www.dotnetperls.com/listview http://www.c-sharpcorner.com/UploadFile/9a3ae2/using-listview-control-windows-form-application3/ http://www.java2s.com/Code/CSharp/GUI-Windows-Form/ListViewExample.htm 希望能帮到你。,。 :) 回答3 使用