我的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):监视剪贴板
自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种“门前冷落鞍马稀”的感觉.于是,老邪就拿出<九阴真经>认真阅读,同时用迅雷下载经典大剧<汉武大帝>晚上睡觉前看上几集,老邪一 ...
随机推荐
- winform.布局
布局:默认布局:自己拖动进行布局,工具栏里对齐方式 右键,锁定.##随容器拉动变化属性:Anchor:上下左右,固定的设置 panel的排列 1.Dock属性:(顺序填充)Top:靠上,高度不变,左右 ...
- Linux命令之reset - 终端屏幕混乱的终结者
用途说明 reset命令是用来重新初始化终端的(terminal initialization).在有些情况,终端显示会混乱无比,比如不小心显示了一个二进制文件,以前我在不知道reset命令时,只好将 ...
- 无法连接到已配置的开发web服务器
http://jingyan.baidu.com/article/29697b91099847ab20de3c8b.html 这是防火墙造成的,将防火墙关闭即可
- {Reship}{Matting}Image Matting
======================================== http://www.alphamatting.com/index.html ==================== ...
- Nginx编译参数大全 configure参数中文详解
./configure --help--help 显示本提示信息--prefix=PATH 设定安装目录--sbin-path=PATH 设定程序文件目录--conf-path=PATH 设定配置文件 ...
- [转]df命令
linux中df命令参数功能:检查文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 语法:df [选项] 该命令各个选项的含义如下: -a 显示所有文件 ...
- EXTJS 4 动态grid
var grid=Ext.getCmp("GridPanel1"); var store = grid.getStore(); Ext.Ajax.request({ url:&qu ...
- GridView多列排序
public class WebGridView:GridView { 属性#region 属性 /**//// <summary> /// 是否启用或者禁止多列排序 /// </s ...
- Nop源码分析一
从Global.asax文件开始逐层分析Nop的架构. Application_Start()方法作为mvc启动的第一个方法. 1,首先初始化一个引擎上下文,如下面的代码: EngineContext ...
- [2015hdu多校联赛补题]hdu5302 Connect the Graph
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5302 题意:给你一个无向图,它的边要么是黑色要么是白色,且图上的每个点最多与两个黑边两个白边相连.现在 ...