При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Работа с печатью и изображениями
В каждом обработчике мы добавили метод Invalidate для перерисовки содержимого pictureBox1 после выбора пункта меню. Удобно, когда выбранный пункт меню помечается галочкой (см. рис. 6.10). Переходим в режим дизайна, выделяем пункт меню Вид (View) и в окне Properties дважды щелкаем в поле события Popup:
private void mnuView_Popup(object sender, System.EventArgs e) { if (sender is MenuItem) { bool ImLoad = (pictureBox1.Image != null); foreach (MenuItem menuitem in ((MenuItem)sender).MenuItems) { menuitem.Enabled = ImLoad; menuitem.Checked = (this.selectedMode == menuitem.Index); } } }
В обработчиках пунктов контекстного меню дублируем код для соответствующих пунктов главного меню:
private void cmnuResize_Click(object sender, System.EventArgs e) { Вставляем скопированный код для mnuResize_Click } private void cmnuActual_Click(object sender, System.EventArgs e) { Вставляем скопированный код для mnuActual _Click } private void cmnuCenterImage_Click(object sender, System.EventArgs e) { Вставляем скопированный код для mnuCenterImage _Click } private void cmnuAutoSize_Click(object sender, System.EventArgs e) { Вставляем скопированный код для mnuAutoSize _Click }
Запускаем приложение. Оно должно походить на приложение, изображенное на рис. 6.10. Добавим теперь к нашему приложению строку состояния, на которую будет выводиться размер загруженного изображения и его адрес. Из окна ToolBox перетаскиваем на форму элемент StatusBar, щелкаем в поле его свойства Panels и в открывшемся окне StatusBarPanel Collection Edito r добавляем панели sbFile и sbSize (рис. 6.11 и рис. 6.12).
Свойству ShowPanels элемента statusBar1 устанавливаем значение True. В обработчике пункта меню "Открыть" — код для вывода на панель sbFile адреса файла, а на панель sbSize — его размер:
private void mnuOpen_Click(object sender, System.EventArgs e) { … //Строка для вывода во время загрузки изображения sbFile.Text = "Загрузка " + diag.FileName; //Строка для вывода после загрузки изображения sbFile.Text = "Изображение " + diag.FileName; //Вывод ширины (Width) и высоты (Height) изображения sbSize.Text= String.Format("{0:#} x {1:#}", pictureBox1.Image.Width, pictureBox1.Image.Height); }Листинг 6.8.
Запускаем и тестируем приложение (рис. 6.13).