2010-10-15 2 views
1

OR - Как сбрить коалу, чтобы остановить ее, глядя в сквошен. (Но я не думал, что это сделает подходящий техник)Как связать кнопку с элементом управления?

Проблема: у вас есть три изображения предварительного просмотра, полученные из основного изображения. Изображения предварительного просмотра изменяются для стандартизованных пространств изображений на веб-сайте компании, основным изображением может быть любое изображение любого размера из любого места.

Пример: основное изображение представляет собой изображение высокого разрешения коала-медведя размером 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); 
} 

EDIT: Как это происходит, вдохновленный Ганса ниже, а не только начинку 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); 
} 

Конечно, есть еще много чего поделать, но это в значительной степени разобрало мою проблему. Спасибо, Ханс!

+0

«Как брить Коала» был бы прекрасным названием. – jacknad

+0

Я знаю, что это не вопрос, - но почему бы просто не изменить размер изображения без искажения пропорции. Тогда вам не нужно ничего обрезать. – asawyer

+0

@JackN: Да, но моя злокачественная железа сегодня не является чрезмерной. –

ответ

3

Используйте свойство Button.Tag, чтобы сохранить ссылку на связанный с ним PictureBox. В ролях отправителя к кнопке:

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); 
} 
+0

Мне это нравится. Я взламывал вариацию на эту тему, но это лучше. –

+0

Выглядит неплохо для меня, вы можете уйти всего за 4 обработчика событий. – asawyer

+0

Бит, который делает это для меня, заключается в том, что я добавляю идентификатор элемента в тег и реализую метод «find control». Простое сохранение фактического элемента управления в теге кнопки делает вещи намного проще. –

Смежные вопросы