|
При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Работа с печатью и изображениями
В методе UstanovkaRejima проверяется значение переменной prosmotrperemen и вызывается соответствующий метод:
private void UstanovkaRejima()
{
//если pictureBox1 не содержит изображения, возвращаемся назад
if ( this.pictureBox1.Image == null )
return;
//Если значение переменной prosmotrperemen равно PodgonRazmera,
//вызываем метод PodgonRazmera
if ( this.prosmotrperemen == RejimProsmotra.PodgonRazmera )
this.PodgonRazmera();
//Иначе вызываем метод Prokrutka
else
{
this.Prokrutka();
this.AutoScroll = true;
}
}В методе PomeshenieIzobrajeniyavCenter определяется положение элемента pictureBox1 и, соответственно, положение изображения:
private void PomeshenieIzobrajeniyavCenter()
{
//Переменная top равна разнице между высотой элемента
//и высотой pictureBox1, деленной пополам
int top = (int)((this.Height - this.pictureBox1.Height)/2.0);
//Переменная left равна разнице между шириной элемента
//и шириной pictureBox1, деленной пополам
int left = (int)((this.Width - this.pictureBox1.Width)/2.0);
if ( top < 0 )
top = 0;
if ( left > 0 )
left = 0;
this.pictureBox1.Top = top;
this.pictureBox1.Left = left;
}Переключаемся в режим дизайна, выделяем форму, в окне Properties переключаемся на события и дважды щелкаем в поле Resize и Load:
private void NamePictureElement_Resize(object sender, System.EventArgs e)
{
//При изменении размеров элемента вызывается метод для установки режима просмотра:
this.UstanovkaRejima();
}
private void NamePictureElement_Load(object sender, System.EventArgs e)
{
//при загрузке элемента устанавливаем нулевые ширину и высоту pictureBox1
this.pictureBox1.Width = 0;
this.pictureBox1.Height = 0;
//Вызываем метод для установки режима просмотра
this.UstanovkaRejima();
}Все! Компилируем проект, используя сочетания клавиш Ctrl+Shift+B, и закрываем его. Создаем новое Windows-приложение, которое называем AutoScroll_and_Constrain. В свойстве Text формы можно ввести надпись "Сохранение пропорций и прокрутка". Перетаскиваем на форму OpenFileDialog, а главное меню скопируем из приложения Picture Viewer, затем оставим следующие пункты:
| mainMenu1, Name | Text | Shortcut |
|---|---|---|
| mnuFile | &Файл | |
| mnuOpen | &Открыть | CtrlO |
| mnuView | &Вид | |
| mnuResize | &Подогнать размер | |
| mnuActual | &Истинный размер |
Теперь нам нужно добавить созданный пользовательский элемент управления. В окне Toolbox щелкаем правой кнопкой на закладке Windows Forms и выбираем пункт Add/Remove Items… . В окне Customize Toolbox на вкладке .NET Framework Components нажимаем кнопку Browse и выбираем файл PictureElement.dll из папки bin/Debug проекта PictureElement. В результате в окне компонент появляется элемент NamePictureElement, принадлежащий пространству имен PictureElement (рис. 6.24).
Закрываем окно Customize Toolbox и перетаскиваем на форму появившейся элемент управления NamePictureElement. Обратите внимание на название этого элемента — не случайно при работе с проектом PictureElement мы дали проекту, форме и объекту в Solution Explorer три разных названия. На вкладке Toolbox элемент управления будет называться так же, как и форма пользовательского элемента в режиме дизайна (рис. 6.25).
В окне Properties элемента namePictureElement1 появились два новых свойства, которые мы создали сами (рис. 6.26)!

Рис. 6.26. Слева приведены фрагменты кода пользовательского элемента управления, на основании которых и были созданы свойства в окне Properties
Устанавливаем свойству Dock значение Fill, а свойству UserPropRejimProsmotra — значение PodgonRazmera. В обработчике пункта меню "Открыть" свойству Izobrajenie элемента загружаемое изображение:
private void mnuOpen_Click(object sender, System.EventArgs e)
{
this.openFileDialog1.ShowDialog();
string path = this.openFileDialog1.FileName;
this.namePictureElement1.Izobrajenie = Image.FromFile(path);
}В обработчиках пунктов меню изменения режима просмотра последовательно устанавливаем два значения свойства UserPropRejimProsmotra:
private void mnuResize_Click(object sender, System.EventArgs e)
{
this.namePictureElement1.UserPropRejimProsmotra = PictureElement.RejimProsmotra.PodgonRazmera;
}
private void mnuActual_Click(object sender, System.EventArgs e)
{
this.namePictureElement1.UserPropRejimProsmotra = PictureElement.RejimProsmotra.Prokrutka;
}Строка кода в обработчике mnuResize_Click скопирована из области Windows Form Designer generated code:
// // namePictureElement1 // this.namePictureElement1.Dock = System.Windows.Forms.DockStyle.Fill; this.namePictureElement1.Izobrajenie = null; … this.namePictureElement1.UserPropRejimProsmotra = PictureElement.RejimProsmotra.PodgonRazmera;
Запускаем приложение. Два режима просмотра позволяют просматривать уменьшенное изображение с сохранением пропорций или его действительную часть с прокруткой (рис. 6.27).
На диске, прилагаемом к книге, вы найдете приложения PictureElement и AutoScroll_and_Constrain (Code\Glava6\PictureElement и AutoScroll_and_Constrain ).
Полный листинг приложения TextEditor
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Drawing.Printing;
namespace TextEditor
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private System.Windows.Forms.SaveFileDialog saveFileDialog1;
private System.Windows.Forms.RichTextBox rtbText;
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem mnuFile;
private System.Windows.Forms.MenuItem mnuOpen;
private System.Windows.Forms.MenuItem mnuSave;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem mnuPageSetup;
private System.Windows.Forms.MenuItem mnuPrintPreview;
private System.Windows.Forms.MenuItem mnuPrint;
private System.Windows.Forms.PageSetupDialog pageSetupDialog1;
private System.Drawing.Printing.PrintDocument printDocument1;
private System.Windows.Forms.PrintDialog printDialog1;
private System.Windows.Forms.PrintPreviewDialog printPreviewDialog1;
//Переменная для хранения текста для печати.
//В нее мы будем помещать текст из RichTextBox
string stringPrintText;
//Переменная, определяющая номер страницы, с которой нужно начать печать
int StartPage;
//Переменная, определяющая количество страниц для печати:
int NumPages;
//Переменная, определяющая номер текущей страницы:
int PageNumber;
// PrintDocument printDocument1 = new PrintDocument();
// PageSetupDialog pageSetupDialog1 = new PageSetupDialog();
// PrintPreviewDialog printPreviewDialog1 = new PrintPreviewDialog();
// PrintDialog printDialog1 = new PrintDialog();
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
// pageSetupDialog1.Document = printDocument1;
// printPreviewDialog1.Document = printDocument1;
// printDialog1.Document = printDocument1;
// printDialog1.AllowSomePages = true;
// printDialog1.AllowSelection = true;
//
//Определяем номер страницы, с которой следует начать печать
printDialog1.PrinterSettings.FromPage = 1;
//Определяем максимальный номер печатаемой страницы.
printDialog1.PrinterSettings.ToPage = printDialog1.PrinterSettings.MaximumPage;
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support — do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
this.rtbText = new System.Windows.Forms.RichTextBox();
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.mnuFile = new System.Windows.Forms.MenuItem();
this.mnuOpen = new System.Windows.Forms.MenuItem();
this.mnuSave = new System.Windows.Forms.MenuItem();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.mnuPageSetup = new System.Windows.Forms.MenuItem();
this.mnuPrintPreview = new System.Windows.Forms.MenuItem();
this.mnuPrint = new System.Windows.Forms.MenuItem();
this.pageSetupDialog1 = new System.Windows.Forms.PageSetupDialog();
this.printDocument1 = new System.Drawing.Printing.PrintDocument();
this.printDialog1 = new System.Windows.Forms.PrintDialog();
this.printPreviewDialog1 = new System.Windows.Forms.PrintPreviewDialog();
this.SuspendLayout();
//
// openFileDialog1
//
this.openFileDialog1.FileName = "Текстовые файлы";
this.openFileDialog1.Filter = "Text Files (*.txt)|*.txt|All Files(*.*)|*.* ";
//
// saveFileDialog1
//
this.saveFileDialog1.FileName = "Текстовые файлы";
this.saveFileDialog1.Filter = "Text Files (*.txt)|*.txt|All Files(*.*)|*.* ";
//
// rtbText
//
this.rtbText.Dock = System.Windows.Forms.DockStyle.Fill;
this.rtbText.Location = new System.Drawing.Point(0, 0);
this.rtbText.Name = "rtbText";
this.rtbText.Size = new System.Drawing.Size(292, 266);
this.rtbText.TabIndex = 1;
this.rtbText.Text = "";
//
// mainMenu1
//
this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.mnuFile});
//
// mnuFile
//
this.mnuFile.Index = 0;
this.mnuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.mnuOpen,
this.mnuSave,
this.menuItem1,
this.mnuPageSetup,
this.mnuPrintPreview,
this.mnuPrint});
this.mnuFile.Text = "&Файл";
//
// mnuOpen
//
this.mnuOpen.Index = 0;
this.mnuOpen.Shortcut = System.Windows.Forms.Shortcut.CtrlO;
this.mnuOpen.Text = "&Открыть";
this.mnuOpen.Click += new System.EventHandler(this.mnuOpen_Click);
//
// mnuSave
//
this.mnuSave.Index = 1;
this.mnuSave.Shortcut = System.Windows.Forms.Shortcut.CtrlS;
this.mnuSave.Text = "&Сохранить";
//
// menuItem1
//
this.menuItem1.Index = 2;
this.menuItem1.Text = "-";
//
// mnuPageSetup
//
this.mnuPageSetup.Index = 3;
this.mnuPageSetup.Text = "Пара&метры страницы";
this.mnuPageSetup.Click += new System.EventHandler(this.mnuPageSetup_Click);
//
// mnuPrintPreview
//
this.mnuPrintPreview.Index = 4;
this.mnuPrintPreview.Text = "Пред&варительный просмотр";
this.mnuPrintPreview.Click += new System.EventHandler(this.mnuPrintPreview_Click);
//
// mnuPrint
//
this.mnuPrint.Index = 5;
this.mnuPrint.Shortcut = System.Windows.Forms.Shortcut.CtrlP;
this.mnuPrint.Text = "&Печать";
this.mnuPrint.Click += new System.EventHandler(this.mnuPrint_Click);
//
// pageSetupDialog1
//
this.pageSetupDialog1.Document = this.printDocument1;
//
// printDocument1
//
this.printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage);
//
// printDialog1
//
this.printDialog1.AllowSelection = true;
this.printDialog1.AllowSomePages = true;
this.printDialog1.Document = this.printDocument1;
//
// printPreviewDialog1
//
this.printPreviewDialog1.AutoScrollMargin = new System.Drawing.Size(0, 0);
this.printPreviewDialog1.AutoScrollMinSize = new System.Drawing.Size(0, 0);
this.printPreviewDialog1.ClientSize = new System.Drawing.Size(400, 300);
this.printPreviewDialog1.Document = this.printDocument1;
this.printPreviewDialog1.Enabled = true;
this.printPreviewDialog1.Icon = ((System.Drawing.Icon)(resources.GetObject("printPreviewDialog1.Icon")));
this.printPreviewDialog1.Location = new System.Drawing.Point(17, 54);
this.printPreviewDialog1.MinimumSize = new System.Drawing.Size(375, 250);
this.printPreviewDialog1.Name = "printPreviewDialog1";
this.printPreviewDialog1.TransparencyKey = System.Drawing.Color.Empty;
this.printPreviewDialog1.Visible = false;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.rtbText);
this.Menu = this.mainMenu1;
this.Name = "Form1";
this.Text = "TextEditor";
this.ResumeLayout(false);
}
#endregion
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void mnuOpen_Click(object sender, System.EventArgs e)
{
//Показываем диалог выбора файла
openFileDialog1.ShowDialog() ;
// Переменной fileName присваиваем имя открываемого файла
string fileName = openFileDialog1.FileName;
//Создаем поток fs и открываем файл для чтения.
FileStream filestream= File.Open(fileName, FileMode.Open, FileAccess.Read);
//Проверяем, открыт ли поток, и если открыт, выполняем условие
if(filestream != null)
{
//Создаем объект streamreader и связываем его с потоком filestream
StreamReader streamreader = new StreamReader(filestream /*System.Text.Encoding.Unicode*/);
//Считываем весь файл и записываем его в TextBox
rtbText.Text = streamreader.ReadToEnd();
//Закрываем поток.
filestream.Close();
}
}
private void mnuSave_Click(object sender, System.EventArgs e)
{
//Показываем диалог выбора файла
saveFileDialog1.ShowDialog();
// В качестве имени сохраняемого файла устанавливаем переменную fileName
string fileName=saveFileDialog1.FileName;
//Создаем поток fs и открываем файл для записи.
FileStream filestream = File.Open(fileName, FileMode.Create, FileAccess.Write);
//Проверяем, открыт ли поток, и если открыт, выполняем условие
if(filestream != null)
{
//Создаем объект streamwriter и связываем его с потоком filestream
StreamWriter streamwriter = new StreamWriter(filestream);
//Записываем данные из TextBox в файл
streamwriter.Write(rtbText.Text);
//Переносим данные из потока в файл
streamwriter.Flush();
//Закрываем поток
filestream.Close();
}
}
private void mnuPageSetup_Click(object sender, System.EventArgs e)
{
//Показываем диалог
pageSetupDialog1.ShowDialog();
}
private void mnuPrintPreview_Click(object sender, System.EventArgs e)
{
//Инициализируем переменные
printDocument1.DocumentName = Text;
stringPrintText = rtbText.Text;
StartPage = 1;
NumPages = printDialog1.PrinterSettings.MaximumPage;
PageNumber = 1;
//Показываем диалог
printPreviewDialog1.ShowDialog();
}
private void mnuPrint_Click(object sender, System.EventArgs e)
{
printDialog1.AllowSelection = rtbText.SelectionLength >0;
if(printDialog1.ShowDialog()==DialogResult.OK)
{
printDocument1.DocumentName =Text;
//Определяем диапазон страниц для печати
switch(printDialog1.PrinterSettings.PrintRange)
{
//Выбраны все страницы
case PrintRange.AllPages:
stringPrintText = rtbText.Text;
StartPage = 1;
NumPages = printDialog1.PrinterSettings.MaximumPage;
break;
//Выбрана выделенная область
case PrintRange.Selection:
stringPrintText = rtbText.SelectedText;
StartPage = 1;
NumPages = printDialog1.PrinterSettings.MaximumPage;
break;
//Выбран ряд страниц
case PrintRange.SomePages:
stringPrintText = rtbText.Text;
StartPage = printDialog1.PrinterSettings.FromPage;
NumPages = printDialog1.PrinterSettings.ToPage - StartPage+1;
break;
}
PageNumber = 1;
//Вызываем встроенный метод для начала печати
printDocument1.Print();
}
}
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
//Создаем экземпляр graph класса Graphics
Graphics graph = e.Graphics;
//Создаем объект font, которому устанавливаем
// шрифт элемента rtbText
Font font = rtbText.Font;
//Получаем значение межстрочного интервала — высоту шрифта Т1, 134
float HeightFont = font.GetHeight(graph);
//Создаем экземпляр stringformat класса StringFormat для определения
//дополнительных параметров форматирования текста.
StringFormat stringformat = new StringFormat();
//Создаем экземляры rectanglefFull и rectanglefText класса RectangleF для
//определния областей печати и текста. Т1, 104
RectangleF rectanglefFull, rectanglefText;
//Создаем переменные для подсчета числа символов и строк.
int NumberSymbols, NumberLines;
//В качестве области печати устанавливаем объект rectanglefFull
if (graph.VisibleClipBounds.X<0) rectanglefFull = e.MarginBounds;
else
//Определяем объект rectanglefFull
rectanglefFull = new RectangleF(
//Устанавливаем координату X
e.MarginBounds.Left - (e.PageBounds.Width - graph.VisibleClipBounds.Width)/2,
//Устанавливаем координату Y
e.MarginBounds.Top - (e.PageBounds.Height - graph.VisibleClipBounds.Height)/2,
//Устанавливаем ширину области
e.MarginBounds.Width,
//Устанавливаем высоту области
e.MarginBounds.Height);
rectanglefText = RectangleF.Inflate(rectanglefFull, 0, -2*HeightFont);
//Определяем число строк
int NumDisplayLines = (int)Math.Floor(rectanglefText.Height/HeightFont);
//Устанавливаем высоту области
rectanglefText.Height = NumDisplayLines*HeightFont;
if (rtbText.WordWrap)
{
stringformat.Trimming = StringTrimming.Word;
}
else
{
stringformat.Trimming = StringTrimming.EllipsisCharacter;
stringformat.FormatFlags |=StringFormatFlags.NoWrap;
}
//При печати выбранных страниц переходим к первой стартовой странице
while ((PageNumber<StartPage)&&(stringPrintText.Length>0))
{
if(rtbText.WordWrap)
//Измеряем текстовые переменные,
//формирующие печать, и возвращаем число символов NumberSymbols
//и число строк NumberLines
graph.MeasureString(stringPrintText, font, rectanglefText.Size, stringformat, out NumberSymbols, out NumberLines);
else
NumberSymbols = SymbolsInLines(stringPrintText, NumDisplayLines);
stringPrintText = stringPrintText.Substring(NumberSymbols);
//Увеличиваем число страниц
PageNumber++;
}
//Если длина строки stringPrintText равняется нулю (нет текста для печати),
// останавливаем печать
if (stringPrintText.Length==0)
{
e.Cancel = true;
return;
}
//Выводим (рисуем) текст для печати — stringPrintText, используем для этого шрифт font,
//кисть черного цвета — Brushes.Black, область печати — rectanglefText,
//передаем строку дополнительного форматирования stringformat
graph.DrawString(stringPrintText, font, Brushes.Black, rectanglefText, stringformat);
//Получаем текст для следующей страницы
if (rtbText.WordWrap)
graph.MeasureString(stringPrintText, font, rectanglefText.Size, stringformat, out NumberSymbols, out NumberLines);
else
NumberSymbols = SymbolsInLines(stringPrintText, NumDisplayLines);
stringPrintText = stringPrintText.Substring(NumberSymbols);
//Очищаем объект stringformat, использованный для формирования полей.
stringformat = new StringFormat();
//Добавляем вывод на каждую страницу ее номера
stringformat.Alignment = StringAlignment.Far;
graph.DrawString("Страница " + PageNumber, font, Brushes.Black, rectanglefFull, stringformat);
PageNumber++;
//Cнова проверяем, имеется ли текст для печати и номер страницы, заданной для печати
e.HasMorePages=(stringPrintText.Length>0)&&(PageNumber<StartPage+NumPages);
//Для печати из окна предварительного просмотра снова инициализируем переменные
if(!e.HasMorePages)
{
stringPrintText = rtbText.Text;
StartPage = 1;
NumPages = printDialog1.PrinterSettings.MaximumPage;
PageNumber = 1;
}
}
int SymbolsInLines(string stringPrintText, int NumLines)
{
int index = 0;
for (int i = 0; i< NumLines; i++)
{
index = 1+ stringPrintText.IndexOf('\n', index);
if(index==0)
return stringPrintText.Length;
}
return index;
}
}
}
Листинг
6.13.
Полный листинг приложения PictureViewer
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Drawing.Printing;
namespace PictureViewer
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem mnuFile;
private System.Windows.Forms.MenuItem mnuOpen;
private System.Windows.Forms.MenuItem mnuSave;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem mnuPageSetup;
private System.Windows.Forms.MenuItem mnuPreview;
private System.Windows.Forms.MenuItem mnuPrint;
private System.Windows.Forms.MenuItem menuItem5;
private System.Windows.Forms.MenuItem mnuExit;
private System.Windows.Forms.MenuItem mnuView;
private System.Windows.Forms.MenuItem mnuResize;
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private System.Windows.Forms.SaveFileDialog saveFileDialog1;
private System.Windows.Forms.ContextMenu contextMenu1;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.MenuItem mnuActual;
private System.Windows.Forms.MenuItem mnuCenterImage;
private System.Windows.Forms.MenuItem mnuAutoSize;
private System.Windows.Forms.MenuItem cmnuResize;
private System.Windows.Forms.MenuItem cmnuActual;
private System.Windows.Forms.MenuItem cmnuCenterImage;
private System.Windows.Forms.MenuItem cmnuAutoSize;
private System.Windows.Forms.StatusBar statusBar1;
private System.Windows.Forms.StatusBarPanel sbFile;
private System.Windows.Forms.StatusBarPanel sbSize;
private System.Windows.Forms.PrintDialog printDialog1;
private System.Windows.Forms.PrintPreviewDialog printPreviewDialog1;
private System.Windows.Forms.PageSetupDialog pageSetupDialog1;
private System.Drawing.Printing.PrintDocument printDocument1;
private System.ComponentModel.Container components = null;
public Form1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support — do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.mnuFile = new System.Windows.Forms.MenuItem();
this.mnuOpen = new System.Windows.Forms.MenuItem();
this.mnuSave = new System.Windows.Forms.MenuItem();
this.menuItem1 = new System.Windows.Forms.MenuItem();
this.mnuPageSetup = new System.Windows.Forms.MenuItem();
this.mnuPreview = new System.Windows.Forms.MenuItem();
this.mnuPrint = new System.Windows.Forms.MenuItem();
this.menuItem5 = new System.Windows.Forms.MenuItem();
this.mnuExit = new System.Windows.Forms.MenuItem();
this.mnuView = new System.Windows.Forms.MenuItem();
this.mnuResize = new System.Windows.Forms.MenuItem();
this.mnuActual = new System.Windows.Forms.MenuItem();
this.mnuCenterImage = new System.Windows.Forms.MenuItem();
this.mnuAutoSize = new System.Windows.Forms.MenuItem();
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();
this.contextMenu1 = new System.Windows.Forms.ContextMenu();
this.cmnuResize = new System.Windows.Forms.MenuItem();
this.cmnuActual = new System.Windows.Forms.MenuItem();
this.cmnuCenterImage = new System.Windows.Forms.MenuItem();
this.cmnuAutoSize = new System.Windows.Forms.MenuItem();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.statusBar1 = new System.Windows.Forms.StatusBar();
this.sbFile = new System.Windows.Forms.StatusBarPanel();
this.sbSize = new System.Windows.Forms.StatusBarPanel();
this.printDialog1 = new System.Windows.Forms.PrintDialog();
this.printPreviewDialog1 = new System.Windows.Forms.PrintPreviewDialog();
this.pageSetupDialog1 = new System.Windows.Forms.PageSetupDialog();
this.printDocument1 = new System.Drawing.Printing.PrintDocument();
((System.ComponentModel.ISupportInitialize)(this.sbFile)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.sbSize)).BeginInit();
this.SuspendLayout();
//
// mainMenu1
//
this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.mnuFile,
this.mnuView});
//
// mnuFile
//
this.mnuFile.Index = 0;
this.mnuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.mnuOpen,
this.mnuSave,
this.menuItem1,
this.mnuPageSetup,
this.mnuPreview,
this.mnuPrint,
this.menuItem5,
this.mnuExit});
this.mnuFile.Text = "&Файл";
//
// mnuOpen
//
this.mnuOpen.Index = 0;
this.mnuOpen.Shortcut = System.Windows.Forms.Shortcut.CtrlO;
this.mnuOpen.Text = "&Открыть";
this.mnuOpen.Click += new System.EventHandler(this.mnuOpen_Click);
//
// mnuSave
//
this.mnuSave.Index = 1;
this.mnuSave.Shortcut = System.Windows.Forms.Shortcut.CtrlS;
this.mnuSave.Text = "&Сохранить";
this.mnuSave.Click += new System.EventHandler(this.mnuSave_Click);
//
// menuItem1
//
this.menuItem1.Index = 2;
this.menuItem1.Text = "-";
//
// mnuPageSetup
//
this.mnuPageSetup.Index = 3;
this.mnuPageSetup.Text = "Page Se&tup";
this.mnuPageSetup.Click += new System.EventHandler(this.mnuPageSetup_Click);
//
// mnuPreview
//
this.mnuPreview.Index = 4;
this.mnuPreview.Text = "Print Pre&view";
this.mnuPreview.Click += new System.EventHandler(this.mnuPreview_Click);
//
// mnuPrint
//
this.mnuPrint.Index = 5;
this.mnuPrint.Shortcut = System.Windows.Forms.Shortcut.CtrlP;
this.mnuPrint.Text = "&Print";
this.mnuPrint.Click += new System.EventHandler(this.mnuPrint_Click);
//
// menuItem5
//
this.menuItem5.Index = 6;
this.menuItem5.Text = "-";
//
// mnuExit
//
this.mnuExit.Index = 7;
this.mnuExit.Shortcut = System.Windows.Forms.Shortcut.AltF4;
this.mnuExit.Text = "&Выход";
this.mnuExit.Click += new System.EventHandler(this.mnuExit_Click);
//
// mnuView
//
this.mnuView.Index = 1;
this.mnuView.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.mnuResize,
this.mnuActual,
this.mnuCenterImage,
this.mnuAutoSize});
this.mnuView.Text = "&Вид";
this.mnuView.Popup += new System.EventHandler(this.mnuView_Popup);
//
// mnuResize
//
this.mnuResize.Index = 0;
this.mnuResize.Text = "&Подогнать размер";
this.mnuResize.Click += new System.EventHandler(this.mnuResize_Click);
//
// mnuActual
//
this.mnuActual.Index = 1;
this.mnuActual.Text = "&Истинный размер";
this.mnuActual.Click += new System.EventHandler(this.mnuActual_Click);
//
// mnuCenterImage
//
this.mnuCenterImage.Index = 2;
this.mnuCenterImage.Text = "&По центру";
this.mnuCenterImage.Click += new System.EventHandler(this.mnuCenterImage_Click);
//
// mnuAutoSize
//
this.mnuAutoSize.Index = 3;
this.mnuAutoSize.Text = "&Автоматический размер";
this.mnuAutoSize.Click += new System.EventHandler(this.mnuAutoSize_Click);
//
// openFileDialog1
//
this.openFileDialog1.Title = "Выбор изображения";
//
// saveFileDialog1
//
this.saveFileDialog1.Title = "Сохранение изображения";
//
// contextMenu1
//
this.contextMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.cmnuResize,
this.cmnuActual,
this.cmnuCenterImage,
this.cmnuAutoSize});
//
// cmnuResize
//
this.cmnuResize.Index = 0;
this.cmnuResize.Text = "&Подогнать размер";
this.cmnuResize.Click += new System.EventHandler(this.cmnuResize_Click);
//
// cmnuActual
//
this.cmnuActual.Index = 1;
this.cmnuActual.Text = "&Истинный размер";
this.cmnuActual.Click += new System.EventHandler(this.cmnuActual_Click);
//
// cmnuCenterImage
//
this.cmnuCenterImage.Index = 2;
this.cmnuCenterImage.Text = "&По центру";
this.cmnuCenterImage.Click += new System.EventHandler(this.cmnuCenterImage_Click);
//
// cmnuAutoSize
//
this.cmnuAutoSize.Index = 3;
this.cmnuAutoSize.Text = "&Автоматический размер";
this.cmnuAutoSize.Click += new System.EventHandler(this.cmnuAutoSize_Click);
//
// pictureBox1
//
this.pictureBox1.ContextMenu = this.contextMenu1;
this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBox1.Location = new System.Drawing.Point(0, 0);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(616, 266);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
//
// statusBar1
//
this.statusBar1.Location = new System.Drawing.Point(0, 244);
this.statusBar1.Name = "statusBar1";
this.statusBar1.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] {
this.sbFile,
this.sbSize});
this.statusBar1.ShowPanels = true;
this.statusBar1.Size = new System.Drawing.Size(616, 22);
this.statusBar1.TabIndex = 3;
//
// sbFile
//
this.sbFile.Width = 500;
//
// printPreviewDialog1
//
this.printPreviewDialog1.AutoScrollMargin = new System.Drawing.Size(0, 0);
this.printPreviewDialog1.AutoScrollMinSize = new System.Drawing.Size(0, 0);
this.printPreviewDialog1.ClientSize = new System.Drawing.Size(400, 300);
this.printPreviewDialog1.Enabled = true;
this.printPreviewDialog1.Icon = ((System.Drawing.Icon)(resources.GetObject("printPreviewDialog1.Icon")));
this.printPreviewDialog1.Location = new System.Drawing.Point(151, 59);
this.printPreviewDialog1.MinimumSize = new System.Drawing.Size(375, 250);
this.printPreviewDialog1.Name = "printPreviewDialog1";
this.printPreviewDialog1.TransparencyKey = System.Drawing.Color.Empty;
this.printPreviewDialog1.Visible = false;
//
// printDocument1
//
this.printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printDocument1_PrintPage);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(616, 266);
this.ContextMenu = this.contextMenu1;
this.Controls.Add(this.statusBar1);
this.Controls.Add(this.pictureBox1);
this.Menu = this.mainMenu1;
this.Name = "Form1";
this.Text = "Picture Viewer";
((System.ComponentModel.ISupportInitialize)(this.sbFile)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.sbSize)).EndInit();
this.ResumeLayout(false);
}
#endregion
private PictureBoxSizeMode[] ArrayMenu =
{
PictureBoxSizeMode.StretchImage,
PictureBoxSizeMode.Normal,
PictureBoxSizeMode.CenterImage,
PictureBoxSizeMode.AutoSize
};
private int selectedMode = 0;
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void mnuOpen_Click(object sender, System.EventArgs e)
{
OpenFileDialog diag = new OpenFileDialog();
diag.Filter = "jpg files (*.jpg)|*.jpg|All files (*.*)|*.*" ;
if (diag.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = new Bitmap(diag.OpenFile());
}
//Строка для вывода во время загрузки изображения
sbFile.Text = "Загрузка " + diag.FileName;
//Строка для вывода после загрузки изображения
sbFile.Text = "Изображение " + diag.FileName;
//Вывод ширины (Width) и высоты (Height) изображения
sbSize.Text= String.Format("{0:#} x {1:#}", pictureBox1.Image.Width, pictureBox1.Image.Height);
}
private void mnuSave_Click(object sender, System.EventArgs e)
{
SaveFileDialog diag = new SaveFileDialog();
diag.Filter = "jpg files (*.jpg)|*.jpg|All files (*.*)|*.*" ;
if(diag.ShowDialog() != DialogResult.OK)
return;
// Получаем адрес файла.
string filename = diag.FileName;
FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite);
pictureBox1.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg);
fs.Close();
}
private void mnuExit_Click(object sender, System.EventArgs e)
{
this.Close();
}
private void mnuResize_Click(object sender, System.EventArgs e)
{
if (sender is MenuItem)
{
MenuItem menuitem = (MenuItem)sender;
selectedMode = menuitem.Index;
pictureBox1.SizeMode = ArrayMenu[0];
pictureBox1.Invalidate();
}
}
private void mnuActual_Click(object sender, System.EventArgs e)
{
if (sender is MenuItem)
{
MenuItem menuitem = (MenuItem)sender;
selectedMode = menuitem.Index;
pictureBox1.SizeMode = ArrayMenu[1];
pictureBox1.Invalidate();
}
}
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 mnuCenterImage_Click(object sender, System.EventArgs e)
{
if (sender is MenuItem)
{
MenuItem menuitem = (MenuItem)sender;
selectedMode = menuitem.Index;
pictureBox1.SizeMode = ArrayMenu[2];
pictureBox1.Invalidate();
}
}
private void mnuAutoSize_Click(object sender, System.EventArgs e)
{
if (sender is MenuItem)
{
MenuItem menuitem = (MenuItem)sender;
selectedMode = menuitem.Index;
pictureBox1.SizeMode = ArrayMenu[3];
pictureBox1.Invalidate();
}
}
private void cmnuResize_Click(object sender, System.EventArgs e)
{
if (sender is MenuItem)
{
MenuItem menuitem = (MenuItem)sender;
selectedMode = menuitem.Index;
pictureBox1.SizeMode = ArrayMenu[0];
pictureBox1.Invalidate();
}
}
private void cmnuActual_Click(object sender, System.EventArgs e)
{
if (sender is MenuItem)
{
MenuItem menuitem = (MenuItem)sender;
selectedMode = menuitem.Index;
pictureBox1.SizeMode = ArrayMenu[1];
pictureBox1.Invalidate();
}
}
private void cmnuCenterImage_Click(object sender, System.EventArgs e)
{
if (sender is MenuItem)
{
MenuItem menuitem = (MenuItem)sender;
selectedMode = menuitem.Index;
pictureBox1.SizeMode = ArrayMenu[2];
pictureBox1.Invalidate();
}
}
private void cmnuAutoSize_Click(object sender, System.EventArgs e)
{
if (sender is MenuItem)
{
MenuItem menuitem = (MenuItem)sender;
selectedMode = menuitem.Index;
pictureBox1.SizeMode = ArrayMenu[3];
pictureBox1.Invalidate();
}
}
private void mnuPageSetup_Click(object sender, System.EventArgs e)
{
PageSetupDialog diag
= new PageSetupDialog();
diag.Document = printDocument1;
diag.ShowDialog();
}
private void mnuPreview_Click(object sender, System.EventArgs e)
{
PrintPreviewDialog diag
= new PrintPreviewDialog();
diag.Document = printDocument1;
diag.ShowDialog();
}
private void mnuPrint_Click(object sender, System.EventArgs e)
{
PrintDialog diag = new PrintDialog();
diag.Document = printDocument1;
if (diag.ShowDialog() == DialogResult.OK)
{
printDocument1.Print();
}
}
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
//Если в pictureBox1 не загружено изображение, возвращаемся назад
if (pictureBox1.Image == null)
{
e.Cancel = true;
return;
}
//Определяем печатную область страницы
float leftMargin = e.MarginBounds.Left;
float rightMargin = e.MarginBounds.Right;
float topMargin = e.MarginBounds.Top;
float bottomMargin= e.MarginBounds.Bottom;
float printableWidth = e.MarginBounds.Width;
float printableHeight = e.MarginBounds.Height;
//Cоздаем экземпляр graph класса Graphics
Graphics graph = e.Graphics;
//Создаем экземпляр font класса Font
Font font= new Font("Comic Sans MS", 16);
//Определяем высоту шрифта
float fontHeight = font.GetHeight(graph);
//Определяем размер пробелов
float spaceWidth = graph.MeasureString(" ", font).Width;
//Определяем область, в которую будет вписываться изображение,
//размер наибольшей стороны изображения составляет 90%
//от кратчайшей стороны листа
float imageLength;
float Xposition = leftMargin;
float Yposition = topMargin + fontHeight;
if (printableWidth < printableHeight)
{
imageLength = printableWidth * 90/100;
Yposition += imageLength;
}
else
{
imageLength = printableHeight * 90/100;
Xposition += imageLength + spaceWidth;
}
// Выводим изображение в области rectImage
Rectangle rectImage = new Rectangle((int)leftMargin + 1, (int)topMargin + 1,(int)imageLength, (int)imageLength);
graph.DrawImage(pictureBox1.Image,(int)leftMargin + 1, (int)topMargin + 1, (int)imageLength,(int)imageLength);
// Определяем область rectText и выводим в нее строку с размером файла
RectangleF rectText = new RectangleF(Xposition, Yposition, rightMargin - Xposition, bottomMargin - Yposition);
PrintText(graph, font,"Размер изображения: ", Convert.ToString(pictureBox1.Image.Size), ref rectText);
}
protected void PrintText( Graphics graph, Font font, string name, string text, ref RectangleF rectText)
{
// Определяем размеры печатной области для текста:
float leftMargin = rectText.Left;
float rightMargin = rectText.Right;
float topMargin = rectText.Top;
float bottomMargin = rectText.Bottom;
//Определяем высоту текста и координаты, где он будет выводиться:
float fontHeight = font.GetHeight(graph);
float Xposition = rectText.Left;
float Yposition = topMargin + fontHeight;
//Определяем ширину текста и размер пробелов
float spaceWidth = graph.MeasureString(" ", font).Width;
float nameWidth = graph.MeasureString(name, font).Width;
graph.DrawString(name, font,
Brushes.Black, new PointF(Xposition, Yposition));
leftMargin += nameWidth + spaceWidth;
Xposition = leftMargin;
// Формируем несколько строк для текста в случае,
// если он не будет умещаться на одной строке
string[] words
= text.Split(" \r\t\n\0".ToCharArray());
foreach (string word in words)
{
float wordWidth = graph.MeasureString(
word, font).Width;
if (wordWidth == 0.0)
continue;
if (Xposition + wordWidth > rightMargin)
{
// Начало с новой строки
Xposition = leftMargin;
Yposition += fontHeight;
if (Yposition > bottomMargin)
{
break;
}
}
graph.DrawString(word, font,Brushes.Black, new PointF(Xposition, Yposition));
Xposition += wordWidth;
}
// Исключаем область, на которую был выведен текст, из области печати
//для избежания наложения текста и рисунка
rectText.Y = Yposition;
rectText.Height = bottomMargin - Yposition;
}
}
}
Листинг
6.14.



