![](/img/trans.png)
[英]Determine which PictureBox is clicked by mouse from ToolStripMenuItem
[英]Determine which rectangle on picturebox is clicked
我有一個帶有圖片框的ac#WinForms項目,其中包含帶有文本的文檔。 我正在使用Google Cloud Vision API收集文檔的OCR數據,效果很好。 使用從Google API返回的邊界矩形,我使用DrawRectangle在每個單詞周圍繪制矩形,並且在此過程中,我將該矩形與基礎單詞相關聯。 我需要做些什么才能只單擊任何給定的矩形並確切地知道它是哪個矩形,而不必點擊並在所有矩形的所有坐標中循環直到找到它。
Ya OP的四個選項
以點擊的點為起點,遍歷所有矩形的所有坐標,直到找到為止
對於相對較小的矩形(<1000),這實際上是最簡單的答案,可能也是性能最好的答案。 如果矩形可能重疊,請確保按從前到后的z順序存儲和循環遍歷它們。
如果您有大量的矩形,則可以創建其他數據結構來協助查找。 例如,您可以定義10x10數組,其中每個元素都包含與屏幕的一部分重疊的矩形列表。 這樣,您可以縮小搜索范圍。 當然,維護列表會產生額外的開銷,因此根據您的使用情況,可能不值得。
作為替代方案,您可以完全更改方法,並將每個矩形呈現為其自己的自定義控件 。 作為自定義控件,它將具有單擊事件處理程序,就像任何Win32窗口一樣。 但是,在實例化和管理所有這些控件時會產生大量開銷,因此不建議將其用於大量矩形。 而且,在幕后,我很確定它最終將使用與上述相同的查找算法,因此它的性能不會更好。
最后一個選擇是創建一個專門用於矩形的類,並將其“綁定”到PictureBox(注冊為其事件的使用者)。 然后,每個矩形將處理click事件,如果單擊在其邊界之內,則會引發自己的事件。 這是一個入門的示例:
class ClickableRectangle
{
private Rectangle _box;
public event EventHandler Click;
public ClickableRectangle(Rectangle coordinates)
{
_box = coordinates;
}
public void BindToControl(Control control)
{
control.MouseUp += Control_MouseUp;
control.Paint += Control_Paint;
}
private void Control_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawRectangle(Pens.Black, _box);
}
private void Control_MouseUp(object sender, MouseEventArgs e)
{
if (!_box.Contains(e.X, e.Y)) return;
if (Click != null) Click(this, e);
}
}
然后在MyPictureBox
顯示一個新MyPictureBox
,並使用MyClickHandler
方法處理它們,只需調用
var r = new ClickableRectangle(myRectangle);
r.BindToControl(MyPictureBox);
r.Click += this.MyClickHandler;
瞧。
另請參閱此相關問題 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.