如何将按钮与控件关联?

时间:2010-10-15 10:59:55

标签: c# winforms graphics image-processing

或 - 如何刮掉考拉以阻止它看起来被压扁。 (但我认为这不会成为一个合适的技术标题)

问题:您有三个从主图像派生的预览图像。预览图像的大小适用于公司网站上的标准化图片空间,主图像可以是任何地方的任何尺寸图像。

示例:主图像是考拉熊的高分辨率图像,测量值为2000x2250。您的预览想要将考拉渲染为200x200,200x50和250x150。

您的实用程序会调整原始图像的大小并将其拉伸到您的三个“实际尺寸”预览的大小,但显然每个预览看起来有点俗称,而且您知道每个人都讨厌看到被压扁的考拉。

要解决此问题,请在程序中添加一个小裁剪方法,该方法会从所需侧面的预览中削减五个像素。这意味着您应该能够通过剃掉图像中不必要的部分来调整图像大小并取消对考拉的取消。

您可以为每个预览图像图片框添加四个按钮,并创建四种通用方法,以便将正确的剃须指令发送到裁剪方法。您希望将每个特定按钮与表单上的特定图片框相关联,但是您希望将所有单击事件发送到四个通用函数。

你如何告诉泛型函数你希望它以优雅和美妙的方式剃掉三个预览图片框中的哪一个?

示例代码:

//cropPict=method for cropping the picture in the relevant picturebox.
//CropSide=a little enum which tells the method which side to crop.
private void btnT_Click(object sender, EventArgs e)
{
  cropPict(/*Reference to PictureBox Goes Here*/, CropSide.Top);
}

private void btnB_Click(object sender, EventArgs e)
{

   cropPict(/*Reference to PictureBox Goes Here*/, CropSide.Bottom);
}

private void btnR_Click(object sender, EventArgs e)
{
   cropPict(/*Reference to PictureBox Goes Here*/, CropSide.Right);
}

private void btnL_Click(object sender, EventArgs e)
{
   cropPict(/*Reference to PictureBox Goes Here*/, CropSide.Left);
}

编辑:碰巧受到以下Hans的启发,而不仅仅是将PictureBox填充到标签中。这是个好主意我实际上将KeyValuePair放入每个按钮的标签中,如下所示:

btnCCB.Tag = new KeyValuePair<CropSide,PictureBox>(CropSide.Bottom,pbxKoala);
btnCCL.Tag = new KeyValuePair<CropSide, PictureBox>(CropSide.Left, pbxKoala);
btnCCR.Tag = new KeyValuePair<CropSide, PictureBox>(CropSide.Right, pbxKoala);
btnCCT.Tag = new KeyValuePair<CropSide, PictureBox>(CropSide.Top, pbxKoala);

然后我可以将所有按钮连接到单个事件处理程序,如下所示:

private void btnC_Click(object sender, EventArgs e)
{
   Button btnSend = (Button)sender;
   KeyValuePair<CropSide, PictureBox> kvCrop = (KeyValuePair<CropSide, PictureBox>)btnSend.Tag;

   cropPict(kvCrop.Value,kvCrop.Key);
}

当然,还有很多事要做,但这几乎解决了我的问题。谢谢汉斯!

1 个答案:

答案 0 :(得分:3)

使用Button.Tag属性存储对其关联PictureBox的引用。将发件人转换为Button:

public Form1() 
{
  InitializeComponent();
  button1.Tag = pictureBox1;
  button1.Click += btnT_Click;
  // etc..
}

private void btnT_Click(object sender, EventArgs e)
{
  var btn = (Button)sender;
  cropPict((PictureBox)btn.Tag, CropSide.Top);
}