1、界面编程,需要同框

当你写了一个c# 程序,而又不得不使用c++ 例如MFC或者qt等来做高效率的编解码等等工作的时候,问题来了,怎么通信,怎么解决两个界面的问题,这里介绍一个终极技巧,那就是c# 直接嵌入c++窗口。

这里下载源代码

2、制作c# 调用api dll

2.1 setparent 函数

设置父窗体函数,这是个API函数,可以设置窗体为另外一个窗体的父亲

 public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

2.2 c# 调用API dll 封装

namespace cnc
{public struct COPYDATASTRUCT{public IntPtr dwData;public int cData;[MarshalAs(UnmanagedType.LPStr)]public string lpData;}public class cncfunc{Process p = null;private const int WM_COPYDATA = 0x004A;const int SWP_NOMOVE = 0x02, SWP_NOSIZE = 0x01, SWP_NOZORDER = 0x04, SWP_FRAMECHANGED = 0x20;[DllImport("user32.dll", EntryPoint = "SetParent")]public static extern int SetParent(IntPtr hWndChild, IntPtr hWndNewParent);[DllImport("user32.dll", EntryPoint = "GetWindowLong")]public static extern int GetWindowLong(IntPtr hwnd, int nIndex);[DllImport("user32.dll", EntryPoint = "SetWindowLong")]public static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);[DllImport("user32.dll")]private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndlnsertAfter, int X, int Y, int cx, int cy, uint Flags);[DllImport("user32.dll ", EntryPoint = "ShowWindow")]public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);[DllImport("User32.dll")]public static extern int SendMessage(int hwnd, int msg, int wParam, ref COPYDATASTRUCT IParam);[DllImport("User32.dll")]public static extern int FindWindow(string lpClassName, string lpWindowName);/// <summary>/// 向C++程序 CshapMessage发送消息/// </summary>/// <param name="nMessgeId"></param>/// <param name="strSend"></param>/// <returns></returns>public int SndMessage(int nMessgeId, String strSend){if (p == null)return -1;//    WINDOW_HANDLE = p.MainWindowHandle;IntPtr hWnd = p.MainWindowHandle;int handle = hWnd.ToInt32();if (handle != 0){COPYDATASTRUCT cdata;cdata.dwData = (IntPtr)nMessgeId;//这里可以传入一些自定义的数据,但只能是4字节整数 cdata.lpData = strSend;//消息字符串cdata.cData = System.Text.Encoding.Default.GetBytes(strSend).Length + 1;//注意,这里的长度是按字节来算的return SendMessage(handle, WM_COPYDATA, 0, ref cdata);}else{return -1;}return 0;}public int connect(string name,int time,IntPtr parent){if (p != null)return -1;p =  new Process();p.StartInfo.FileName = name; //"MFCApplication1.exe";p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;//加上这句效果更好p.Start();System.Threading.Thread.Sleep(time);SetParent(p.MainWindowHandle, parent/*pictureBox1.Handle*/);//panel1.Handle为要显示外部程序的容器ShowWindow(p.MainWindowHandle, 3);return 0;}}
}

3 建立一个c# 窗口程序

窗口程序叫做rcxsharp

c# 窗体中包含两个按钮,一个打开,一个发送消息,打开负责打开MFC程序,发送消息负责向c++ MFC发送信息,以便于控制

 public partial class Form1 : Form{cncfunc m_cncfunc = new cncfunc();//IntPtr hwnd;public Form1(){InitializeComponent();}private void button2_Click(object sender, EventArgs e){m_cncfunc.connect("rcx.exe", 200, pictureBox1.Handle);}private void button1_Click(object sender, EventArgs e){m_cncfunc.SndMessage(100, "hello world");}}

代码很简单:
打开按钮:cncfunc 对象负责打开本目录下的rcx.exe程序,并把这个程序放到pictureBox1 里面。
发送消息按钮,发送一个hello world 消息给打开的rcx.exe程序

4 、MFC 窗口

制作一个MFC程序,名称叫做rcx

5、开始执行

点击打开按钮,MFC 窗体被放进了c# 窗体里面。

点击按钮,MFC 窗口里的事件被如期执行

点击发送消息,MFC窗体中的cmd 被修改成了hello world

6、MFC窗体接受copydata 消息代码

头文件定义消息

 afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
OnCopyData 消息接收代码如下:
BOOL CMFCApplication1Dlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{USES_CONVERSION;switch (pCopyDataStruct->dwData){case 98:break;case 99:{char * wname = (char*)pCopyDataStruct->lpData;m_windowname = A2W(wname);break;}case 100:{char * d = (char*)pCopyDataStruct->lpData;CWnd *wnd = GetDlgItem(IDC_S_SHOW);wnd->SetWindowTextW(A2W(d));break;}default:{break;}}return CDialogEx::OnCopyData(pWnd, pCopyDataStruct);
}

很好用吧,免去了很多麻烦的事情。
这里下载源代码

c# 与 c++ 界面同框终极技巧相关推荐

  1. 计算机任务栏的作用,win7任务栏常用终极技巧小结(以备不时之需)

    win7任务栏常用终极技巧小结(以备不时之需) 发布时间:2014-10-10 15:25:31   作者:佚名   我要评论 在win7系统下的任务栏,遇到一些问题是无从下手,下面小编给大家讲解下一 ...

  2. 画图现代计算机系统,教程方法;Win10新惊喜:经典画图界面完全现代化电脑技巧-琪琪词资源网...

    琪琪词资源网-教程方法;Win10新惊喜:经典画图界面完全现代化电脑技巧,以下是给大家带来的教程方法;Win10新惊喜:经典画图界面完全现代化,大家可以了解一下哦! < art_desc mt1 ...

  3. jQuery操作复选框checkbox技巧总结 ---- 设置选中、取消选中、获取被选中的值、判断是否选中等

    jQuery操作复选框checkbox技巧总结 --- 设置选中.取消选中.获取被选中的值.判断是否选中等 一.checked属性定义 先了解下input标签的checked属性: 1.HTML &l ...

  4. w10 计算机配置管理模板,让Win10系统界面回归朴实的技巧

    Win10界面高端华丽,这是很多人喜欢Win10的原因.但是还是有一部分人不喜欢太绚丽的页面效果,他们更喜欢原来的朴素.本文就来教大家两个方法让Win10界面回归朴实. 如果想回归"朴实&q ...

  5. 女孩教你追女孩终极技巧

    女孩教你追女孩终极技巧 老端注:本文作者是一位女生,具体名字已不可考,最初发表在某个论坛里.从一位女生的角度来教你如何去追女生,可以让你少走很多弯路,但正因为是女孩所写,所以有一定的局限性. ---- ...

  6. Allegro 从导入dxf文件中绘制outline板框的技巧

    Allegro 从导入dxf文件中绘制outline板框的技巧 首先从导入的dxf文件里单独copy板框出来 然后将板框dxf 层转化成outline层 菜单shape–compose shape ( ...

  7. 好的用户界面-界面设计的一些技巧

    效率工具传送门 推荐20套实战源码 程序员你可以考虑安装的15款谷歌插件 99%的人不知道搜索引擎的6个技巧 12款好用的Visual Studio插件,最后一款良心推荐 如此有用的文章我已记不得是什 ...

  8. win7计算机任务栏过长,win7任务栏终极技巧解说

    21世纪,不管是学生还是上班族,和我们天天打交道的是计算机.相信对一些电脑高手来说,摆弄任务栏只不过是小case,可对于部分菜鸟用户来说,碰到任务栏中出现的种种问题时却是"丈二和尚--摸不着 ...

  9. 73个word使用终极技巧

    1.问:Word里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同? 答:分节,每节可以设置不同的页眉.文件--页面设置--版式--页眉和页脚--首页不同 2.问:请问Word中怎样让每一章用 ...

最新文章

  1. MVC与单元测试实践之健身网站(八)-统计分析
  2. Wind River颁布车用信息文娱行使Linux平台
  3. java淘淘商城_淘淘商城-张志君分布式电商视频教程 下载
  4. 区块链如何解决电商供应的问题?
  5. linux vga 分辨率低,通过 VGA 接口连接显示器时分辨率不正确
  6. 计算机技术在学前教育应用与搜索,信息技术在学前教育教学活动中的应用原稿(资料4)...
  7. Ubuntu 20.04 从零开始安装MySQL 8.0并重置root密码
  8. Atom 编辑器的语法导航
  9. 拂去风尘回家的风景最美
  10. mysql增加字段 first_MySQL教程41-MySQL数据表添加字段
  11. Python爬取的微信好友信息里我看到了自律 | CSDN博文精选
  12. 诺基亚智能手机内存不足等问题的解决
  13. java jtextarea边框_JTextArea在java swing中的边框
  14. 下载较旧版本的VS visual studio
  15. 领悟《信号与系统》之 采样定理
  16. 【LeetCode】51和52.N皇后
  17. 数位dp入门题 洛谷P2657 [SCOI2009] windy 数
  18. vue3项目ts文件引入LodopFuncs.js打印控件
  19. Spring cloud使用ELK配置与使用详解之elasticsearch
  20. 这科学的段子不太科学啊

热门文章

  1. SpringBoot集成RabbitMQ消息队列搭建与ACK消息确认入门
  2. 在html表格中怎么创建下拉列表,在html网页中如何做个下拉列表?下拉列表的方法有哪几种?...
  3. python如何读取文本_python怎么读取文本文件
  4. 逃税被罚13.4亿的薇娅将于3月复出?
  5. 同程旅行春节旅行数据:冬奥会带火冰雪游 90、00后预订占比过半
  6. 鸿蒙系统即将发布,华为鸿蒙商标获转让
  7. 超70家影视传媒单位联合500余位艺人倡议:立即清理未经授权短视频
  8. 高德车道级导航已上线8城 新增支持小米11 Pro
  9. 芯片短缺蔓延至手机市场:骁龙888短缺 三星中低端机型生产受阻
  10. iPhone 13有搞头,经典功能或将回归!