這兩天在開發公司的一個教學軟件客戶端,因為要考慮到給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;
如鵬網.Net培訓班正在報名,有網絡的地方就可以參加如鵬網的學習,學完就能高薪就業,點擊此處了解
三年前只要懂“三層架構”就可以說“精通分層架構”;現在則需要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值錢;
三年前只要會SQLServer就可以說自己“精通數據庫開發”;現在則需還需要掌握MySQL等開源數據庫才能說是“.Net開源”時代的程序員;
三年前只要會進行用戶上傳內容的安全性處理即可;現在則需要熟悉雲存儲、CDN等才能在雲計算時代游刃有余;
三年前只要掌握Lucene.Net就會說自己“熟悉站內搜索引擎開發”;現在大家都用ElasticSearch了,你還用Lucene.Net就太老土了;
三年前發郵件還是用SmtpClient;現在做大型網站發郵件必須用雲郵件引擎;
三年前緩存就是Context.Cache;現在則是Redis、Memcached的天下;
如鵬網再次引領.Net社區技術潮流!點擊此處了解如鵬網.Net最新課程