Re: Forms and VC++
"blangela" <Bob_Langelaan@telus.net> wrote in message
I teach an introductory and intermediate C++ programming courses at a
local college ( http://www.bcit.ca/study/courses/comp2617
http://www.bcit.ca/study/courses/comp2618 ) . In the past if I wanted
to give my students a taste of creating "Windows App" in C++, I was
pretty well forced into giving them an introduction to MFC. I am told
(I have not yet had a chance to try it myself) that this "forms"
capability is easier to use than MFC. Is this true?
If so, would this CLR/C++ provide a way for me to teach C++ without
restricitng all my course assignments to console type apps?
Yes, it would.
It begs the question, though, as to whether your students would be confused.
I'm no teacher, but I would suggest that you not introduce MC++ or C++/CLI
in a first semester course in which you also teach ISO C++.
Whether the rest of this post will be useful or noise in an open question.
The code I have appended below is something I put together in response to a
question some time ago (btw p.o. are the initials of the guy who asked the
question). In any event, the sample below is a Win32 application which is
compiled by VS2003 using the /clr switch. If the application finds "console"
as its sole command line argument it allocates a console and prints "Hello,
world". If it finds "window" then it creates a window, draws a blue circle
within it, draws a red line across it and draws the text "Hello, world".
The good news is that there is a lot less code there than there would be if
I had written it to the SDK. The bad news is that it is a long way from ISO
Application::Run( new HelloWorld() );
FileStream __gc *fs;
StreamWriter __gc *sw;
if ( AttachConsole(-1) == 0 )
h = GetStdHandle(-11);
fs = new FileStream(IntPtr(h), FileAccess::Write);
sw = new StreamWriter(fs);
sw->AutoFlush = true;
Text = "Hello, world!";
BackColor = Color::White;
void HelloWorld::OnPaint(PaintEventArgs *pea)
Graphics __gc *grfx = pea->Graphics;
grfx->DrawString("Hello, World!", Font, Brushes::Black, 0, 0);
rc = get_ClientRectangle();
rc.Width -= 1;
rc.Height -= 1;
grfx->DrawLine(Pens::Red, 0, 0, rc.Width, rc.Height);
void HelloWorld::OnResize(EventArgs *ea)
// Hack avoids including <windows.h>
int __stdcall WinMain(int, int, char *pszCmd, int)
if ( cmdLine.find("window") != std::string::npos )
else if ( cmdLine.find("console") != std::string::npos )
// po2.h header
using namespace System;
using namespace System::IO;
using namespace System::Drawing;
using namespace System::Windows::Forms;
using namespace System::ComponentModel;
using namespace System::Runtime::InteropServices;
[ DllImport("KERNEL32.dll", EntryPoint="AllocConsole",
extern "C" unsigned short int AllocConsole(void);
[ DllImport("KERNEL32.dll", EntryPoint="AttachConsole",
extern "C" unsigned short int AttachConsole(int);
[ DllImport("KERNEL32.dll", EntryPoint="GetStdHandle",
extern "C" int GetStdHandle(int);
public __gc class HelloWorld : public Form
static void Main();
static void Main2();
void OnPaint(PaintEventArgs __gc *);
void OnResize(EventArgs __gc *);