MFC与WinForm对比学习:简单介绍

MFC是微软提供的一个C++ UI类库,我觉得它最大的一个好处是提供了一些控件给你用,使你可以方便的弄个漂亮的UI界面出来.而UI这玩艺可重要了啊,用户觉得一个软件产品好不好用,实际上很大程度是看UI设计的好不好,一是漂亮不,二是用起来方便不.如果用win32 API去搞界面麻烦死人了.当然MFC还提供了其他蛮多类给你用.而WinForm是C#中针对桌面应用程序提供的UI类库.针对web的有WebForm,两者区别不是太大,那些控件用起来差不多.WinForm相对MFC而言提供了更多的控件,控件的功能更强大,而我们使用起来比MFC更方便.用习惯了WinForm再来用MFC可是个痛苦的事啊.要是反过来你就会觉得爽歪歪了啊.另外C# 3.0(说错了,应该是C#2.0, .NET Framework 3.0)中还新出个啥WPF,那比WinForm产生的界面更漂亮啊.C#3.0中的Silverlight也更花哨.不过用起来要麻烦一点.

对新技术的一点看法

很多人都说MFC迟早要被淘汰的,微软把精力主要放C#上去了,没花啥功夫去好好整MFC了.MFC被淘汰肯定是迟早的事,但可能也要经过很长一段时间,因为企业做软件开发时不会太追赶时髦,特别是是做独立的软件产品,而不是给别人做项目的公司.现在各式各样的软件产品都比较流行过一段时间就整个新版本出来.是在很多年前的代码中增加一些新功能,修复一些bug.所以之前很多用MFC做的软件产品如果还继续存在,不断升级的话肯定会继承用MFC,不可能完全不用MFC,全部改写掉的.

我们公司很多产品都是最初用的Delphi或者C++,C++中自然也用到了MFC,那应该是一二十年前的事了,那会还没有Java,C#.然后先是出现了Java,后面又有C#.于是公司很多原有的产品混合使用Delphi和C#,或者C++和C#.还有些甚至把C++,C#,Delphi三个整到一起用.而后面新搞的产品桌面应用程序一般都用C#了,有些对性能有要求的地方会混合用到一点点C++或汇编,Web类型的就用Java,Python,PHP这些了.

我觉得现在的编程语言多的吓人,据说总共有上千种,而且每种语言不断的有新技术出来,有各种新类库,新框架.很容易让人搞得眼花缭乱的啊.这也想学那也想学,到头来啥都没学好.如果有自己喜欢的编程语言,选择一门好好学好就挺不错,如果实在没找到啥喜欢的,工作中需要用到的编程语言和其他相关技术就精中集力去好好学呗.

另外你学一门技术也不能太功利嘛,不能仅是因为它有用处就学.你也可以从学一些技术中体会到思维的乐趣.体会人家设计某个技术中的美妙的思想.如果你了解计算机底层的东西多点后会发现很多五花八门的新技术背后的原理其实差不多.所以多花点时间了解底层的知识不一定马上带来实际的用处.但可以潜在的带来很多好处.让你感受到思维的乐趣.有句很经典的话叫你应该了解真相,真相使你自由.了解计算机的底层知识,就是了解真相.不然很多技术层层封装使你看不到背后的真相.使你有点不知所措.思想上有很大的束缚,限制在很多条条框框中,只知道要这么做那么做,但为啥这样设计呢?不知道啊.当你了解了背后的原理,了解了真相后心里就会有种释然,顿悟的感觉.了解真相使你思想更自由,使你更容易享受到思维带来的乐趣.

MFC WinForm简单对比

MFC中的Dialog

我们知道所谓类库那顾名思义,像一个大仓库,里面摆着一堆堆的类让你去拿来用.MFC中的图形控件也就是一个个的类,只不过VS这个开发环境让你用控件比较方便,用鼠标一拖就OK了,而实际上拖那个控件的时候VS给你自动生成一些代码.你也完全可以不去拖控件,而是直接写代码.

MFC中很多时候是先添加一个对话框(Dialog),然后往里面添加其他小控件.所有的控件都是一个个的类.那我们写的代码跟控件那些代码是怎么关联起来的啊.比如一个Dialog是怎么和一个类一一对应起来的啊.很简单,创建一个类,然后继承自类Dialog就行.举个例子

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

enum { IDD = IDD_ABOUTBOX };

}

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{ }

假如你在resource view中添加一个Diaglog,ID为IDD_ABOUTBOX,也就是对话框的名字.IDD_ABOUTBOX实际上是用宏定义的一个数字.然后你创建一个类CAboutDlg继承类CDialog.但此时这个类跟你添加的对话框还是没有关联起来.于是先定义一个枚举类型,IDD并把对话框的名字赋值给它.然后在类的构造函数中调用父类CDialog的构造函数,把开始新创建的对话框ID做为参数传进去.实际上你也可以不用枚举,直接把IDD_ABOUTBOX传到构造函数中.于是类和对话框关联起来了.实际上说关联也不准确.应用是你新建一个对话框时默认产生一些数据,此时相当于把那些数据拷贝给类CAboutDlg了.至于你创建的对话框产生的代码都在资源文件中了.你一般不需要去关注.

此时你要让对话框显示就实例化类CAboutDlg,然后调用相关的函数显示和关闭了.

那有时对话框中有文本框或其他一些控件.当用户输入啥东东或点了啥我们怎么获取那些信息啊.这时我们得在类CAboutDlog中定义一些成员变量,比如你可以定义一个CButton类型的变量,然后通过宏让它与对话框上的某个按钮关联起来.至于具体怎么关联起来的不确定,估计是用引用吧.

C# Form

在C#的WinForm中,就没有Diaglog这个概念了,对应的了是Form.原理也差不多.不过不同的是当你Add一个Form时VS默认给生你一个类

比如类Form1,它继承自类Form

public partial class Form1 : Form

{

}

你看到上面有个C++中没有关键字partial.这是C#一个叫分部类的概念,就是说可以把一个类定义在两个文件甚至多个文件中.C#中没有头文件的概念,分部类跟头文件的概念有一点类似.像我们不是可以把C++中一个类放在一个.h文件和.cpp文件中嘛.

C#中添加一个Form后生成一个类Form1.但这个类保存在两个文件中.Form1.cs , Form1.Designer.cs.我们平时写代码只要关注文件Form1.cs中的内容就可了.

Form1.Designer.cs中的代码都是跟UI相关的,由VS自动生成.但你通过一个Form的属性页面去设置一些参数时,它里面的代码会自动更新,当然你也可以手动去改里面的代码,但不推荐这样做.在C++中所有跟UI相关自动生成的代码都跑一个 资源文件里去了.而C#中每一个页面的所有代码都单独分开的.都在Designer.cs文件中.觉得这样条理更清晰.看着更爽了啊.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值