我的Win32开发抉择,Delphi老将复出
这两天在开发公司的一个教学软件客户端,因为要考虑到给PHP、平面设计等班的同学使用,为了避免安装.Net Framework、JRE的麻烦(如果把.Net Framework、JRE打包到安装包,也会使得安装包太大),因此没有选择使用.Net、Java开发。
那么接下来就考虑使用C/C++开发了,采用纯Win32开发太累,选用QT、MFC、WxWidgets之类能简化工作,MFC就不提了简直就是一坨翔谁用谁难受,QT开发出的界面太不Native,WxWidgets界面很Native而且类库设计的超好,使用WxWidgets开发程序甚至有时候感觉不到自己在使用C++,使用WxWidgets开发即能用到c++的高运行效率,又能用到.Net/Java一样的超酷类库。但是WxWidgets要考虑到跨多平台,所以调用ActiveX、Com等Windows平台相关特性的时候很困难,而我这个工具就是要有很多调用这些东西,所以只能忍痛放弃WxWidgets了。WxWidgets是开源的,如果有人能把WxWidgets 分支出一个For Windows Only的版本,把Windows平台特性支持提供好了,那么是非常酷的一件事情了。
当然现实是残酷了,必须选择一个更适合的技术了,我想到了我人生第一个深入研究的语言Delphi。Delphi能够开发Win32程序,同时提供的类库也丰富,调用Windows平台特性也非常方便。因此就决定使用Delphi开发了(其实C++Builder也不错)。
和当年的如日中天相比,现在的Delphi已经没落了,使用Delphi的人越来越少,CSDN的Delphi板块上经常是“很长时间没回来了,回来看看”、“再见Delphi,我投奔.net or java去了”、“某某大牛很久没有在Delphi版上出现了”,很悲凉的。而且我感觉很奇怪的是,我10年前就在使用Delphi7,到现在Delphi已经出了DelphiXE4了,而现在使用Delphi的人最多的竟然还是Delphi7。就像现在使用VC开发的最多的还是使用1998年出的VC6。不得不感叹社区氛围的差异。
这次开发我还是选择了DelpihXE,因为高版本的DelphiXE提供了泛型以及更丰富的库,当然还有更好用的开发环境。这次我要分享的就是在DelphiXE中更方便的操作“嵌入资源”的方法。
我开发的这个客户端中需要把一些png图片嵌入到exe中,然后在程序中动态加载png图片,这样可以实现单一exe文件的“绿色版”。到网上查资料,提到的方法都是手动编写.rc文件,然后命令行调用brcc32.exe把.rc编译成.res文件,然后在代码中通过{$R Sample.RES}引用编译。很麻烦,很奇怪,当年Win32开发的王者竟然没有傻瓜化的资源文件的引用方法,要知道连VC都有一个ResourceEditor呀。找了半天竟然真的没有,天哪!超级懒的我在DelphiXE里胡乱的点着,忽然发现主菜单的Project下发现了“Resources and Images”点开以后,Get It!就是我想要的。好吧,废话不说,我来分享一下怎么使用吧,虽然也许看到这篇文章的很多人也许根本就没用过Delphi甚至没听说过Delphi。另外,据网上的文章说,“Resources and Images”这个是Delphi2010之后才有的功能,我没有去验证。
用法:
1、 把PNG图片放到项目中;
2、 点击主菜单“Project”→“ Resources and Images”,弹出下面的对话框
它会自动识别项目中的图片、音频等文件自动添加进来,如果没有识别出来或者是自定义文件类型的话,就点击【Add】按钮手动添加,然后选择合适的资源类型ResourceType,然后在Resource Identifier中给资源取一个名字即可。
在代码中使用TResourceStream读取资源流:
stream := TResourceStream.Create(HInstance, 'PNGIMAGE_PAUSE', RT_RCDATA);
DelphiXE中已经提供了Png解析库,uses pngimage,然后:
png := TPNGObject.Create;
png.LoadFromStream(stream);
下面是我封装的一个简单的从资源中读取PNG对象的方法:
function LoadPNGResource(resName:string):TPNGObject;
var
png: TPNGObject;
stream: TResourceStream;
begin
png := TPNGObject.Create;
stream := TResourceStream.Create(HInstance, 'PNGIMAGE_PAUSE', RT_RCDATA);
try
png.LoadFromStream(stream);
finally
stream.Free;
end;
result := png;
end;
我的Win32开发抉择,Delphi老将复出的更多相关文章
- 跟我一起玩Win32开发(转自CSDN-东邪独孤)
跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4):创建菜单 跟我一起玩W ...
- win32开发基础
收集的,正在学习... 跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4) ...
- 跟我一起玩Win32开发(17):启动和结束进程
这里我再次说明一下,我不知道为什么,现在的人那么喜欢走极端,估计是价值观都“升级”了的缘故吧. 我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是给大家了解一下,Wi ...
- 玩转Win32开发(2):完整的开发流程
上一篇中我给各位说了一般人认为C++中较为难的东西——指针.其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类.虚基类.纯虚函数等,这些都是概念性的东西,几乎每一 ...
- 在Windows7上搭建Cocos2d-x win32开发环境
很多其它相关内容请查看本人博客:http://www.bokeyi.com/ll/category/cocos2d-x/ 建议:为了避免安全相关的问题,请以管理员权限执行全部的操作,当执行命令的时候, ...
- 于windows建筑物Cocos2d-x win32开发环境
这份文件是从cocos2d-x复制的官网.. . 在windows7上搭建COCOS2D-X开发环境并不难. 可是因为框架更新过快,非常多用户都有困难.我希望你们觉得这个教程实用. 建议:为了避 ...
- 基于uniGui开发的Delphi后台管理框架uniFramework
uniGui是基于Delphi的一套开发Web应用的UI框架,前端使用的是ExtJS,最新版的uniGUI1.5 1480已支持新版的ExtJS6.5.3.我认为uniGUI是目前Delphi下最完善 ...
- 10分钟10行代码开发APP(delphi 应用案例)
总结一下用到的知识(开发环境安装配置不计算在内): 第六章 使用不同风格的按钮: 第十七章 让布局适应不同大小与方向的窗体: 第二十五章 使用 dbExpress访问 InterBase ToGo ...
- 跟我一起玩Win32开发(25):监视剪贴板
自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种“门前冷落鞍马稀”的感觉.于是,老邪就拿出<九阴真经>认真阅读,同时用迅雷下载经典大剧<汉武大帝>晚上睡觉前看上几集,老邪一 ...
随机推荐
- HTML图像映射
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Java第一天学习笔记整理
一.关键字 java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名. 常见的关键字: 用于定义数据类型的关键字 cla ...
- mysql 重复数据防止插入:)
insert into table (id, name, age) values(1, "A", 19) on duplicate key update name=values(n ...
- make file
CPPUTEST_USE_EXTENSIONS = Y如果没有这一句定义,CppUTestExt/MockSupport.h和CppUTestExt/MockSupport_c.h文件中的定义就不能用 ...
- 关于Beam Search
Wiki定义:In computer science, beam search is a heuristic search algorithm that explores a graph by exp ...
- C# 编程指南-事件
来自微软官方的msdn: 首页:https://msdn.microsoft.com/zh-cn/library/ms366768.aspx 1.如何:订阅和取消订阅事件 2.如何:发布符 ...
- 未能加载文件或程序集“ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=n
这个可能是因为,缺少文件ICSharpCode.SharpZipLib.dll文件. 我从网上下载了个dll文件,放到根目录中自己好了.
- java string类型的初始化
以下基本上是java string类型最常用的三种方法 new string()就不介绍了 基本等同于第三种 String a; 申明一个string类型的 a,即没有在申请内存地址,更没有在内存 ...
- Centos6.X下安装php nginx mysql 环境
---------------------------------------更换163软件源,此步可以省略,记得把repo文件里面的6.5改成当前版本号 yum makecache &&am ...
- Android学习--摘录
今天准备开始毕业设计--做一个android应用.无奈android基础木有一点,以前做过一个蓝牙应用,不过对android各方面的知识还是不懂啊,今天在android主页上看英文的android开发 ...