/*
Console::WriteLine() I am trying to use message box instead of
Console::WriteLine() to upgrade my code from just using the console to using
GUI.
In the bottom 2 lines, #1 works, but I have hard time to make # 2 works. Can
anybody give a hand here to make the information to be shown on the message
box instead of being shown on the console.
I am using visual C++ .NET 2003
Thanks
*/
#include "stdafx.h"
#include <gcroot.h>
#using <mscorlib.dll>
using namespace System;
using namespace System::Runtime::InteropServices;
typedef void* HWND;
[DllImportAttribute("User32.dll", CharSet=CharSet::Auto)]
extern "C" int MessageBox(HWND hw, String* text,
String* caption, unsigned int type);
__gc class MClass
{
public:
int val;
MClass(int n) //costructor
{
val = n;
}
};
class UClass
{
public :
gcroot<MClass*> mc;
UClass(MClass* pmc) //constructor
{
mc = pmc;
}
int getValue() //get function
{
return mc->val;
}
};
int _tmain()
{
Console::WriteLine(S"Testing...");
//Create a managed object and assign 3 to it
MClass* pm = new MClass (3);
//Create an unmanaged object and assign the value of the manged object (pm)
to it
UClass uc(pm);
Console::WriteLine(S"Value is {0}", __box(uc.getValue())); //<-------- This
will work # 1
//MessageBox(0, uc.getValue(), S"Message Box...", 0 ); //<------- this will
not work # 2
return 0;
}
Peter Duniho - 02 Jun 2007 11:46 GMT
> [...]
> //MessageBox(0, uc.getValue(), S"Message Box...", 0 ); //<------- this
> will
> not work # 2
There are a variety of ways to do what you want, but the basic idea is
this: you need to pass a fully-formed string to the MessageBox.Show()
method. Off the top of my head, something like this should work:
MessageBox.Show(String.Format(S"Value is {0}", __box(uc.getValue())));
Please note that I do very little managed C++ stuff; there may be a more
readable way to write the above. I pretty much just based it on what you
already wrote, along with what I know about MessageBox. But hopefully you
get the idea.
Pete
Morten Wennevik [C# MVP] - 02 Jun 2007 18:43 GMT
Hi,
I cannot comment on your code as I have never done managed C++, but to go from a console application to a windows application, you need to reference System.Windows.Forms.dll, inherit from System.Windows.Forms.Form, attach a message loop (in C# done with Application.Run(new MyForm()); from the static Main method), and output the compiled code as winexe (it will still run if you compile it to a console application but it will then open a console window before the WinForm shows).

Signature
Happy coding!
Morten Wennevik [C# MVP]