全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1716
推到 Plurk!
推到 Facebook!

如何讀取內含多種格式的ICON圖示

答題得分者是:ikk
jimmytang
一般會員


發表:1
回覆:4
積分:6
註冊:2004-01-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-03-06 12:12:04 IP:59.124.xxx.xxx 訂閱
請問各位先進,如何取得(顯示)包含各種格式大小(有48x48, 32x32, 16x16)的ICON檔(如附件)?
透過一些icon的工具例如iconshop.exe,可以看到各種大小跟格式的icon,但這功能要怎麼寫呢?
使用TICON只能取得其中一個。
附加檔案:49b0a294219eb_OIS-1.ico
編輯記錄
jimmytang 重新編輯於 2009-03-06 15:20:45, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-03-09 10:29:18 IP:163.28.xxx.xxx 訂閱
你可能要讀出Icon檔案來取得圖片吧..
google 關鍵字 IconGroupHeader
------
FPGA驗證, FPGA開發平台, http://smims.com
jimmytang
一般會員


發表:1
回覆:4
積分:6
註冊:2004-01-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-03-26 16:07:49 IP:59.124.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-03-26 16:44:27 IP:59.124.xxx.xxx 訂閱
後來在迴圈裡面另外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]

不知道各位大大是否還有其他更聰明的方法?
系統時間:2024-04-26 2:02:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!