如何讀取內含多種格式的ICON圖示 |
答題得分者是:ikk
|
jimmytang
一般會員 發表:1 回覆:4 積分:6 註冊:2004-01-05 發送簡訊給我 |
請問各位先進,如何取得(顯示)包含各種格式大小(有48x48, 32x32, 16x16)的ICON檔(如附件)?
透過一些icon的工具例如iconshop.exe,可以看到各種大小跟格式的icon,但這功能要怎麼寫呢? 使用TICON只能取得其中一個。 編輯記錄
jimmytang 重新編輯於 2009-03-06 15:20:45, 註解 無‧
|
ikk
尊榮會員 發表:4 回覆:413 積分:768 註冊:2003-06-30 發送簡訊給我 |
|
jimmytang
一般會員 發表:1 回覆:4 積分:6 註冊:2004-01-05 發送簡訊給我 |
===================引 用 ikk 文 章=================== 你可能要讀出Icon檔案來取得圖片吧.. google 關鍵字 IconGroupHeader 謝謝ikk大大的回覆。 有用您的關鍵字上谷哥搜尋,有看到 http://nsis.sourcearchive.com/documentation/2.43/icon_8cpp-source.html http://nsis.sourcearchive.com/documentation/2.43/icon_8h-source.html 這應該就是ikk大大您要給我的線索吧! 本想整個copy下來run,但牽扯許多作者另外產生的檔案,所以就放棄了。 參考了icon.h裡面 IconGroupHeader 的 type,以及wikipedia上ICON的檔案結構 寫了一隻小程式,code如下。 雖然可以解出這個icon有多少format的圖示以及大小,但對於pixel data部分,依照格式所說的起始位置,跟直接用WinHex開icon檔的pixel data比較又對不起來,所以還是解不太出來。 本以為使用DrawIconEX()可以畫指定大小的icon,但結果並沒有,還是拿第一個圖示來照我要的大小去draw出來。 [code cpp] if(OpenDialog1->Execute()) { TIcon* ico = new TIcon; ico->LoadFromFile(OpenDialog1->FileName); TMemoryStream* ms = new TMemoryStream; ico->SaveToStream(ms); ms->Seek(4,0); short count; ms->Read(&count,2); TPoint *isize; isize = new TPoint[count]; AnsiString str; int xoff = 0; for(int i = 0; i < count; i ) { ms->Seek(i*16 6,0); ms->Read(&isize[i].x,1); ms->Read(&isize[i].y,1); str.sprintf("%d-%d",isize[i].x,isize[i].y); Memo1->Lines->Add(str); DrawIconEx(PaintBox1->Canvas->Handle, xoff,0,ico->Handle,isize[i].y, isize[i].y,i,0,DI_NORMAL|DI_COMPAT); xoff =isize[i].y 8; } delete [] isize; delete ms; delete ico; } [/code] |
jimmytang
一般會員 發表:1 回覆:4 積分:6 註冊:2004-01-05 發送簡訊給我 |
後來在迴圈裡面另外new 一個icon,先根據讀到的大小設定長寬,然後再load這個icon,就可以達到我想要的結果。
[code cpp] if(OpenDialog1->Execute()) { TIcon* ico = new TIcon; ico->LoadFromFile(OpenDialog1->FileName); TMemoryStream* ms = new TMemoryStream; ico->SaveToStream(ms); ms->Seek(4,0); short count; ms->Read(&count,2); TPoint *isize; isize = new TPoint[count]; AnsiString str; int xoff = 0; for(int i = 0; i < count; i ) { ms->Seek(i*16 6,0); ms->Read(&isize[i].x,1); ms->Read(&isize[i].y,1); str.sprintf("%d-%d",isize[i].x,isize[i].y); Memo1->Lines->Add(str); DrawIconEx(PaintBox1->Canvas->Handle, xoff,0,ico->Handle,isize[i].y, isize[i].y,i,0,DI_NORMAL|DI_COMPAT); // ==== 新加這一段 ==== TIcon* tico = new TIcon; tico->Width = isize[i].x; tico->Height = isize[i].y; tico->LoadFromFile(OpenDialog1->FileName); DrawIconEx(PaintBox1->Canvas->Handle, xoff,50,tico->Handle,isize[i].y, isize[i].y,i,0,DI_NORMAL|DI_COMPAT); delete tico; // ==================== xoff =isize[i].y 8; } delete [] isize; delete ms; delete ico; } [/code] 不知道各位大大是否還有其他更聰明的方法? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |