登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: c++ 纯 win32 程序下调用 .net 窗体[System::Windows::Forms]     [回主站]     [分站链接]
标题
c++ 纯 win32 程序下调用 .net 窗体[System::Windows::Forms]
clq
浏览(0) + 2010-07-26 16:52:43 发表 编辑

关键字:

[2022-05-26 17:40:26 最后更新]
c++ 纯 win32 程序下调用 .net 窗体[System::Windows::Forms]

对于 mfc 程序,似乎只要有调用窗体 show 出来就可以了,例如:


    FormEvent ^form1 = gcnew FormEvent();
    form1->Show();


但纯 win32 下不行,会界面僵死,估计是没有消息循环的原因。
可以按 http://msdn.microsoft.com/zh-cn/library/ms157902%28v=VS.90%29.aspx 处的示例写如下代码:

System::Windows::Forms::Application::Run(gcnew FormEvent);

clq
2010-7-26 16:54:11 发表 编辑

.NET Framework 类库
Application::Run 方法 (Form)

更新:2007 年 11 月

在当前线程上开始运行标准应用程序消息循环,并使指定窗体可见。

命名空间:  System.Windows.Forms
程序集:  System.Windows.Forms(在 System.Windows.Forms.dll 中)


参数

mainForm
类型:System.Windows.Forms::Form

一个 Form,它代表要使之可见的窗体。

异常

异常条件
InvalidOperationException

主消息循环已在当前线程上运行。

备注

通常,应用程序的主函数调用该方法并向它传递应用程序的主窗口。

该方法向 Closed 事件的 mainForm 参数添加一个事件处理程序。事件处理程序调用 ExitThread 来清理应用程序。

说明:

将在该方法返回之前调用 Form 类的 Dispose 方法。

示例

下面的代码示例在窗体上的列表框中列出编号。每次单击 button1 时,应用程序均向列表中另外添加一个编号。

Main 方法调用 Run 以启动应用程序,应用程序创建窗体、listBox1button1。当用户单击 button1 时,button1_Click 方法向列表框添加编号一到三,并显示一个 MessageBox。如果用户在 MessageBox 上单击“No”(否)button1_Click 方法将向列表添加另一个编号。如果用户单击“Yes”(是),则应用程序调用 Exit 来处理队列中的所有剩余消息,然后退出。

本示例要求 listBox1button1 已创建并已放置在窗体上。

public:
static void main()
{
// Starts the application.
Application::Run( gcnew Form1 );
}

private:
void button1_Click( Object^ sender, System::EventArgs^ e )
{
// Populates a list box with three numbers.
int i = 3;
for ( int j = 1; j <= i; j++ )
{
listBox1->Items->Add( j );
}

/* Determines whether the user wants to exit the application.
* If not, adds another number to the list box. */

while ( MessageBox::Show( "Exit application?", "",
MessageBoxButtons::YesNo ) == ::DialogResult::No )
{
// Increments the counter ands add the number to the list box.
i++;
listBox1->Items->Add( i );
}

// The user wants to exit the application. Close everything down.
Application::Exit();
}

clq
2010-7-26 16:55:27 发表 编辑

// exe_win32.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <string>
#include <iostream>
#include <vcclr.h>
#include <windows.h>


#using "D:\..ClassLibrary_dll1\bin\Debug\ClassLibrary_dll1.dll"
//#using "..\Debug\ClassLibrary_dll1.dll"
using namespace cs_test;



int _tmain(int argc, _TCHAR* argv[])
{

    System::Windows::Forms::Application::Run(gcnew FormEvent);


    //--------------------------------------------------
    //关掉前面的窗口后才能到这里来
    FormEvent ^form1 = gcnew FormEvent();
    form1->Show();
    //form1->ShowWindow();

    //FormEvent form1;
    //form1.Show();
    int handle = 0;
    System::IntPtr p(handle);
    //form1->GetWindowHandle(&handle);
    //p =
    form1->GetWindowHandle(p);
    handle = p.ToInt32();

    System::String ^ s = form1->GetCaption();

    PtrToStringChars(s);

    std::string s2;
    std::wstring ws2;
    //s2 = (wchar_t*)(s->ToCharArray().ToPointer());
//    s2 = (wchar_t*)(s->Chars());

    pin_ptr<const wchar_t> src = PtrToStringChars(s);

    //CStringW cs = src;
    //CStringA csa(cs.GetBuffer());

    ws2 = src;

    //System.Windows.Forms
//    Application.Run();

    ::Sleep(10000);

    char c;

    std::cin >> c;

    return 0;
}


clq
2010-7-26 16:56:04 发表 编辑

这个语法直追 delphi 呀 :)

clq
2010-7-26 17:02:55 发表 编辑

我估计实际上为了不影响当前线程得开个新的线程调用 Application::Run。基于 mfc 的程序就不用这么麻烦。

clq
2010-7-26 17:04:13 发表 编辑

比较奇怪的是 vs2008 自带的 msdn 中是找不到 http://msdn.microsoft.com/zh-cn/library/ms157902%28v=VS.90%29.aspx 这样的示例的。


总数:5 页次:1/1 首页 尾页  
总数:5 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1