C++调用C#之C# COM控件
C#做界面真的是比C++方便多了,所以尝试了一下,使用C++做核心功能(例如绘图),然后用C#来做节目(例如对话框),考虑到以后可能不能使用.net,使用DLL做一个隔离层,隔离C++和C#,方便以后可以使用不同的语言开发。
C#部分:
1. 新建工程
2. 修改工程属性
3. 代码部分
ShowDialog.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms; namespace NetActiveX
{
// 事件接口
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IEvent
{
[DispId(20)]
void NotifyEvent(string s);
}
// 显示对话框接口
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IShowDialog
{
void ShowDialog(string dlgType, string s);
}
// 显示对话框实现类
[ComDefaultInterface(typeof(IShowDialog)),
ComSourceInterfaces(typeof(IEvent)),
ComVisible(true)]
public class ShowDialogImpl : IShowDialog
{
public void ShowDialog(string dlgType, string s)
{
switch (dlgType)
{
case "EmployeeDialog":
ShowEmployeeDialog(s);
break; default:
break;
}
}
// 定义委托和事件
public delegate void EventDelegate(string s);
public event EventDelegate NotifyEvent;
// 对话框应用确定通知
private void DialogNotify(Form from)
{
Type type = from.GetType(); switch (type.Name)
{
case "EmployeeDialog":
{
EmployeeDialog dlg = (EmployeeDialog)from;
EmployeeData employee = dlg.GetEmployee();
s = employee.ToString();
NotifyEvent(s);
}
break; default:
break;
}
}
// 显示员工对话框
private void ShowEmployeeDialog(string s)
{
EmployeeDialog dlg = new EmployeeDialog();
EmployeeData employee = new EmployeeData(); employee.ParseString(s);
dlg.SetEmployee(employee);
dlg.SetNotify(DialogNotify);
dlg.ShowDialog();
}
}
}
EmployeeDialog.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace NetActiveX
{
public partial class EmployeeDialog : Form
{
public delegate void Notify(EmployeeDialog dlg); public EmployeeDialog()
{
InitializeComponent();
} protected void SaveData()
{
m_employee.m_name = m_textName.Text;
m_employee.m_sex = m_textSex.Text;
m_employee.m_age = Int32.Parse(m_textAge.Text);
m_employee.m_phone = m_textPhone.Text;
m_employee.m_mobile = m_textMobile.Text;
} private void EmployeeDialog_Load(object sender, EventArgs e)
{
if (m_employee != null)
{
m_textName.Text = m_employee.m_name;
m_textSex.Text = m_employee.m_sex;
m_textAge.Text = m_employee.m_age.ToString();
m_textPhone.Text = m_employee.m_phone;
m_textMobile.Text = m_employee.m_mobile;
}
} private void m_btnOK_Click(object sender, EventArgs e)
{
SaveData();
m_notify(this);
this.Close();
}
private void m_btnApply_Click(object sender, EventArgs e)
{
SaveData();
m_notify(this);
}
private void m_btnCancel_Click(object sender, EventArgs e)
{
this.Close();
} public void SetEmployee(EmployeeData employee)
{
m_employee = employee;
}
public EmployeeData GetEmployee()
{
return m_employee;
}
public void SetNotify(Notify notify)
{
m_notify = notify;
} private Notify m_notify;
private EmployeeData m_employee;
} public class EmployeeData
{
public void ParseString(string s)
{
int beg = -1;
int end = -1; beg = 0;
end = s.IndexOf(",", beg);
if (end != -1)
{
m_name = s.Substring(beg, end - beg);
beg = end + 1;
}
end = s.IndexOf(",", beg);
if (end != -1)
{
m_sex = s.Substring(beg, end - beg);
beg = end + 1;
}
end = s.IndexOf(",", beg);
if (end != -1)
{
m_age = Int32.Parse(s.Substring(beg, end - beg));
beg = end + 1;
}
end = s.IndexOf(",", beg);
if (end != -1)
{
m_phone = s.Substring(beg, end - beg);
beg = end + 1;
}
if (beg < s.Length)
{
m_mobile = s.Substring(beg);
}
} public override string ToString()
{
string s = string.Empty; s += m_name;
s = s + "," + m_sex;
s = s + "," + m_age.ToString();
s = s + "," + m_phone;
s = s + "," + m_mobile; return s;
} public string m_name;
public string m_sex;
public int m_age;
public string m_phone;
public string m_mobile;
}
}
C++调用C#之C# COM控件的更多相关文章
- 解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件
解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件的问题 http://marller.blog.51cto.com/8699646/1762028 FAQ: Surf ...
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- C# 线程调用主线程中的控件
由于项目的需要,最近几天一直在做串口和数据库.由于C#使用的时间不长,所以在编写代码和调试的过程中总是遇到意想不到的问题,比如在使用串口接收数据的时候,在接收数据事件中想把接收的数据放入一个textb ...
- Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)
Phonegap项目,做支付的时候,当把网站打包到ios或android端成app后,在app上通过wap调用银联在线存在一个问题: 就是当从银联支付成功后,再从服务器返回到app客户端就很难实现. ...
- 如何使用Python调用AutoIt来实现Flash控件的上传功能
先看一段代码 upload.au3(这个后缀autoit3的格式): ;等待出现title为数据采集-军课网-MozillaFirefox的浏览器窗口 WinWait("数据采集 - XX网 ...
- JS调用Delphi编写的OCX控件
原文:http://www.mamicode.com/info-detail-471283.html 一.使用Delphi XE2编写OCX控件 生成OCX工程: 1.File-New-Other,在 ...
- Android 调用相册 拍照 实现系统控件缩放 切割图片
android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家. package cn.m15.test; import java.io.B ...
- 解决SurfaceView调用setZOrderOnTop(true)遮挡其他控件的问题
SurfaceView遮挡其他控件的项目背景: 最近在做播放器项目,由于底层实现是用Surface和OpenGL切换渲染,所以在布局里面同时使用了GLSurfaceView和SurfaceView,同 ...
- Qt开发Activex笔记(二):Qt调用Qt开发的Activex控件
若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/113789693 长期持续带来更多项目与技术分享 ...
- js 调用IE内置打印控件
转自学网(http://www.xue5.com/itedu/200802/102909.html) WebBrowser是IE内置的浏览器控件,无需用户下载. 一.WebBrowser控件 < ...
随机推荐
- 《Intel汇编第5版》 汇编减法程序
第一步: 安装虚拟机32位XP系统 + RadAsm软件 第二步: 下载<Intel汇编语言程序设计第5版>中相关的源代码以及库文件 http://kipirvi ...
- HDU 1242 Rescue(BFS),ZOJ 1649
题目链接 ZOJ链接 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The ...
- UVA 624 CD (01背包)
//路径记录方法:若是dp[j-value[i]]+value[i]>dp[j]说明拿了这个东西,标志为1, //for循环标志,发现是1,就打印出来,并把背包的容量减少,再在次容量中寻找标志: ...
- MySQL性能优化(来源于简书)
1.为查询优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存 ...
- onbeforeunload与a标签在IE中的冲突bug(转载)
onbeforeunload与a标签在IE中的冲突bug onbeforeunload 是window的一个事件,目前Firefox,IE都支持,主要用来提示用户是否真的要离开该页面,通常在一些比 ...
- Stash安装和破解
参考资料: http://www.unxmail.com/?p=590 上篇介绍了,Atlassian Stash v2.12.1 破解版的下载, 有同学不会安装. 我重新整理了下文档. 表述我的安装 ...
- 单片机上使用TEA加密通信(转)
源:单片机上使用TEA加密通信 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:MDK4.72 单片机:STM32 说 ...
- CodeForces 567C Geometric Progression 类似dp的递推统计方案数
input n,k 1<=n,k<=200000 a1 a2 ... an 1<=ai<=1e9 output 数组中选三个数,且三个数的下标严格递增,凑成形如b,b*k,b* ...
- Java Queue 各种方法的区别
再Java里的某些集合类,其实是实现了多个接口的,所以就会同时又多种方法针对同一种操作,比如LinkedList类. 首先看一下java集合类的继承关系图: 这里简单对其重复的方法做点简单的区分. o ...
- ios ViewController的生命周期分析和基本使用逻辑
按结构可以对iOS的所有ViewController分成两类:1.主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UITable ...