-
2021-07-14 21:32:28
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); }
很好用吧,免去了很多麻烦的事情。
这里下载源代码更多相关内容 -
keil C/C++ 界面配置文件
2016-05-07 19:36:37根据sublime text3 界面为模板,配置keil界面。 使用方法: 下载文件,进入keil安装目录,使用下载的文件替换安装目录中的global.prop,然后就可以正常使用的 -
C++界面开发实例
2018-03-20 15:28:40C++界面开发实例!特别适合初学者和有一点基础的编程学习者! -
qmlDesign1_C++数据qml_qtdesigner_c++界面切换_qml数据_qml
2021-09-11 10:11:31界面切换,C++与qml数据通信,c++的数据注册到qml中,在qml显示 -
c++界面编程(界面设计必备)
2011-05-22 22:26:21c++界面编程(界面设计必备)c++界面编程(界面设计必备)c++界面编程(界面设计必备)c++界面编程(界面设计必备) -
C++界面设计
2012-09-02 14:46:24一实例介绍如何实现三个独立的分离窗口:监视窗口,控制窗口和动画窗口,并以图1中的进水和温度值传递为例,介绍如何实现控制功能和不同窗口间的数据共享,并介绍实现无闪烁动画的方法。 -
C++界面库
2019-08-03 11:23:23...Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自己写的界面库,开始对于C++软件界面美化有了一点点的心得。不敢藏私,希望和一些新手朋友们分享交流。 一...刚开始用C++做界面的时候,根本不知道怎么用简陋的MFC控件做出比较美观的界面,后来就开始逐渐接触到BCG Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自己写的界面库,开始对于C++软件界面美化有了一点点的心得。不敢藏私,希望和一些新手朋友们分享交流。
一. 开源C++界面库
1.RingSdk
Ringsdk是CSDN上一个前辈自己写的界面库,这个界面库很轻而易举实现QQ2009的界面效果。链接见
http://blog.csdn.net/ringphone/article/details/2911244 貌似Ringsdk和MFC无法进行交互,但是 RingSdk其中有很多的图形处理的代码都非常有参考价值。
2.redui的官方网站http://www.redui.org 已经打不开了。官方QQ群是 40729296
CSDN地址是
http://blog.csdn.net/jameshooo/article/details/6677272这是官方的说明
REDUI,又名REDirectUI,全称是Rendering Engine for DirectUI,是一款基于XML描述的 DirectUI 渲染引擎,能将“控件”的交互和渲染过程分解成多种独立的要素,包括布局、视觉效果、样式、UI自动化、滤镜、脚本、事件、3D场景、3D模型、通用动画等。通过这些要素的排列组合,可以呈现出各种不同效果的控件,甚至能在XML中直接自定义控件类型。支持2D/3D无缝融合。
• REDUI支持GDI/GDI+/DirectDraw/D3D等渲染方式,并有支持OPENGL/ES的愿望3.Duilib 这个就比较大名鼎鼎了,不用多说了吧。包括华为网盘在内的很多业内企业都在用这个界面库。我用Duilib做了一个小型的界面。贴出来献丑一个。
4.WGI-1.0.7-Demo-Project-for-windows 。。额。。时间太长,忘记了这个代码是什么,姑且先忽略它。
5.cj60lib 这个玩过Gh0st3.6木马的人都熟悉,是一款对MFC进行拓展的界面库
6.金山界面库 这个就不赘述了,可以直接上金山的论坛找源代码和资料
7.skinTK_V0.20 一款类似于Skin++的开源界面库
8.FreeCL_Skin2.3 一款不错的控件库 扩展了常用的MFC控件 。 这个是FreeCL_Skin提供的一个效果实例。
9.GuiLib1.5 一个老外写的界面库 没有用过,没有调查,就没有发言权。大家自行百度。
10.基于3D的界面库 MangoGUI_V0.1.5
MangoGUI是猫仔在DXUT基础上修改得来的一个开源GUI系统。
目前来说基本上继承了DXUT里面绝大多数的功能和改进了使用方式,让DX学习爱好者更容易去使用GUI系统。
如果你也是一位对GUI有兴趣的同学,非常欢迎你一同来参与到MangoGUI的设计当中来!
作者博客11.基于Skia的directui库metalbone
代码托管地址
http://code.google.com/p/metalbone/
官方说明
MetalBone是一个C++ DirectUI库。接口、命名等借鉴Qt,而并非使用Windows风格。
MetalBone的特点是,使用CSS来定制样式(如果没有CSS的话,则什么也不显示,lol)。目前可以使用Direct2D或Google Skia来绘制界面。MetalBone使用的是 WWM协议(基于LGPL)
12.SonicUI2011
效果比较不错的一款皮肤库
作者CSDN地址是
13 基于OpenGl的界面库 beGUI-0.1.3-src
代码托管地址
http://code.google.com/p/begui/
二 未开源或商业界面库
1.Flash4UI
看命名就知道是将Flash嵌入到UI中。
官方网站是 http://www.flash4ui.com/
效果图片
2.bolt 迅雷7界面引擎
迅雷界面引擎,这个用过迅雷下载和迅雷看看的就有体会了,界面的确是做的非常的赞。而且流畅,CPU占用和内存各种都很棒。采用了脚本交互的方式,脚本语言采用了Lua.可惜的是迅雷只开放了接口SDK给个人使用。
3.clayui
百度百科说明 clayui是一个采用纯C++编写的界面框架,可以很方便的移植到各种系统上。现在支持的系统包括android,windows,wince,linux。clayui的特点是能实现各种2D,3D动画,一些WPF,FLEX才能实现的界面效果,通过clayui可以很方便的实现。 clayui的底层渲染支持纯软件渲染,d3d,opengl es硬件加速渲染,您可以根据自身的需求选择合适的渲染方式,使您界面的用户体验达到最佳效果
效果
4.DSkinLite
官方网址 http://www.uieasy.cn/dskinlite/
官方Demo
5.libuiDK
官方说明:LibUIDK是国际上顶尖的专业开发Windows平台下图形用户界面的开发包,也是国内第一款商业的高级界面开发工具。该开发包基于Microsoft的MFC库。使用此开发工具包可轻易把美工制作的精美界面用Visual C++实现,由于LibUIDK采用所见即所得的方式创建产品界面,所以极大的提高了产品的开发速度,并大大增强图形用户界面(GUI)的亲和力。LibUIDK还可以使您的软件轻松具有当今流行的换肤功能,以提高产品的竞争力。
官方网站
http://www.iuishop.com/index.asp
实例
6. SiteUi SkinSE 都有官方网站。就不继续搬砖的工作了。
7.(未开源)上海勇进UIPower
这个比较牛逼。一款界面库就是大几百万的。老总阙海忠还亲自录了20集的界面库相关的视频
这是老阙的视频。
8.炫彩界面库
炫彩界面库貌似是私人开发的一个界面库,可以用C++.c#易语言等来开发。炫彩库的作者貌似是湖北襄阳人哟。
9.魔方界面库MuiLib(Magic UI Library)Windows高级界面开发库是在国内首家免费开源的DuiLib界面开发库基础上经过针对性的扩展而发展起来的,他继承了DuiLib高度自由灵活的特点,并吸收了其他界面库的一些优点,针对Windows层窗口按像素透明技术而重点优化后形成的一个优秀界面开发库,是一个使用纯C++调用Windows API的开发库,无任何其他第三方依赖框架,您可以使用其提供的各种高级控件来创建更加炫酷的用户界面
10 XtremeToolkit
由Codejock 公司出品的一款界面库。应用也是比较广泛的。在2013版的大灰狼远程操控中就采用了这款界面库。
11.Sharpui
代码托管地址 https://github.com/china520/sharpui
Sharpui是居于现在流行的DUI思想的一套界面库,可以方便实现半透明和各种界面效果,采用纯c++实现,分为引擎和控件两个部分,这两个部分采用动态库的形式提供,引擎部分处理了事件、资源、渲染、控制逻辑,同时提供了各种应用层面控件的实现基类,包括:Visual、Element、FrameworkElement、Control、ContentControl、Window、Panel、Popup,这些类封装了基础控件的实现细则,所有用户实现的控件都必须继承自这些类,对于需要呈现的控件必须继承至FrameworkElement。
控件部分提供的所有控件均采用DUI方式实现、分层绘制,实现各种常用的布局控件,可灵活实现界面的自动布局;Sharpui本身所有数据结构采用原生实现,内存自动管理,不依赖于std的任何容器,使得库的使用更加独立、编译更加简单,使用VS任意一个版本编译都可以用在其它版本里,不需要担心由于std版本原因而产生编译问题。以上都是我在工作和个人业余时间收集积累的开源或商业界面库,这些界面库各有各的特色和侧重点,也有不同的换肤思想,如果要用在项目中还是要进行适当的增删整改。
由于个人能力水平见识有限,也有些大神的作品没有被收录其中。表示遗憾。
/**************************************************Witch_Soya***********************************************************/
/**************************************************2013年9月3日15:55:18***********************************************/
-
c++界面编程实例 主要是关于C++界面编程的
2010-11-12 15:23:34C++界面相关的编程 含有源代码 有特别详细的教程 -
很炫的c++界面,完全开源
2011-12-29 20:13:02很炫的c++界面,完全开放源代码,快来看看吧,想学做界面的不要错过哟 -
visual c++ vc漂亮的三方界面库,可以编写非常漂亮的界面.长得跟.NET界面一样
2021-04-10 09:47:04漂亮的三方界面库,可以编写非常漂亮的界面.长得跟.NET界面一样 -
漂亮的C++界面
2017-08-27 11:28:40动画图标,漂亮界面。 -
自控理论实验Qt+C++界面
2019-07-22 22:09:01自控理论实验,C++编写界面,QT平台进行开发。。。。。。。 -
c++界面库demo
2017-05-22 00:52:38界面展示,因为开发环境比较大,不能上传,只上传运行程序。由ogre+mygui组成; 测试了ogre的界面,mygui的界面使用。 -
c++ 界面化编程 CLR
2020-03-13 16:45:40希望能用C#的设计器搭配C++的语法,刚好看到论坛上有实现方法,于是就完成了折腾,以后如果有人说C++只有控制台,就可以很淡定的告诉别人继续深入学习C++就会发现不止有控制台,还有有很方便的界面。 以下是在VS...刚开始找界面化编程实现方法的时候大多推荐的QT和C#,于是去下载了QT和C#来用, 用了一些时候,做了一些比较,有点自己的想法,希望能用C# 的设计器搭配C++的语法,刚好看到论坛上有实现方法,于是就完成了折腾,以后如果有人说C++ 只有控制台,就可以很淡定的告诉别人继续深入学习C++就会发现不止有控制台,还有有很方便的界面。
以下是在VS2019上实现的,和VS2017实现的方法一样
首先要新建一个CLR的空项目
这个项目在单个组件里,不是默认安装的
空项目建完后右键点击 工程名->属性
链接器->系统
子系统:窗口 (/SUBSYSTEM:WINDOWS)
链接器->高级
入口点: Main
别忘了点击应用和确定
接下来到资源管理器
右键 工程名称->添加->新建项
展开 已安装 选择UI ,选择窗体
名称 默认
点击添加,等待完成
添加完成后设计器会显示错误,关闭设计文件,在MyForm.h里面添加一段代码就可以了
注意空间名 要和工程名一样 ,这里创建的不是默认文件名,默认是 Project
#include "MyForm.h"
using namespace CLRTemp;
[STAThread]
void Main(array<String^>^ args)
{
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);MyForm form;
Application::Run(% form);
}到这里全部保存,退出解决方案,重新打开解决方案
这个设计器就是C#的设计器,简单好用,个人觉得比QT的设计器方便
为什么不直接用C# ,并不是C# 不好,是有一些功能在C#上实现起来不如C++灵活
在使用过程中发现编译时有无法解析的问题,原因是少了库文件支持
选择 链接器 输入 附加依赖项 从父级或项目默认设置继承
点击 应用 确定
参考 申佳明哥哥的博文完成 https://blog.csdn.net/ishenjiaming/article/details/92067094?locationNum=5&fps=1
-
C++图形界面设计Qt4-中文版
2018-04-01 10:35:35C++图形界面设计Qt4-中文版.............................. -
C++创建windows 显示exe界面
2019-03-06 15:03:49创建可以显示界面的windows服务 源代码用C++ -
如何解决DEV-C++界面模糊的问题
2020-10-18 19:21:49如何解决DEV-C++界面模糊的问题 右键点击DEV-C++的图标: 再点击它的属性: 点击兼容性: 点击更改高DPI设置: 点击高DPI缩放替代: 选择系统增强: 接下来就可以愉快的用DEV-C++编程了。 ~如有问题与建议... -
C++界面制作
2014-11-13 14:44:20C++界面制作 -
devc++界面调整
2020-06-26 07:55:04求问各位大神,devc++自从手动把下面的编译报错区调整到最小了以后,再拉出来就是这个样子了,应该怎么调整啊? -
Windows C++界面库
2017-02-14 23:31:19记得大一学C语言的时候,觉得黑白窗很无聊,后来在网上找到了EasyX (一个模仿turbo c的图形库)http://www.easyx.cn ,用它写一些贪吃蛇、扫雷这类有图形界面的游戏来练手。 当时学的时候就很好奇为什么调用这些... -
qmlDesign1_C++数据qml_qtdesigner_c++界面切换_qml数据_qml.zip
2021-10-10 09:07:23qmlDesign1_C++数据qml_qtdesigner_c++界面切换_qml数据_qml.zip -
vc制作Visual Studio风格的用户界面窗口.visual c++
2021-02-28 16:26:47vc制作Visual Studio风格的用户界面窗口.visual c++ -
QT编写一个简单的包含输入输出的C++界面程序
2020-05-26 16:40:37双击.ui文件进入设计界面,点击编辑即回到代码界面,电脑图标可以选择debug版本也可以选择Profile、Release版本;三角形是运行,带个虫是调试,锤子是构建; 左边是可以选择需要的东西,如布局(Layout -
Qt c++界面跳转
2019-06-09 21:09:30//跳转界面 this->close();//关闭this指向窗口 // delete this; Dialog1 w1(useredit->text(),&db); w1.show(); w1.exec();//该程序执行完后(对象w1结束),才能执行下面代码 this->show();//... -
Visual C++界面编程技术
2011-11-12 15:15:321.Visual C++界面编程技术 source code, 对初学者来说是不错的选择。 2.本人最近会把硬盘整理,有诸多不错的source code 上传。 -
c++界面编程教程及实例
2016-05-31 11:53:33c++界面编程教程及实例,基于硬件API接口的界面编程工具 -
wxWigets开源C++界面框架
2013-03-20 21:55:31wxWigets一个开源的C++界面框架,跟MFC一样是个界面库框架,可以跨平台。 -
mfc vc c c++ 界面脚本模块绘图
2018-01-31 13:59:19一个脚本对应一个界面 一个脚本对应一个界面 一个脚本对应一个界面 -
C++ 界面设计须知
2017-02-20 17:17:57C++做界面 1. 如果程序的界面不是太复杂,用 SDK 或 MFC 开发都行。 2. 如果程序对界面的美观要求比较高并且改动比较多,用客户端引擎来做比较好,可以参考C#中的WPF编程。 3. 还有现在很多软件都是客户端嵌... -
C++ 界面开发工具推荐
2015-09-19 10:23:08用C++的能界面编程的软件有那些呢?全部举例出来吧。 然后求推荐,选哪个好用,我是业余的自学的兴趣小组的。 据说QT很不错,然后再推荐基本QT的界面编程入门的书吧 我已经有一定编程基础了,高级点的不涉及基础的...