Click here to Skip to main content
12,953,263 members (47,924 online)
Click here to Skip to main content
Add your own
alternative version

Stats

156.9K views
37 bookmarked
Posted 25 Oct 2001

Managed C++ and Windows Forms

, 25 Oct 2001
Rate this:
Please Sign up or sign in to vote.
An introduction to Windows Forms using Managed C++

Introduction

One big complaint I have about Visual Studio .NET is that it does not support a GUI designer tool for Managed C++. Its not going to be easy to design a heavily-GUI oriented program in Managed C++. But then we can always try.  In this article I'll try and give an introduction to using Windows Forms in your Managed C++ applications.

Lets jump straight into our first program. Use the App Wizard to generate a basic Managed C++ application for you. I used the name sample01 for my project and so my main file is sample01.cpp. In your case this filename will depend on the name you chose for your project. Make the required changes to your cpp source so that you have a file looking like the listing below.

Program 1

<PRE lang=mc++>#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; //we derive a class from the Form class //notice how we don't need any header files __gc class MyForm : public Form { }; int __stdcall WinMain() { //this will start a message loop for our form Application::Run(new MyForm()); return 0; }

Well, as you can see, I have made several changes to the App wizard generated code. First I have added all those dll references and their corresponding namespace references. I have added a new managed class called

MyForm 
which is derived from System::Windows::Forms::Form.

I have replaced wmain with WinMain so that we won't have to see that ugly console window behind our beautiful Form. I have prefixed it with __stdcall otherwise you'll see a warning. That's how the Win 32 API has defined WinMain(). Then we have used the static function Run of the Application class. This will start the standard application message loop.

Well, go ahead. Build and run it. You'll see your first Windows Form. Use Ctrl-F5 to run it. If you click on the play button the program will run in debug mode which is considerably slower.

Program 2

<PRE lang=mc++>#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; //we derive a class from the Form class //notice how we don't need any header files __gc class MyForm : public Form { public: MyForm(); Label *m_label; }; int __stdcall WinMain() { //this will start a message loop for our form Application::Run(new MyForm()); return 0; } MyForm ::MyForm() { //set some form properties/fields this->Text = "Elmer Fudd"; this->FormBorderStyle=FormBorderStyle::Fixed3D; this->MaximizeBox=false; this->ClientSize=System::Drawing::Size(400,300); //create the Label object and set its properties/fields m_label=new Label(); m_label->Text="Keep wewy wewy quiet. I am huntin wabbit"; m_label->Size=System::Drawing::Size(300,50); m_label->Location=Point(5,5); //add the label to the form this->Controls->Add(m_label); }

Well, now we have made several changes more. We have added a Label member to our Form derived class and also a constructor. In the constructor we set some properties and fields of our form. We give it a title. We fix its border and make it non-sizable. We disable the maximize box. And also set its size.

We then create our Label object and set its text, size and location. Then we add the label to the form by adding it to the form's controls collection. Build and run it. You should see a more lively window now that, it has a title and some text on it.

Program 3

<PRE lang=mc++>#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; //we derive a class from the Form class //notice how we don't need any header files __gc class MyForm : public Form { public: MyForm(); Label *m_label; Button *btn; TextBox *txt1; void btn_Click(Object *sender, System::EventArgs* e); }; int __stdcall WinMain() { //this will start a message loop for our form Application::Run(new MyForm()); return 0; } MyForm ::MyForm() { //set some form properties/fields this->Text = "Elmer Fudd"; this->FormBorderStyle=FormBorderStyle::Fixed3D; this->MaximizeBox=false; this->ClientSize=System::Drawing::Size(400,300); //create the Label object and set its properties/fields m_label=new Label(); m_label->Text="Keep wewy wewy quiet. I am huntin wabbit"; m_label->Size=System::Drawing::Size(300,50); m_label->Location=Point(5,5); //add the label to the form this->Controls->Add(m_label); btn=new Button(); btn->Text="Click me dude!"; btn->Location=Point(5,90); btn->Size=System::Drawing::Size(100,22); btn->add_Click(new EventHandler(this,&MyForm::btn_Click)); //add the button this->Controls->Add(btn); txt1=new TextBox(); txt1->ReadOnly=true; txt1->Size=System::Drawing::Size(200,22); txt1->Location=Point(130,90); //add the text box this->Controls->Add(txt1); } //the event handler for button click void MyForm::btn_Click(Object *sender, System::EventArgs *e) { //we show the current date/time in the text box DateTime dt=System::DateTime::Now; txt1->Text=dt.ToString(); }

Well, now we have added a button, a text box and an event handler for the button. We have written our btn_Click member function using the expected parameters of the delegate that is associated with the click event. We use add_Click to add our event handler to the list of functions that get notified of the event. And as you can see, in the handler we have written code to put the current date and time into the text box.

Build and run the program. You'll see that each time you click the button, the text box gets updated with the current date and time. Easy, huh?

Conclusion

You can build more complex programs but the basic idea is the same. Event handling is done via virtual functions which you can override. But I still have a faint hope that when Microsoft finally releases the next version of VS.NET, they'll have a CodeDOM like gadget for Managed C++.

Thank You

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

Share

About the Author

Nish Nishant
United States United States
Nish Nishant is the Principal Software Architect/Consultant for Ganymede Software Solutions LLC, and is based out of Columbus, Ohio. He has over 17 years of software industry experience in various roles including Lead Software Architect, Principal Software Engineer, and Product Manager. Nish was a Microsoft Visual C++ MVP between 2002 and 2015.

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 : If you are interested in hiring Nish as a consultant, you can reach him via his google email id voidnish.

Company Website : www.ganymedesoftwaresolutions.com

You may also be interested in...

Comments and Discussions

 
QuestionHow does it work??? Pin
Megidolaon23-Feb-09 21:21
memberMegidolaon23-Feb-09 21:21 
Generalcannot view C# inherited Form in designer having refernce to C+/CLI wrapper Pin
ramki_mars24-Apr-08 1:02
memberramki_mars24-Apr-08 1:02 
QuestionMEMORYY HOGGERRR Pin
Manni Singh20-Mar-07 0:36
memberManni Singh20-Mar-07 0:36 
Generalsplash screen in managed extension C++ Pin
asim_moon20-Jun-04 21:15
memberasim_moon20-Jun-04 21:15 
GeneralThanks Pin
Alex Farber9-Apr-03 21:16
memberAlex Farber9-Apr-03 21:16 
GeneralRe: Thanks Pin
tom7614-Jan-04 2:00
membertom7614-Jan-04 2:00 
GeneralGreat Pin
Matt Newman20-Nov-02 8:34
memberMatt Newman20-Nov-02 8:34 
Generaldll Pin
Mazdak14-Mar-02 22:21
memberMazdak14-Mar-02 22:21 
Hi Nish:
Does those dll all I need for distribute my MC++ application?
I mean does ,net platform nead for it?

Mazy

"So,so you think you can tell,
Heaven from Hell,
Blue skies from pain,...
How I wish,how I wish you were here."
Wish You Were Here-Pink Floyd-1975

GeneralRe: dll Pin
Nish [BusterBoy]14-Mar-02 22:36
memberNish [BusterBoy]14-Mar-02 22:36 
GeneralWinForm [modified] Pin
Fazlul Kabir26-Oct-01 5:22
memberFazlul Kabir26-Oct-01 5:22 
GeneralRe: WinForm Pin
Nish [BusterBoy]26-Oct-01 5:26
memberNish [BusterBoy]26-Oct-01 5:26 

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

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

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.170525.1 | Last Updated 26 Oct 2001
Article Copyright 2001 by Nish Nishant
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid