5,424,116 members and growing! (18,319 online)
Email Password   helpLost your password?
Desktop Development » Miscellaneous » Windows Forms     Intermediate

Managed C++ and Windows Forms - Image Viewer

By Nishant Sivakumar

Demonstrates adding menus, showing open-dialog boxes, showing images, scrolling.
C++/CLI, VC7, C++, .NET, Windows, Win2K, Visual Studio, Dev

Posted: 26 Oct 2001
Updated: 26 Oct 2001
Views: 98,740
Bookmarked: 23 times
Announcements
Want a new Job?



Search    
Advanced Search
Sitemap
28 votes for this Article.
Popularity: 5.47 Rating: 3.78 out of 5
0 votes, 0.0%
1
0 votes, 0.0%
2
0 votes, 0.0%
3
2 votes, 40.0%
4
3 votes, 60.0%
5

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 has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Nishant Sivakumar


Sitebuilder, Mvp
Nish is a real nice guy living in Atlanta, who has been coding since 1990, when he was 13 years old. Originally from sunny Trivandrum in India, he recently moved to Atlanta from Toronto and is a little sad that he won't be able to play in snow anymore.

Nish has been a Microsoft Visual C++ MVP since October, 2002 - awfully nice of Microsoft, he thinks. He maintains an MVP tips and tricks web site - www.voidnish.com where you can find a consolidated list of his articles, writings and ideas on VC++, MFC, .NET and C++/CLI. Oh, and you might want to check out his blog on C++/CLI, MFC, .NET and a lot of other stuff - blog.voidnish.com

Nish loves reading Science Fiction, P G Wodehouse and Agatha Christie, and also fancies himself to be a decent writer of sorts. He has authored a romantic comedy Summer Love and Some more Cricket as well as a programming book – Extending MFC applications with the .NET Framework.

Nish's latest book C++/CLI in Action published by Manning Publications is now available for purchase. You can read more about the book on his blog.

Despite his wife's attempts to get him into cooking, his best effort so far has been a badly done omelette. Some day, he hopes to be a good cook, and to cook a tasty dinner for his wife.
Location: United States United States

Other popular Miscellaneous articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 13 of 13 (Total in Forum: 13) (Refresh)FirstPrevNext
Subject  Author Date 
GeneralWith Toolbar and Statusbarmembernix3215:18 24 Aug '06  
GeneralI'm translating the articlememberjulianico11:38 30 Dec '05  
GeneralRe: I'm translating the articlestaffNishant Sivakumar12:04 30 Dec '05  
GeneralRe: I'm translating the articlememberjulianico11:30 4 Jan '06  
GeneralImpressedsussAnonymous18:28 27 Jun '03  
GeneralScroll ImagememberSimmyp2p21:30 9 Jan '03  
GeneralAww, what a cute little kitten...memberShog916:10 8 May '02  
GeneralRe: Aww, what a cute little kitten...memberNish [BusterBoy]16:17 8 May '02  
Generalfunny <code> tagsmemberNish [BusterBoy]1:36 27 Oct '01  
GeneralRe: funny tagsmemberAmita Buch2:24 29 Oct '01  
GeneralRe: funny tagsmemberNish [BusterBoy]6:02 29 Oct '01  
GeneralRe: funny tagsmemberNish [BusterBoy]6:03 29 Oct '01  
GeneralRe: funny <code> tagssussAnonymous18:34 13 Oct '04  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 26 Oct 2001
Editor: Chris Maunder
Copyright 2001 by Nishant Sivakumar
Everything else Copyright © CodeProject, 1999-2008
Web12 | Advertise on the Code Project