IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Windows桌面平台开发 - 体会与苹果开发的几点差异 -> 正文阅读

[C++知识库]Windows桌面平台开发 - 体会与苹果开发的几点差异

这一段时间,闲来无事,尝试了Windows平台开发,已经成功将三个macOS的应用,转换为MFC应用,并在Microsoft Store上线。

两者基本上都是通用的,除了与界面有关的代码,无法使用以外,其余代码,两者之间的转换代码修改量并不是很大。下面简单说说,个人体会到的两个平台开发之间的几点差异。

我的开发环境
苹果开发,macOS系统,Xcode,基于xib的应用,Objective C语言。简称为苹果开发或ObjC。
Windows开发,Windows 10, VS2019,MFC基于对话框的应用,C++。简称为MFC。

(1)用户界面
苹果开发比较方便,感觉个人开发者更容易把用户界面做的美观一些。控件也好用一些,贴图也更方便。比如,按钮,可以很方便的贴图,图片也没有尺寸要求,无论多大的图,都可以作为按钮的背景图片,无需调整图片尺寸。可以随时动态创建一个按钮或删除一个按钮。比MFC用CDC画出一个按钮要方便很多,画出来的按钮,不能直接响应用户点击,需要判断鼠标点击位置。MFC对话框中的按钮控件,我没有找到动态创建的方法。不得已,要么一个一个画出来,要么就添加控件,一个一个添加变量,添加响应。

尽管我已经很努力了,也很难将MFC的App的界面做的像macOS的App一样好看。只能尽量接近,当然,苹果开发,我更注重界面的美观,而Windows开发,我首先要解决的问题是功能的实现,尽快完成App的功能。

有关用户界面的代码,两者完全没有通用性,全部需要重写。因为macOS做的时间长一点,个人感觉对界面的把控更自如一点。而Windows开发几乎没有经验,在不同屏幕尺寸的适配方面没敢进行大胆的尝试,总担心会出问题。

另外,在界面控件的自适应调整方面,Xcode的xib做的非常精准,比如,只需要设置属性,不用写任何代码,界面上控件,就完全可以自动适应主界面的变化,移动的位置完全符合自己的预想,不用担心会移动到出乎意料的位置。

而MFC,似乎也有自适应调整控件位置的功能,但总是出现自己无法把握的移动,我试了各种属性设置,都没有看到控件移动到预想的位置,当然,我目前也不是很熟悉这些属性。

还有,MFC的对话框,似乎没有设置尺寸的属性,仅有一个标尺,但只是大概的尺寸,无法给控件精确定位,自然没有办法进行自适应对话框尺寸变化的精确位置移动。

而苹果开发对View的尺寸,控件的定位调整非常方便,十分精确。

鉴于上述原因,在App界面方面,我采用了保守的方案,固定窗口大小。
为了减少界面代码量,界面限定为两种尺寸,一种是860X660,用于笔记本或需要小尺寸窗口的情况。另一种是1200x860 ,选这个尺寸没有什么特殊的,我27寸的显示器,感觉这个尺寸差不多够用。

虽然这种方案屏幕利用率不高,但我感觉可以把握,不至于翻车。假如采用全屏适配方案或自动适应窗口大小的方案,万一出现意外的控件位移,我无法承受这样的代码修改量。

按照固定尺寸,我可以使用具体的数字,来精确定位每一个控件,或精准画出每一个图片,虽然麻烦一点,但我确定不会翻车,一次写完以后,不需要再修改,而且,同类App也可以代码通用。

在界面方面,苹果还提供了一个custom view,我很喜欢用custom view加subview来实现不同的界面,用动态添加、删除或隐藏、显示等方法来控制。

MFC只能用dialog,没有提供view这样的控件,转换前,需要把所有的界面view和subview一起先设计好对应的dialog。

总体感觉,苹果在界面方面,开发者更轻松一些。

我转换这些App的过程,一般都是先做界面部分,做完界面,代码转换,就简单了。

(2)代码差异

因为转换代码仅仅局限于自己的几个App,也只能谈谈我遇到的大的差异,小的差异没有什么影响,比如,在MFC,我使用CString,而苹果开发,使用NSString,这两者没有本质的区别,直接用就行。

? ? ?a. 苹果开发中NSMutableArray
? ? ?NSMutableArray非常好用,感觉可以适用任何对象,操作很方便。MFC,好像没有找到对应的类型。
? ? ? ? 字符串类型的有:CStringArray,这个只适应字符串,比如结构体就不能用了。
? ? ? ? 好在我大部分使用的NSMutableArray,操作对象都是字符串类型,转换起来没什么大的差异。但在一个App的转换过程中,需要对数据结构体进行转换,由于MFC没有类似NSMutableArray的变量类型,只好用一维数组来处理结构体数组a[],很麻烦,基本相当于重写代码了。
? ? ?b. 苹果开发中的延迟执行
? ? ? ? ?如果需要延迟执行一段代码,苹果用:[self performSelector:@selector(theMethod:) withObject:@"aaa" afterDelay:5.0];
? ? ? ? ?但MFC简单用Sleep就能解决问题,我很喜欢用Sleep。记得我最早做iOS开发的时候,对ObjectiveC没有Sleep,而耿耿于怀。
? ? ? ? ?苹果的延迟运行方法也不是很精确,如果多个地方运行延迟执行,有可能出现错乱的情况,比如,计划早停止的,却比计划晚停止的,延迟的更多,造成意想不到的运行结果。而Sleep个人感觉更好用。
? ? ?c. dialog.DoModel
? ? ? ? ?MFC的对话框一旦模态弹出,后续代码执行将停止,比如:
? ? ? ? ?dlg.DoModel();
? ? ? ? ?a = 0;
? ? ? ? ?当弹出对话框时,a = 0;这个语句,需要等对话框关闭以后再执行。而苹果好像没有这个概念,弹出对话框时,a = 0;也同时顺序执行了。
? ? ? ? ?这也是我最早做iOS开发的时候发现的区别,当时调试结果总是不对,跟进去以后才发现,弹出对话框后,?a已经等于0了,如果对话框需要执行另外的代码,那么a将是以0值被使用。而MFC的话,是执行完对话框的代码后,a才赋值为0。
? ? ? ? ?这个区别是要注意的,这次从苹果开发转Windows开发,在这里我比较注意,提前对代码进行了位置调整处理,没有出现什么异常问题。
? ? ? ? ?但是,在代码执行顺序方面,我又发现了一个重大的区别。
? ? ?d. 代码执行顺序
? ? ? ? ?在苹果开发时,在一个过程中,我经常会这样写:
? ? ? ?-(void)dosomething?
? ? ? ?{?
? ? ? ? ? ? ?if ( a == 1)?
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ?performSomeCodeX();
? ? ? ? ? ? }
? ? ? ? ? ? if ( a == 2)?
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ?performSomeCodeXX();
? ? ? ? ? ? }
? ? ? ? ? ?if ( a == 3)?
? ? ? ? ? ?{
? ? ? ? ? ? ? ?performSomeCodeXXX();
? ? ? ? ? ?}
? ? ? ?}
? ? ? ? 偶尔也会写成这样:
? ? ? ? -(void)dosomething?
? ? ? ?{?
? ? ? ? ? ? ?if ( a == 1)?
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ?performSomeCodeX();
? ? ? ? ? ? }
? ? ? ? ? ? else if ( a == 2)?
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ?performSomeCodeXX();
? ? ? ? ? ? }
? ? ? ? ? ?else if ( a == 3)?
? ? ? ? ? ?{
? ? ? ? ? ? ? ?performSomeCodeXXX();
? ? ? ? ? ?}
? ? ? ?}
? ? ? ? 但大部分代码都会写成前面的形式,在ObjC里从来没有出现过问题,在使用dosomething之前,a值只能是1,2或3,根据a值会执行不同的代码。
? ? ? ? 但在MFC里,这两者存在重大的区别,至少我目前感觉,这两者在代码执行顺序上,有重大的区别。
? ? ? ? 苹果的执行顺序,比如a = 1; 那么执行performSomeCodeX(); 此后,不管a值是否变化,不再执行其他代码,也即performSomeCodeXX()和performSomeCodeXXX()不会被执行。也就是说,一旦进入dosomething,会先把dosomething的所有代码执行完,然后,才执行performSomeCodeX();
? ? ? ? 但在MFC里是这样执行的,a = 1,先执行performSomeCodeX(); 执行完后,它会继续顺序执行:
? ? ? ? if ( a == 2)?
? ? ? ? {
? ? ? ? ? ? ?performSomeCodeXX();
? ? ? ?}
? ? ? if ( a == 3)?
? ? ? {
? ? ? ? ? ?performSomeCodeXXX();
? ? ? }
? ? ? 如果在执行performSomeCodeX()后,修改了a值,比如 a = 2 或 3,那么会执行performSomeCodeXX()或performSomeCodeXXX()
? ? ? 这是我在运行一个App时发现的情况,因为我始终无法得到预想的结果,跟进去才发现,a修改以后,它又继续执行a = ?2 或 3的代码了。
? ? ? 将代码修改为if else 的写法后,才得到正确的结果。这个问题困扰了我好几天的时间,因为根本就没想到,代码会出这样的问题。
? ? ? e. debug的差异
? ? ? 转换代码我很少设断点调试,但出现预想不到的结果后,还是需要设置断点的,苹果的Xcode有一个run to cursor的功能,可以直接运行到光标处。但在MFC没找到这个?有吗?
? ? ? f. 字符串分割
? ? ? 总体而言,字符串处理,MFC更方便一点,比如字符串想加,MFC直接用+就可以,str = str1+str2; 就可以,而ObjC就需要写成stringByAppendString,这个其实也没有什么,用查找替换,很快就转换了。但字符串分割,苹果提供了一个方法,
? ? ? NSArray *Arr = [str componentsSeparatedByString:@","];
? ? ? MFC里没有找到,搜了一下,基本都是自己写的。参考网上找到的方法,我自己也写了一个,可以对单字符和字符串进行分割。
? ? ? /*
? ? ? ? ?适用多字符串和单字符串分割
? ? ? ? ?用法:
? ? ? ? ?待分割字符串 inputStr
? ? ? ? ?分割字符串 strSplit = _T("a") 或 _T("abcdefg")
? ? ? ? ?分割后的字符串保存数组 strArray
? ? */
? ? ? void CMFCSplitDlg::Split(CString inputStr, CString strSplit,CStringArray& strArray)
? ? ?{
? ? ? ? ? ? strArray.RemoveAll();

? ? ? ? ? ? CString strLeft;
? ? ? ? ? ? CString strTemp = inputStr;
? ? ? ? ? ? ?int iIndex = 0;
? ? ? ? ? ? ?int len = strSplit.GetLength();
? ? ? ? ? ? ?while (true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? iIndex = strTemp.Find(strSplit);
? ? ? ? ? ? ? ? ? if (iIndex >= 0)
? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ?strLeft = strTemp.Left(iIndex);
? ? ? ? ? ? ? ? ? ? ? ?strArray.Add(strTemp.Left(iIndex));
? ? ? ? ? ? ? ? ? ? ? ?strTemp = strTemp.Right(strTemp.GetLength() - iIndex - len);
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ?else
? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? //加入最后一个
? ? ? ? ? ? ? ? ? ? ? ? strArray.Add(strTemp);
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? }

? ? ? }
? ? ? 这个方法使用上没有任何问题,无论是单字符分割还是字符串分割都好用。
? ? ??
? ? ?(3)成本投入
? ? ? ?苹果开发,如果算硬件成本的话,苹果开发或许投入更大一点,苹果电脑相对比较贵一些,当然,好像也有用黑苹果开发的,不过,我没用过,不好说怎么样。Windows电脑恐怕不算投入,就算不做开发,也需要用到电脑。
? ? ? ?如果排除硬件,只算软成本的话,比较一下。
? ? ? ?苹果开发者账号,每年688元,每年都需要续费。
? ? ? ?Windows开发账号,一次性127元?具体数字记不清了,应该不超过130元。
? ? ? ?但苹果开发者账号,包含有上架需要的签名证书,自己到网页制作就行,无需个人单独购买。
? ? ? 而Windows开发账号不提供签名证书,我个人感觉不签名应该上不了线,搜了一下,没找到不买证书上线的方法,虽然不能确认是不是可以省下这笔花费,但我还是花钱买了一个代码签名证书。
? ? ? 证书价格不一,贵的大几千,我买了一个我找到的最便宜的,优惠后不到1000元,一年有效期。一年以后,需要升级App或提交新的App,恐怕需要重新购买证书。
? ? ? 所以,相对而言,苹果开发成本反而更低一些。
? ? ? 当然,还有一点重要的区别,苹果的账号,一旦不续费,你名下所有App都会被下架的。而Windows开发,一旦上线,应该没有下架的问题。
? ? ? (需要排除其他因素,比如制裁。)

? ? ?(4) 收入差异
? ? ? 与苹果电脑版一样,我的Windows App也以收费应用为主,不打算做免费应用。另外,原本也有打算随时调整价格的想法,可是通过上线的应用来看,微软商店的App,不能调整价格,一旦上线,任何东西都变成只读状态,无法修改,要更改必须提交更新版本。
? ? ? 这与苹果商店有区别,原来苹果很宽松,后来越来越严,能改的东西很少,但在价格方面,苹果一直是允许开发者随时修改,改免费,收费,涨价或降价都随意。

? ? ? 关于收入差异,这个目前不好说,毕竟刚刚上线3个应用,两个以国内用户为主,目前销售为0,(更新一下数据,昨天2022-03-12周六,看到中国区也已经有销售了。)但后面上线的以国外用户为主的应用,已经有销售了。
? ? ? 如果以这一个星期来统计的话,同样一个应用,苹果商店的销量比Windows的销量要差一点。当然,面向国内用户的两个App,苹果商店国内用户的购买量,比Windows就多不少。

? ? (5)心情差异
? ? ? 做iOS开发是当时冲动和多年心愿相结合的结果,后来自然加入macOS开发,差异小到可以忽略。有空时又搞了一阵安卓,投入了25美元注册账号,花了一些时间和精力,连一个安卓手机都没有,安卓不需要真机测试。现在苹果也不需要真机了,早些时候,没有苹果手机,无法打包上传。现在做Windows开发,算不上冲动,应该是一种情怀。
? ? ? 我上学时就有学习编程的想法,可一直没有实际写过什么代码。后来,工作上有段时间有空闲,在一个同事的指导下,开始学习Delphi6.0编程,自己想了一个自己爱好的工程,坚持了一年半时间,完成了。后来转为VC++6.0的工程,不过好多功能没实现,相当于只是一个简化版本。再后来,就放下了,不过一直在等机会。2010年,买了一个iPhone 8G手机,在Windows电脑上打开iTunes时,瞬间就决心进入iOS开发,目的也就是要把我原来写的Delphi工程转换为iOS工程,这事做成了。此后一直没放弃,坚持iOS开发至今。现在大概也是想完成当时的心愿,把当时的简化版变成完整版,一直有这个心愿,但只是没有机会调整心情再次进入写Windows代码的状态,和一个发布的平台,现在机缘巧合就做上了,点开Microsoft Store图标的那一刻,虽然没有当年点开iTunes时心情那么冲动、急迫,但也产生了浓厚的兴趣。把最早的那个代码,变成Windows平台上的App,放在上面就OK。
? ? ??
?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:33:09  更:2022-03-13 21:34:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:43:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码