Open a new Windows Forms Application named “PictureViewer”. Rename “Form1.cs” to “frmViewer.cs”.
Form Properties
Size: 500, 420
Text: Picture Viewer
Add a MainMenu to the form from the toolbox. If you do not have the MainMenu right click in the toolbox and select “Choose Items…” From the Dialog box that shows up navigate to the .NET components tab. Scroll down to MainMenu and select the checkbox then click ok. You should now see the MainMenu in your toolbox.
MainMenu Properties
(Name): mMain
In the type here add “&File” to the main menu. Under File add “Open…” and “Exit”. Now right click on exit and select insert separator.
Click on “File” and insert the properties below. Do the same for Open and Exit.
File Properties
(Name): mmFile
Open Properties
(Name): mmOpen
Exit Properties
(Name): mmExit
Add a Panel to the form from the tool box and use the properties below. We are using a panel to show our image instead of a picture box because it allows us access to the autoscroll property which will give us scroll bars if our picture is larger than the form.
Panel Properties
(Name): pnlImage
AutoScroll: True
Dock: Fill
Your form should now look like the picture below.
Add click events to the Open and Exit buttons in the menu by either double clicking on them or going to the Events in the properties panel and double clicking in the click event dropdown. There should now be two methods names “mmOpen_Click” and “mmExit_Click”. Also go the the panel and create the paint method. There should now be one more method called “pnlImage_Paint.”
Add the following code to your form. The comments will discuss what the code does. Since we are not using a picture box we will store the image in the program by adding an image variable. Your code should look like below.
Image image; public frmViewer() { InitializeComponent(); } private void mmOpen_Click(object sender, EventArgs e) { //Create an Open File Dialog box. OpenFileDialog ofd = new OpenFileDialog(); //Set Title and Filter for selecting a Picture. ofd.Title = "Select Picture"; ofd.Filter = "Image Files|*.BMP;*.JPG|Windows Bitmaps|*.BMP|JPEG Files|*.JPG"; //Show the open file dialog box if (ofd.ShowDialog() == DialogResult.OK) { //Load the picture into the picture box image = Image.FromFile(ofd.FileName); //Shows the name of the filein the form's caption and status strip. this.Text = string.Concat("Picture Viewer (" + ofd.FileName + ")"); //Draw the image to the form. DrawImage(); } } private void mmExit_Click(object sender, EventArgs e) { //Close the window and exit the application this.Close(); } private void pnlImage_Paint(object sender, PaintEventArgs e) { //Draw the image to the form whenever the panel is drawn. DrawImage(); } public void DrawImage() { //Do not draw if there is no image. if (image == null) return; Graphics g = pnlImage.CreateGraphics(); //Set the minimum size to the picture so we can scroll around a large picture. pnlImage.AutoScrollMinSize = new Size((int)(image.Width), (int)(image.Height)); //Create our center points. int c1 = 0; int c2 = 0; if (this.Width > image.Width) c1 = (pnlImage.Width / 2) - (image.Width / 2); if (this.Height > image.Height) c2 = (pnlImage.Height / 2) - (image.Height / 2); //Only clear if image is smaller than panel. //Helps keep panel from flashing when scrolling on images. if (pnlImage.Width > image.Width || pnlImage.Height > image.Height) { //Clear the panel for drawing our new image. g.Clear(Control.DefaultBackColor); } //Draw the image to the screen. g.DrawImage(image, pnlImage.AutoScrollPosition.X + c1, pnlImage.AutoScrollPosition.Y + c2, image.Width, image.Height); //Dispose of all graphics and images used. g.Dispose(); }
You should now be able to run your code. You will be able to open an image and display it in your form. There will be scrollbars if the image is too large to be displayed. This is good if that is all you want your program to do but it is boring. We need to add a way to resize and also display the properties of the image.
Add a status strip from the toolbox to the main form. Add three status labels to the status strip and give it the properties below. Note: After adding the status strip it is best to re-dock the image panel to get the lower slide bar to not be hidden by the status strip.
StatusStrip Properties
(Name): StatusStrip
Text: Status Strip
Label 1 Properties
(Name): lblX
BorderSides: Right
Text: X:
TextAlign: MiddleLeft
AutoSize: False
Size: 50,19
Label 2 Properties
(Name): lblY
BorderSides: Right
Text: Y:
TextAlign: MiddleLeft
AutoSize: False
Size: 50,19
Label 3 Properties
(Name): lblFile
Text:
TextAlign: MiddleLeft
Now add an “E&dit” to the main menu. Underneath add “Enlarge”, “Reduce” and “Properties…” Above the options add another separator. Give the new buttons the properties below.
Edit Properties
(Name): mmEdit
Text: E&dit
Enlarge Properties
(Name): mmEnlarge
Text: Enlarge Ctrl + +
Reduce Properties
(Name): mmReduce
Text: Reduce Ctrl + –
Properties Properties
(Name): mmProperties
Text: Properties…
Your form should now look like the image below.
Add a context menu strip. Add two buttons “Enlarge” and “Reduce.” Then add the properties below.
Enlarge Properties
(Name): cmsEnlarge
ShortcutKeyDisplayString: Ctrl + +
ShortcutKeys:Ctrl_Oemplus
ShowShortcutKeys: True
Text:Enlarge
Reduce Properties
(Name): cmsReduce
ShortcutKeyDisplayString: Ctrl + –
ShortcutKeys:Ctrl_OemMinus
ShowShortcutKeys: True
Text:Reduce
Create click methods for both of the context menu strip buttons. You should now have two methods named “cmsEnlarge_Click” and “cmsReduce_Click.” Add the code below to the new methods. Also add the enlarge and reduce methods to the enlarge and reduce buttons on the main menu.
private void cmsEnlarge_Click(object sender, EventArgs e) { //Check that image is not null then increase size by 5%. if (image != null) image = ResizePercent((Bitmap)image, 105); //Draw the resized image to the form. DrawImage(); } private void cmsReduce_Click(object sender, EventArgs e) { //Check that image is not null then increase size by 5%. if (image != null) image = ResizePercent((Bitmap)image, 95); //Draw the resized image to the form. DrawImage(); } private Bitmap ResizePercent(Bitmap image, int Percent) { //Set the percent to a number Example: 105% = 1.05 double percent = ((double)Percent / 100.0); //Create the new image height and width. int new_width = (int)(image.Width * percent); int new_height = (int)(image.Height * percent); //Create the new image while maintaining pixel format. Bitmap new_Image = new Bitmap(new_width, new_height, image.PixelFormat); //Set the new image to the same resolution as the old image. new_Image.SetResolution(image.HorizontalResolution, image.VerticalResolution); //Create graphics to draw resized image. Graphics g = Graphics.FromImage(new_Image); //Set the interpolation mode to keep the picture looking as nice as possible. g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; //Draw the new image. g.DrawImage(image, 0, 0, new_width, new_height); //Dispose of the graphics and old bitmap. g.Dispose(); image.Dispose(); //Return the new image. return new_Image; }
In the properties of the form add the context menu strip to the form. Then go to the panel and add two methods for “MouseMove” and “MouseLeave.” This will add the methods “pnlImage_MouseMove” and “pnlImage_MouseLeave” to your code. Add the following code.
private void pnlImage_MouseMove(object sender, MouseEventArgs e) { //Display the location of the mouse in the panel. lblX.Text = "X: " + e.X.ToString(); lblY.Text = "Y: " + e.Y.ToString(); } private void pnlImage_MouseLeave(object sender, EventArgs e) { //Set the labels to empty when mouse leaves lblX.Text = "X:"; lblY.Text = "Y:"; }
Now we need to add a new form to our project. Name this form “frmProperties.” Add labels, buttons and textboxes (set the text box to read-only) to create a form like the picture below. Then add the code below.”
private void mmProperties_Click(object sender, EventArgs e) { //Return if there is no image. if (image == null) return; //Create a new Properties form. frmProperties frmOptionsDialog = new frmProperties(); //Set the image in the form to reference the current image. frmOptionsDialog.image = image; //Show the form as a dialog so the user can't click main form. frmOptionsDialog.ShowDialog(); }
Now if you run the program you should have a fully functional picture viewer that can show you the properties of the image and enlarge and reduce the size of the image.