如何在C#中右键单击时保存x和y坐标

时间:2010-11-20 09:08:08

标签: c# winforms

我的目标是在右键单击时打开一个ContextMenuStrip,记住这个单击x和y,然后单击其中一个给定的项目,直到现在这就是我所做的:

public delegate void mydelegate(string s);

public Form1()
{
    InitializeComponent();
    m_MyContextMenuStrip = new ContextMenuStrip();
    m_MyContextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(cms_Opening);
    this.ContextMenuStrip = m_MyContextMenuStrip; 
}

void cms_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
    m_MyContextMenuStrip.Items.Clear();

    location1 = m_MyContextMenuStrip.PointToClient(new Point(0, 0));
    location = m_MyContextMenuStrip.PointToScreen(new Point(0, 0));
    // Populate the ContextMenuStrip control with its default items.
    m_MyContextMenuStrip.Items.Add("-");
    m_MyContextMenuStrip.Items.Add("Apples");
    m_MyContextMenuStrip.Items.Add(location.X.ToString() + "and  " + location.Y.ToString());

    m_MyContextMenuStrip.Items.Add("aaaa", null, new EventHandler(onaaaClick));
    // Set Cancel to false. 
    // It is optimized to true based on empty entry.
    e.Cancel = false;
}

private void onaaaClick(object sender, EventArgs e)
{
    //will handle the click on aaa

    Form2 f2 = new Form2(functodel);
    f2.Show();
}

void functodel(string s)
{
    Label l = new Label();
    l.Text = s;

    l.Top = location.Y - 108;
    l.Left = location.X - 100;
    //l.Left = this.Location.X - location.X;  

    l.BorderStyle = BorderStyle.FixedSingle;
    this.Controls.Add(l);
    l.BringToFront();
}

Form2是:

private mydelegate m_del;

public Form2(mydelegate del)
{
    m_del = del;
    InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
    m_del(textBox1.Text);
    this.Close();
}

我的问题是,当我点击右键单击我没有得到我想要的位置,我得到另一个位置。谁能向我解释我做错了什么?

  1. 如何获得正确的位置。

  2. 如何获得一个只有一次项目的ContextMenuStrip?

  3. 让我们说在给定的标签上我正在支持我想要点击右键并获得另一个选项然后在m_ContextMenuStrip(删除项目和更改颜色)我该怎么做?

  4. 修改

    我会尝试更好地解释我的动机

    我的目标是一张图片,你点击右边的坐标(x和y)打开你的菜单(menu1),就像你在Windows桌面上一样,菜单左上角是你点击的坐标和从这个坐标开始打开一个菜单(就像我想在桌面上更改或打开一些东西,它没有在桌面的左上角打开,它在我点击的地方打开了。)

    当点击aaa项目时,我希望打开另一个表单,然后从那里开启新标签form1 现在当右键单击此标签时我想要打开另一个菜单(让我们称之为menu2)

    menu1和menu2是不同的生物

    我可能错过了主要概念?

2 个答案:

答案 0 :(得分:1)

您可以访问鼠标坐标并计算到图片框的位置(在此测试中是一个面板)?

您可以在menustrip的开幕活动中计算出来。

MousePosition Control 类的静态属性。

public partial class Form1 : Form {

    private void pnlClickOnMe_MouseClick(object sender, MouseEventArgs e) {
        Point mouseLocation = MousePosition;
        // get point of mouse relative to pnlClickOnMe
        Point pointYouAreInterestedIn = pnlClickOnMe.PointToClient(mouseLocation); 
        lblShowCoordinates.Text = string.Format("{0} - {1}", pointYouAreInterestedIn.X, pointYouAreInterestedIn.Y);
    }

    public Form1() {
        InitializeComponent();
    }

    #region designer
    private void InitializeComponent() {
        this.lblShowCoordinates = new System.Windows.Forms.Label();
        this.pnlClickOnMe = new System.Windows.Forms.Panel();
        this.SuspendLayout();
        this.lblShowCoordinates.AutoSize = true;
        this.lblShowCoordinates.Location = new System.Drawing.Point(32, 18);
        this.lblShowCoordinates.Size = new System.Drawing.Size(35, 13);
        this.pnlClickOnMe.BackColor = System.Drawing.SystemColors.ActiveCaption;
        this.pnlClickOnMe.Location = new System.Drawing.Point(31, 64);
        this.pnlClickOnMe.Size = new System.Drawing.Size(206, 152);
        this.pnlClickOnMe.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pnlClickOnMe_MouseClick);
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(284, 262);
        this.Controls.Add(this.pnlClickOnMe);
        this.Controls.Add(this.lblShowCoordinates);
        this.ResumeLayout(false);
        this.PerformLayout();

    }

    #endregion

    private System.Windows.Forms.Label lblShowCoordinates;
    private System.Windows.Forms.Panel pnlClickOnMe;
}

答案 1 :(得分:1)

您是否使用设计师来构建表单?

无需任何编码工作,您可以轻松完成所需操作 请查看此链接以获取更多信息:
http://msdn.microsoft.com/en-us/library/ms173080%28VS.80%29.aspx

无论如何,关于上下文菜单:

<强> 1
您无需找到鼠标位置并手动打开菜单 只需将图片框的ContextMenuStrip属性设置为上下文菜单,如:

pictureBox.ContextMenuStrip = yourContextMenuInstance; 
// you can do this also from Designer

当你右键点击pictureBox中的一个像素时,你的菜单会自动显示在正确的位置(我的意思是在鼠标位置)。

<强> 2
如果您的菜单项不依赖于菜单位置或其他一些可更改状态,您可以在创建菜单时添加它们,而不是在Opening事件处理程序中添加它们。 ItemClick处理程序也是如此,您可以在创建项目时附加它们。

第3
也许您不需要此功能,但您可以将子菜单添加到上下文菜单中的任何项目。


所以,要恢复:

Form1您需要创建(按照设计师或代码)PictureBox(让我们称之为pbox1),ContextMenu(让我们来电话)它menu1}和你的aaa项目及其相应的事件处理程序 因此,设置pbox1.ContextMenuStrip = menu1并在aaa点击事件处理程序中,您可以打开Form2 然后,您可以以Form2的相同方式预先定义Form1,即将其contextMenu附加到文本框等...