c++ cli-寻求大神指点,如何将MFC对话框作为.net 中 winForm的父窗体

问题描述

寻求大神指点,如何将MFC对话框作为.net 中 winForm的父窗体

问题是这样的:
在建立的MFC对话框工程中,使用.NET与MFC互操作,在一个MFC的对话框CMFC_C_CLIDemoDlg 中显示一个.net的form窗体frm,由于需要显示成非模态对话框样式的Form,所以使用了frm->Show();的方法。
但是这样创建的窗体frm在失去焦点后,窗体就消失了(不显示在对话框的上层),经过测试发现,是因为在frm->Show()显示窗体时,没有指定对话框为它的父窗体。但是这里如何将MFC的CDailog类型的对话框CMFC_C_CLIDemoDlg 指定为Form类型的窗体frm的父窗体呢?
如果不能指定,还有什么办法使frm失去焦点后,仍然显示在对话框的上层?

代码如下:

// CMFC_C_CLIDemoDlg 对话框
class CMFC__C_CLIDemoDlg : public CDialog
{
// 构造
public:
CMFC__C_CLIDemoDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据
enum { IDD = IDD_MFC__C_CLIDEMO_DIALOG };

    ```
    ```

};

namespace MFC__C_CLIDemo
{
public ref class WinForm : public System::Windows::Forms::Form
{
public:
WinForm(void)
{
InitializeComponent();
//
//TODO: 在此处添加构造函数代码
//
}


}

//在MFC对话框中显示form窗体
void CMFC__C_CLIDemoDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
WinForm ^frm=gcnew WinForm;
//frm->ShowDialog();
frm->Show();
}

解决方案

一般API是用的SetParent函数,但是MFC和.net不是一个体系,只怕内部交融肯定不行,至少焦点是个问题

解决方案二:

最好是同一个进程,你可以用VC++ CIL做你的MFC程序,同时它也支持.net,然后里面调用.net程序集,可以用C#写dll实现。

解决方案三:

解决方案四:

http://blog.csdn.net/sjdev/article/details/5551110

解决方案五:

谢谢大家的帮忙和提点。倒腾了一天,问题终于解决,解决方案如下:
void CMFC_C_CLIDemoDlg::OnBnClickedOk()___
{
// TODO: 在此添加控件通知处理程序代码
//将对话框的句柄hWnd转换为IWin32Window^,然后传入作为form的父窗口
HWND hWnd = this->GetSafeHwnd();
IWin32Window^ w = gcnew WindowWrapper( System::IntPtr( hWnd ) );
SubForm1 ^form1 = gcnew SubForm1();
form1->Show(w);
}

其中类WindowWrapper的实现如下:
WindowWrapper.h

#pragma once
using namespace System;
using namespace System::Windows;

//将HWND转换为IWin32Window^类型
public ref class WindowWrapper : System::Windows::Forms::IWin32Window
{
public:
WindowWrapper(void);
public: WindowWrapper(IntPtr handle)
{
_hwnd = handle;
}

public:
property IntPtr Handle
{
    virtual IntPtr get(void){return _hwnd;};
};

private: IntPtr _hwnd;

};

时间: 2024-09-10 21:34:36

c++ cli-寻求大神指点,如何将MFC对话框作为.net 中 winForm的父窗体的相关文章

Atmel studio 6.0 编译之后PWM无输出,求大神指点

问题描述 Atmel studio 6.0 编译之后PWM无输出,求大神指点 使用的是atmega48芯片,程序如下: #include #include #include #define F_CPU 8000000UL #include #include #define uchar unsigned char #define uint unsigned int //控制单个io口 省略 uint a; //各端口初始化 void PORT_INIT(void) { DDRD=(1<<PD1)

Genymoation安装之后打开虚拟机报错求大神指点

问题描述 Genymoation安装之后打开虚拟机报错求大神指点 错误是这样的 求大神指点,谢谢 解决方案 多启动几次,如果还不行,就启动virtualbox,在里面看看对应的虚拟机是否正常可以启动,或者先关掉它

ftp服务器-毕设求大神指点!!题目是基于SaaS模式的分布式FTP服务器技术研究

问题描述 毕设求大神指点!!题目是基于SaaS模式的分布式FTP服务器技术研究 内容是: 目前,云计算正在各领域得到越来越多的应用,出现了多种云计算环境,掌握云计算的概念,熟悉相关云计算平台上的软件开发方法,对提高学生综合运用所学知识解决实际问题具有十分重要的现实意义.作为云计算平台之一的百度云,已得到了广泛应用, 本课题在理解FTP服务器模式的前提下,在saas环境下建立分布式的ftp服务,用户可通过ftp客户端传送数据. 该课题具有以下要求: 1. 了解云计算的基本原理,掌握基于saas的开

c++问题-在acm上刷题老是通不过,求大神指点一二,到底问题出在哪里。不胜感激!!!

问题描述 在acm上刷题老是通不过,求大神指点一二,到底问题出在哪里.不胜感激!!! #include #include using namespace std; int main() { int T; int k,t=0; int i, j, n1, n2; char a[1010], b[1010], c[1015]; string d[20], e[20], f[20]; cin>>T; for(k=1; k<=T; k++) { cin>>a>>b; d[

图片-今天打开eclipse,就出现这种情况,请大神指点!!!

问题描述 今天打开eclipse,就出现这种情况,请大神指点!!! 解决方案 首先,不建议安装到中文目录下.可能是这2种情况导致的: 1.环境变量没配置2.eclipse和jdk版本位数不一致要同是32位或者64位(注意32位机子只能使用32位的64位可以兼容使用32位和64位的) 解决办法:1.配置环境变量: 第一步:右键"我的电脑"点击"属性" 第二步:点击"高级系统设置"点击"环境变量(N)" 第三步: 在"系

ext4-求大神指点Extj4.2.1 引入项目报错。

问题描述 求大神指点Extj4.2.1 引入项目报错. 如下图所示,将ext引入后ext-all.js 都出现错误.在运行的时候无法引入到页面.求大神指点.

java-急急急,多多指教。大神指点.

问题描述 急急急,多多指教.大神指点. spring框架的AOP是干啥的?error和excption的区别是啥子?求解 解决方案 var aUsage = {??"int":"^([+-]?)//d+$",??"int+":"^([+]?)//d+$",??"int-":"^-//d+$",??"num":"^([+-]?)//d*//.?//d+$&qu

spring mvc-springmvc+mybatis+quartz的项目启动出错了,求大神指点

问题描述 springmvc+mybatis+quartz的项目启动出错了,求大神指点 看不懂什么情况,求大神指点下 jackson-mapper-asl严重: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Quart

mfc-MFC中设置注册界面,运行结果一直是注册成功,怎么回事?求大神指点

问题描述 MFC中设置注册界面,运行结果一直是注册成功,怎么回事?求大神指点 void CREGISTERDlg::OnBnClickedButtonOk(){ // TODO: 在此添加控件通知处理程序代码 UpdateData(true); if (m_NAME == "" "" || m_PWD == "" "" || m_PWD1 == "" "") { MessageBox(T