posts - 16,  comments - 81,  trackbacks - 0
        因为笔者是以前是做C#的,对Winform情有独钟,最近想转C++,想把以前的一些Delphi转成c++,MFC我不熟而且用起来相当烦效果又丑,GTK图形库用起来太麻烦,琢磨着研究一下WInform前台,C++做后台的方法,谷歌了一下,没看到什么中国资料,我草,我以前看过的啊,找来找去,找到一篇英文的,写得太纠结,我结合自己使用的经验,重新整理一下,言简意赅,简明易懂。谨供新人参考,老鸟勿拍。
      
  1. 首先打开你的VS2005
  2. 依次点击菜单栏的文件-->新建-->项目
  3. 在左边的语言列表选里,选择C++分支下的CLR,然后在右边单击“CLR 空项目”
  4. 在名称框里输入Exercise2:
  5. 点击“OK”,创建项目成功。
  6. 好了,这只是创建了好了一个托管C++项目,要使用WINFORM,我们要引入相关的.NET组件。
  7. 在vs主界面上依次点击菜单栏的项目-->"引用";
  8. 在弹出的子窗口中选择添加新引用;
  9. 在.NET标签页下选择System,点确定,再点击添加新应用,在.NET标签页下选择System.Window.Forms,然后确定,如图
  10. 都完成后,应该像这样,然后点击确定
  11. 创建一个新的类,点击VS主界面菜单栏的项目-->添加类;
  12. 在弹出的子窗体右边选择C++类,点确定,会出现添加类向导,在类名中输入CExercise,基类中填Form
  13. 然后我们来到自动生成的头文件代码中,添加System和Form的引用,修改后的文件应该如下
  14.  1
     2#pragma once
     3
     4using namespace System;
     5using namespace System::Windows::Forms;
     6
     7public ref class CExercise : public Form
     8{
     9public:
    10    CExercise(void);
    11}
    ;

    然后我们要创建一个主程序来调用这个类。这个大家应该都比我熟的,右击源文件文件夹,点击添加-->新建项,选择CPP文件,代码如下:
  15.  1
     2
     3#include <windows.h>
     4#include "Exercise.h"
     5
     6int APIENTRY WinMain(HINSTANCE hInstance,
     7             HINSTANCE hPrevInstance,
     8             LPSTR lpCmdLine,
     9             int nCmdShow)
    10{
    11    Application::Run(gcnew CExercise());
    12
    13    return 0;
    14}

    含义我不多说了,把那个Cexercise换成你自己别的名字的类就可以运行那个类了,当然了,要注意包含头文件。点击运行看看,一个白白的窗体,对吗,好的,革命成功迈出了坚实的一步。
  16. 下面我们来试着添加一个button按钮,修改Exercise.cpp的代码如下
  17. 1
    2#include "Exercise.h"
    3
    4CExercise::CExercise(void)
    5{
    6    System::Windows::Forms::Button^  button1=gcnew Button;//创建按钮
    7    this->Controls->Add(button1);//把按钮附加到我们的窗体上
    8}

    9

    在运行看看,应该像这样
  18. 然后如果你还想继续给这个按钮添加文字设置尺寸什么的,你可以通过像这样的代码,具体我不说多少,因为选择Winform就是看中快速的控件拖拉功能,都是手写我还不如用GTK
  19. this->button1->Name = L"button1";//设置按钮文字
    this->button1->Size = System::Drawing::Size(7523);//设置按钮尺寸

  20. 好了,下面重点来了,如何像C#一样自由地拖拉控件改属性呢,我们右击项目,选择添加-->新建项。
  21. 在弹出的子窗体右边选择Windows窗体,输入一个名字,比如“HelloWorld”,点击确定
  22. 然后我们就欣喜的发现,哇,又回到Winform拖拉控件的时代啦,是的,没错,而且我们可以以C++写后台。没用过c#的朋友请在界面上找找工具箱,实在没找到请依次点击主窗体上菜单栏的视图-->工具箱,然后从工具箱里找到一个button控件拖动到主窗体上。
  23. 之后双击这个button,会自动添加一个button的单击事件,我们希望单击的时候弹出一个“我是傻逼”的消息框,代码如下:
  24. 1    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    2                 //MessageBox.Show(this,"wocao");//C#格式的调用方法是不行的
    3                 MessageBox::Show(this,"我是傻逼");//这才是正确的
    4         }

    5    };
    6}

  25. 第一个参数是父窗体,第二个参数是消息框的内容。细心的同学发现了,这里和C#不太一样,是的,如果你按C#的写法:Messsage.Show(...),这样程序是没法通过编译的,毕竟是两种语言嘛。
  26. 好了,我们回到主程序入口那里,修改Exercise()为HelloWorld(),运行看看,出错了!!没错,你还得添加头文件,添加引用,真是麻烦啊,没办法,这儿还没有在C#下的引用添加提示,不知道Clipse下的Cdt有没有这个功能,最终代码如下
     1#include <windows.h>
     2#include "Hello World.h"
     4using namespace WInformCpp;
     5int APIENTRY WinMain(HINSTANCE hInstance,
     6                     HINSTANCE hPrevInstance,
     7                     LPSTR lpCmdLine,
     8                     int nCmdShow)
     9{
    10    Application::Run(gcnew HelloWorld());
    11
    12    return 0;
    13}

    好了,运行一下看看。像这样,那就对了,再深入地使用就不是本贴讨论的范畴了,在C++上,各位都是我的前辈
posted on 2010-12-16 22:23 叫我老王吧 阅读(38601) 评论(27)  编辑 收藏 引用 所属分类: C++

FeedBack:
# re: c++用WinForm做界面的实现
2010-12-17 10:26 | waiting4you
google一下"C++/CLI,WinForm",就能找到不少关于“C++与WinForm”的文章了。
楼主的这篇文件却是我见过的最简洁,最容易上手的一篇,支持!尤其是弹出信息很给力!!!  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-17 15:17 | crossgate
刚在vs 2010里,用非托管C++项目,也成功实现了上述功能。
  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-17 15:58 | Skill
虽然那个对话框上弹出的字不登大雅之堂,但文章还是蛮基础的,谢谢了  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-17 16:49 | 叫我老王吧
谢谢您的支持@waiting4you
  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-17 16:49 | 叫我老王吧
@crossgate
求细节
  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-17 16:50 | 叫我老王吧
@Skill
您的支持是我最大的动力,弹出信息神马的是个人风格,没法改  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-17 19:20 | right
C++/cli这东西没多少人用的,新语法和新关键字实在太令人反胃了。  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-17 19:36 | 叫我老王吧
@right
正因为用的人少,文档少,所以才要写出来,哪怕只能帮到一两个人也是好的,学冷门东西时的那个孤独无助感我太难忘了  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-18 11:17 | crossgate
@叫我老王吧
项目可以不是clr项目,比如win32 空项目就可以。也就是非托管的VC项目。
然后在项目属性的general里,"Common Language Runtime Support"里选中“Common Language Runtime Support(/clr)”。这样就可以继续贴子里的操作,引用.net库了。后续一样。如果想用到.net库的winform,还是得声明托管指针,也就是必须用^而不是*来表示指针。相当于混合编程,主体是C++,搭配C++.net代码来做界面。  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-18 14:33 | 唐焱
其实MFC也是这个效果,你没有发现这个按钮都很丑么,win7上的按钮可不是这样的!  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-19 23:26 | 未注册
我也是C#转C++,用C++开发桌面窗口程序就是为了丢开那沉重的framework。
你这个效果MFC做出来的是一样的。  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-19 23:37 | 叫我老王吧
@唐焱@未注册
首先感谢你们能花时间看完我这篇烂帖
按钮样式你可以直接在属性里设定背景图片,换到MFC这又得做刷子了吧。.NET的强大并非是他默认的样式有多好看,否则DirectUI也不会卖那么贵,而是他的方便快捷,多种多样个性化的控件而不是MFC数来数去还不到VCL的一半,说句不正经的话,至少他不用给窗体换个背景色还要花好几行代码做刷子。
最好,即使你们再怎么讨厌.NET,喜欢MFC,总有一些VCL或者GTK过来的人不更习惯控件拖拉而不是把菜单和用户区分开做不是吗?每个人都有自己选择的自由  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-19 23:39 | 叫我老王吧
@crossgate
你把项目属性里德CLR托管选上了,他不就是已经变成了CLR项目了。  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-20 13:54 | ABC
为什么不考虑使用QT呢?  回复  更多评论
  
# re: c++用WinForm做界面的实现
2010-12-20 13:57 | 叫我老王吧
@ABC
有了GTK就不考虑QT了  回复  更多评论
  
# re: c++用WinForm做界面的实现
2011-02-23 00:14 | fei
为什么不直接在VC++里新建windows form 的工程呢.... 我以为是讲界面调用clr的程序..  回复  更多评论
  
# re: c++用WinForm做界面的实现
2011-02-23 00:20 | 叫我老王吧
@fei
哎呀,纯属是我不知道有这个功能,我无知了  回复  更多评论
  
# re: c++用WinForm做界面的实现
2012-11-17 15:05 | 村雨Hectic
http://www.t-hart.org/vs2012/
这个补丁可以让vs2012增加vs2008那样可以直接创建windows form工程  回复  更多评论
  
# re: c++用WinForm做界面的实现
2013-09-19 11:07 | fq
# re: c++用WinForm做界面的实现
2013-12-23 16:00 | lw
项目属性-》配置属性-》连接器-》系统-》-》子系统(窗口:(subsystem:windows))。
项目属性-》配置属性-》连接器-》系统-》-》高级 (入口:main)  回复  更多评论
  
# re: c++用WinForm做界面的实现[未登录]
2014-05-05 15:55 | cl
这个挺简单明了的,就是第33点里面using namespace WInformCpp;
中的WinformCpp是哪里来的呢?  回复  更多评论
  
# re: c++用WinForm做界面的实现
2014-07-14 11:38 | AlvenBlack
第33点里面using namespace WInformCpp;
中的WinformCpp报错a namespace with this name does not exist?  回复  更多评论
  
# re: c++用WinForm做界面的实现[未登录]
2014-07-17 13:28 | 菜鸟
楼主写的很实用,也很详细,只是有一点点没有说,在地33点中的WInformCpp是HelloWord中的命名空间,一般默认生成,我刚开始就没找到,对菜鸟来说还真的不好找啊  回复  更多评论
  
# re: c++用WinForm做界面的实现
2014-12-03 22:11 | hooknn
非常感谢@fei
  回复  更多评论
  
# re: c++用WinForm做界面的实现
2015-04-12 21:35 |
我按你的步骤 怎么操作不成功呢  回复  更多评论
  
# re: c++用WinForm做界面的实现
2015-05-24 10:14 | wenluderen
多谢博主的讲解 , 我在VS2012 测试了

结果不是很好 报错。


1> Exercise.cpp
1>e:\exercise2\exercise2\Exercise.h(9): error C3624: “System::ComponentModel::Component”: 使用此类型需要引用 程序集“System”
1> 在导入类型“System::Windows::Forms::Control ”(从程序集“System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中导入)时发生此诊断。
1> 在导入类型“System::Windows::Forms::ScrollableControl ”(从程序集“System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中导入)时发生此诊断。
1> 在导入类型“System::Windows::Forms::ContainerControl ”(从程序集“System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中导入)时发生此诊断。
1> 在导入类型“System::Windows::Forms::Form ”(从程序集“System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中导入)时发生此诊断。
1>Exercise.cpp(5): fatal error C1903: 无法从以前的错误中恢复;正在停止编译
1> MainGsz.cpp
1>e:\exercise2\exercise2\Exercise.h(9): error C3624: “System::ComponentModel::Component”: 使用此类型需要引用 程序集“System”
1> 在导入类型“System::Windows::Forms::Control ”(从程序集“System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中导入)时发生此诊断。
1> 在导入类型“System::Windows::Forms::ScrollableControl ”(从程序集“System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中导入)时发生此诊断。
1> 在导入类型“System::Windows::Forms::ContainerControl ”(从程序集“System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中导入)时发生此诊断。
1> 在导入类型“System::Windows::Forms::Form ”(从程序集“System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中导入)时发生此诊断。
1> 正在生成代码...
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========
  回复  更多评论
  
# re: c++用WinForm做界面的实现
2015-12-07 10:32 | Taoism
@wenluderen
项目属性, 添加新引用"System", 和文章第11步一样  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2015年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用链接

留言簿(4)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜