這兩天在開發公司的一個教學軟件客戶端,因為要考慮到給PHP、平面設計等班的同學使用,為了避免安裝.Net Framework、JRE的麻煩(如果把.Net Framework、JRE打包到安裝包,也會使得安裝包太大),因此沒有選擇使用.Net、Java開發。
那麼接下來就考慮使用C/C++開發了,采用純Win32開發太累,選用QT、MFC、WxWidgets之類能簡化工作,MFC就不提了簡直就是一坨翔誰用誰難受,QT開發出的界面太不Native,WxWidgets界面很Native而且類庫設計的超好,使用WxWidgets開發程序甚至有時候感覺不到自己在使用C++,。但是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版上出現了”,很悲涼的。而且我感覺很奇怪的是,
這次開發我還是選擇了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;