Click here to Skip to main content
11,481,404 members (64,897 online)
Click here to Skip to main content

Managed C++ and Windows Forms - Image Viewer

, 26 Oct 2001 CPOL 137K 36
Rate this:
Please Sign up or sign in to vote.
Demonstrates adding menus, showing open-dialog boxes, showing images, scrolling.

Introduction

This is a sort of continuation of my introductory article on using Windows Forms from Managed C++ programs. In this article I'll show how you can add a menu to your form and how you can add menu handlers. I'll also show how you can show a file-open dialog box and we'll use that to select an image file [a jpeg in this case]. Then we'll draw it on the form and I'll show how you can get your form to scroll with just two lines of code. 

The full source-listing is given below. To build the program, you must first use App Wizard to generate a generic Managed C++ application for you. Then replace the contents of your main .cpp file with the program I have listed down below. The screenshot below depicts what you are supposed to get once you've run the program and have opened a .jpg file.

Screenshot

Adding a menu

We make use of the MainMenu class for creating our menu. This class is derived from the more generic Menu class. We use the property called MenuItems which returns a pointer to a Menu.MenuItemCollection object. 

Creating our menu is very easy.

MainMenu *mmenu=new MainMenu();

Adding a top-level menu item is also pretty easy. We use the property MenuItems and call the Add function of the returned Menu.MenuItemCollection object to add our item.

MenuItem *item = mmenu->MenuItems->Add("File");

Adding sub-items is also a piece of cake. We have the MenuItem pointer for the major item we just added. We use it's MenuItems property and add our sub-menu item. We use an overload of Add() that takes the address of the event handler as the second parameter. Thus we are instructing the CLR or whatever to call our event handler every time a click is made on this sub-menu-item.

item->MenuItems->Add("Open...",new EventHandler(this,&NForm::OnOpen));

Likewise we add more menu items, sub-items, sub-items of sub-items, whatever... and finally we set our Form's Menu to this menu we just created.

this->Menu = mmenu;

Selecting an image file using a file-open dialog

We use the OpenFileDialog class to show the file-open Common dialog box.

OpenFileDialog *opfdlg=new OpenFileDialog ();

We can use the Filter property to set our file type filter. In our case we only want .jpg files.

opfdlg->Filter="JPEG files (*.jpg;*.jpeg)|*.jpg;*.jpeg";

We show our file-open dialog box using

opfdlg->ShowDialog()

We can check ShowDialog's return value to see what the user clicked. If the return value is DialogResult::OK then we know that the user clicked on the OK button.

Showing an image

The Bitmap class encapsulates a GDI+ bitmap. Here we use it to hold our .jpg file.

String *s=opfdlg->FileName; 
m_bitmap=new Bitmap(s);

If the image is too big for our form we'll need to have scrolling ability. We set the form's AutoScroll property to true. We then use the AutoScrollMinSize property to set the size of the screen allocated to the automatic scroll bars. Just two lines of code and we have scrolling up and ready.

this->AutoScroll=true; 
this->AutoScrollMinSize=m_bitmap->Size;

Now we call Invalidate which invalidates the form and forces a re-paint. Thus the OnPaint handler gets called which we have overridden.

Invalidate();

Now take a look at our OnPaint handler.

Graphics *g=e->Graphics;

First we get a pointer to the Graphics object associated with our form's device context. The Graphics class encapsulates a GDI+ drawing surface. Once we have the Graphics object pointer we can call DrawImage to paint our .jpg on the form.

g->DrawImage(m_bitmap,this->AutoScrollPosition.X,
    this->AutoScrollPosition.Y,
    m_bitmap->Width,m_bitmap->Height);

Full Program Listing


#include "stdafx.h"

#using <mscorlib.dll>
#using <System.dll>
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>

using namespace System;
using namespace System::ComponentModel;
using namespace System::Drawing;
using namespace System::Windows::Forms;

__gc class NForm : public Form
{
public:
    NForm();
protected:    
    void OnPaint(PaintEventArgs *e);
private:
    //event handlers for menu item clicks
    void OnExit (Object* sender, EventArgs *e);
    void OnAbout (Object* sender, EventArgs *e);
    void OnOpen (Object* sender, EventArgs *e);

    //our member variable for the image
    Bitmap *m_bitmap;
};

int __stdcall WinMain()
{   
    Application::Run(new NForm());
    return 0;
}

NForm::NForm()
{
    //set form title
    Text = "More stuff with Windows Forms";

    //create our menu
    MainMenu *mmenu=new MainMenu();    

    //add File as a major item
    MenuItem *item = mmenu->MenuItems->Add("File");

    //Now add the sub-items and set their event handlers
    item->MenuItems->Add("Open...",new EventHandler(this,&NForm::OnOpen));
    item->MenuItems->Add("Exit",new EventHandler(this,&NForm::OnExit));

    //Add another major item and it's sub-item
    item = mmenu->MenuItems->Add("Help");    
    item->MenuItems->Add("About...",new EventHandler(this,&NForm::OnAbout));    

    //set the forms menu to the menu we just created
    this->Menu=mmenu;    
}

void NForm::OnExit(Object *sender, EventArgs *e)
{
    //exit
    this->Close();
}

void NForm::OnAbout(Object *sender, EventArgs *e)
{
    //show an about box
    MessageBox::Show("Well, this is the about box.","About this prog");
}
void NForm::OnOpen(Object *sender, EventArgs *e)
{
    //we use OpenFileDialog to show a file-open dialog box
    OpenFileDialog *opfdlg=new OpenFileDialog ();

    //we only want jpg files
    opfdlg->Filter="JPEG files (*.jpg;*.jpeg)|*.jpg;*.jpeg";

    //if user has clicked on the OK button
    if(opfdlg->ShowDialog()==DialogResult::OK)
    {
        //we get the selected jpg and assign it to our Bitmap member
        String *s=opfdlg->FileName;
        m_bitmap=new Bitmap(s);

        //we need to scroll if the image is too big
        this->AutoScroll=true;
        this->AutoScrollMinSize=m_bitmap->Size;

        //we do this to force a re-paint
        Invalidate();
    }
}

void NForm::OnPaint(PaintEventArgs *e)
{
    if(m_bitmap)//chk and see if it is valid
    {
        //get the Graphics object associated with our form's device context
        Graphics *g=e->Graphics;

        //use the DrawImage function to show the image
        g->DrawImage(m_bitmap,this->AutoScrollPosition.X,
            this->AutoScrollPosition.Y,
            m_bitmap->Width,m_bitmap->Height);
        
    }
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Nish Nishant

United States United States
Nish Nishant is a Software Architect/Consultant based out of Columbus, Ohio. He has over 15 years of software industry experience in various roles including Lead Software Architect, Principal Software Engineer, and Product Manager. Nish is a recipient of the annual Microsoft Visual C++ MVP Award since 2002 (13 consecutive awards as of 2014).

Nish is an industry acknowledged expert in the Microsoft technology stack. He authored
C++/CLI in Action for Manning Publications in 2005, and had previously co-authored
Extending MFC Applications with the .NET Framework for Addison Wesley in 2003. In addition, he has over 140 published technology articles on CodeProject.com and another 250+ blog articles on his
WordPress blog. Nish is vastly experienced in team management, mentoring teams, and directing all stages of software development.

Contact Nish : You can reach Nish on his google email id voidnish.

Website and Blog

Comments and Discussions

 
GeneralMy vote of 4 Pin
hosiduy3-Sep-12 7:19
memberhosiduy3-Sep-12 7:19 
GeneralAdd JPEG/ PNG/ JIF files Pin
venkateswarluk8-Dec-08 1:22
membervenkateswarluk8-Dec-08 1:22 
GeneralWith Toolbar and Statusbar Pin
nix32124-Aug-06 5:18
membernix32124-Aug-06 5:18 
GeneralI'm translating the article Pin
julianico30-Dec-05 11:38
memberjulianico30-Dec-05 11:38 
GeneralRe: I'm translating the article Pin
Nishant Sivakumar30-Dec-05 12:04
staffNishant Sivakumar30-Dec-05 12:04 
GeneralRe: I'm translating the article Pin
julianico4-Jan-06 11:30
memberjulianico4-Jan-06 11:30 
GeneralImpressed Pin
Anonymous27-Jun-03 18:28
sussAnonymous27-Jun-03 18:28 
GeneralScroll Image Pin
Simmyp2p9-Jan-03 21:30
memberSimmyp2p9-Jan-03 21:30 
GeneralAww, what a cute little kitten... Pin
Shog98-May-02 16:10
memberShog98-May-02 16:10 
GeneralRe: Aww, what a cute little kitten... Pin
Nish [BusterBoy]8-May-02 16:17
memberNish [BusterBoy]8-May-02 16:17 
Generalfunny &lt;code&gt; tags Pin
Nish [BusterBoy]27-Oct-01 1:36
memberNish [BusterBoy]27-Oct-01 1:36 
GeneralRe: funny <code> tags Pin
Amita Buch29-Oct-01 2:24
memberAmita Buch29-Oct-01 2:24 
GeneralRe: funny <code> tags Pin
Nish [BusterBoy]29-Oct-01 6:02
memberNish [BusterBoy]29-Oct-01 6:02 
GeneralRe: funny <code> tags Pin
Nish [BusterBoy]29-Oct-01 6:03
memberNish [BusterBoy]29-Oct-01 6:03 
GeneralRe: funny &lt;code&gt; tags Pin
Anonymous13-Oct-04 18:34
sussAnonymous13-Oct-04 18:34 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.150520.1 | Last Updated 27 Oct 2001
Article Copyright 2001 by Nish Nishant
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid