Re: Forms and VC++
"blangela" <Bob_Langelaan@telus.net> wrote in message
news:1163781759.663127.179490@h48g2000cwc.googlegroups.com...
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++.
<aside>
Whether the rest of this post will be useful or noise in an open question.
:-)
</side>
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
C++.
Regards,
Will
#include "po2.h"
void HelloWorld::Main()
{
Application::Run( new HelloWorld() );
}
void HelloWorld::Main2()
{
int h;
IntPtr handle;
FileStream __gc *fs;
StreamWriter __gc *sw;
if ( AttachConsole(-1) == 0 )
AllocConsole();
h = GetStdHandle(-11);
fs = new FileStream(IntPtr(h), FileAccess::Write);
sw = new StreamWriter(fs);
sw->AutoFlush = true;
Console::SetOut(sw);
Console::WriteLine("Hello, world!");
}
HelloWorld::HelloWorld()
{
Text = "Hello, world!";
BackColor = Color::White;
}
void HelloWorld::OnPaint(PaintEventArgs *pea)
{
Graphics __gc *grfx = pea->Graphics;
Rectangle rc;
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);
grfx->DrawEllipse(Pens::Blue, rc);
}
void HelloWorld::OnResize(EventArgs *ea)
{
Invalidate();
}
// Hack avoids including <windows.h>
int __stdcall WinMain(int, int, char *pszCmd, int)
{
std::string cmdLine(pszCmd);
if ( cmdLine.find("window") != std::string::npos )
{
HelloWorld::Main();
return 0;
}
else if ( cmdLine.find("console") != std::string::npos )
{
HelloWorld::Main2();
return 0;
}
else
return -1;
}
// po2.h header
#include <string>
#using <System.dll>
#using <mscorlib.dll>
#using <System.Drawing.dll>
#using <System.Windows.Forms.dll>
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",
CallingConvention=CallingConvention::StdCall) ]
extern "C" unsigned short int AllocConsole(void);
[ DllImport("KERNEL32.dll", EntryPoint="AttachConsole",
CallingConvention=CallingConvention::StdCall) ]
extern "C" unsigned short int AttachConsole(int);
[ DllImport("KERNEL32.dll", EntryPoint="GetStdHandle",
CallingConvention=CallingConvention::StdCall) ]
extern "C" int GetStdHandle(int);
public __gc class HelloWorld : public Form
{
public:
HelloWorld();
static void Main();
static void Main2();
protected:
void OnPaint(PaintEventArgs __gc *);
void OnResize(EventArgs __gc *);
};