这两天在开发公司的一个教学软件客户端,因为要考虑到给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老将复出的更多相关文章

  1. 跟我一起玩Win32开发(转自CSDN-东邪独孤)

    跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4):创建菜单 跟我一起玩W ...

  2. win32开发基础

    收集的,正在学习... 跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4) ...

  3. 跟我一起玩Win32开发(17):启动和结束进程

    这里我再次说明一下,我不知道为什么,现在的人那么喜欢走极端,估计是价值观都“升级”了的缘故吧. 我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是给大家了解一下,Wi ...

  4. 玩转Win32开发(2):完整的开发流程

          上一篇中我给各位说了一般人认为C++中较为难的东西——指针.其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类.虚基类.纯虚函数等,这些都是概念性的东西,几乎每一 ...

  5. 在Windows7上搭建Cocos2d-x win32开发环境

    很多其它相关内容请查看本人博客:http://www.bokeyi.com/ll/category/cocos2d-x/ 建议:为了避免安全相关的问题,请以管理员权限执行全部的操作,当执行命令的时候, ...

  6. 于windows建筑物Cocos2d-x win32开发环境

     这份文件是从cocos2d-x复制的官网.. . 在windows7上搭建COCOS2D-X开发环境并不难. 可是因为框架更新过快,非常多用户都有困难.我希望你们觉得这个教程实用. 建议:为了避 ...

  7. 基于uniGui开发的Delphi后台管理框架uniFramework

    uniGui是基于Delphi的一套开发Web应用的UI框架,前端使用的是ExtJS,最新版的uniGUI1.5 1480已支持新版的ExtJS6.5.3.我认为uniGUI是目前Delphi下最完善 ...

  8. 10分钟10行代码开发APP(delphi 应用案例)

    总结一下用到的知识(开发环境安装配置不计算在内): 第六章  使用不同风格的按钮: 第十七章  让布局适应不同大小与方向的窗体: 第二十五章 使用 dbExpress访问 InterBase ToGo ...

  9. 跟我一起玩Win32开发(25):监视剪贴板

    自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种“门前冷落鞍马稀”的感觉.于是,老邪就拿出<九阴真经>认真阅读,同时用迅雷下载经典大剧<汉武大帝>晚上睡觉前看上几集,老邪一 ...

随机推荐

  1. 你需要知道的swift必备函数 map

    map这东西在oc中并未用过,但是swift在处理数组的时候显得格外的游刃有余,这归功于map这个函数: map函数  arr.map(<#T##transform: (Int) throws ...

  2. 给pcm格式文件加wav文件头

    #include <stdlib.h>#include <stdio.h>#include <string.h>void main(){ //wav头的结构如下所示 ...

  3. VC++ 动态创建单个工具条,并加载外部的位图(bmp)文件为工具栏图像

    步骤: 1, 在框架类CMainFrame头文件里,增加图像变量和工具条变量. CMFCToolBarImages m_UserImages; CMFCToolBar m_wndToolBar; 2, ...

  4. linux获取系统启动时间

    1.前言 时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同.linux内核里面用一个名为jiffes的常量来计算时间戳.应用层有time.getdaytime等函数.今天需要 ...

  5. shell和bat 监控进程,自动关机

    1.linux 下监控进程,进程结束后关机 新建文件 monit.sh $chmod +x monit.sh 加入代码 #!/bin/sh a=; ]; do |;then echo "sh ...

  6. Diagramming for WinForms 教程一(读取图元数据)

    1,新建“Visual c#” Windows窗体应用程序. 2,从“工具箱”的“Diagramming”选项卡下,托出“DiagramView”控件到Form1上.控件的"Name&quo ...

  7. IntelliJ IDEA 16 本地LicenseServer激活(破解)

    IntelliJ IDEA 16 本地LicenseServer激活(破解) IntelliJ IDEA 是Java开发利器,用社区版不爽,干催就用旗舰版,这个是收费的,需要licence. 网上找到 ...

  8. MATLAB - 图像基本操作

    1.读入一幅图像 I = imread('lena.jpg');%给出图片路径即可,I是一个三维矩阵 J = rgb2gray(I); figure, imshow(I), figure, imsho ...

  9. Python全栈之路8--迭代器(iter)和生成器(yield)

    一.生成器( iter ) 从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码. 它基于yield指令,允许停止函数并立即返回结果.此函数保存其执行上下文, ...

  10. javascript 网页运行代码效果

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...