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

請教如何利用Owner Draw改變ListView上的小圖示

尚未結案
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-12 16:05:13 IP:61.220.xxx.xxx 未訂閱
小弟想利用ListView做一個類似檔案總管的小程式,但是特別想針對像.bmp或.jpg等圖形檔以原圖之縮圖取代原本檔案總管的icon,聽說好像將Owner Draw的Property設為true可以不用原本的icon,但不知要如何用縮圖取代呢? 請高手們撥冗幫一下小弟,先謝啦!
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-12 16:35:19 IP:210.241.xxx.xxx 未訂閱
這個功能我有做過,我簡單的說明一下,我不是用ownerdraw    首先,你要有一個share的imagelist 然後,當你讀到jpg or bmp file時 例如讀到a.jpg,就把a.jpg的縮圖放到imagelist 裏面,然後吧file images 指到 imagelist裏面的位置 看你是要用smallimges or stateimages    大方向就是這樣..
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-13 08:50:58 IP:61.220.xxx.xxx 未訂閱
首先感謝版主大哥的回應! 不過小弟因為道行不夠,可能需要再淺顯詳細的解釋… 因為我是以dsfSystemTreeView(下載自DFS)來讓dfsSystemListView中可顯示出TreeView中選到的目錄內容檔案,但是我不知道要如何讓ListView中原本顯示檔案ICON的圖示替換成我要的此目錄中所有檔案的縮圖(當然必需是圖形檔),此間不知道怎麼知道dfsSystemTreeView現在到底選到那一個目錄了,又如何以Owner Draw設為true的方式來取代ICON呢?或者是有其它的方法呢? 如果版主大哥或版上高手有空的話,請大家撥冗幫一下,謝謝!
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-16 12:41:16 IP:210.241.xxx.xxx 未訂閱
沒用過dsfSystemTreeView 我的ShellTreeView是自已寫的
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-16 16:31:23 IP:61.220.xxx.xxx 未訂閱
那麼能否請您提供原始碼供小弟參考一下? 先謝啦!
turboted
版主


發表:95
回覆:754
積分:452
註冊:2002-07-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-16 17:53:02 IP:210.241.xxx.xxx 未訂閱
這是我做的 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=30476 Shell的功能請自已補上
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-19 13:50:54 IP:61.220.xxx.xxx 未訂閱
感謝諸位前輩們的回應,目前我已有一點進展,但仍有問題,我的問題有二: 一是縮圖並不是原始圖的縮圖,而是只有一小部分的截取; 二是執行速度有些慢,並容易出現當掉的現象 能否請前輩們撥冗幫我看一下以下的程式缺點,先謝謝大家啦! 我的主要程式碼如下: void __fastcall TForm1::FormActivate(TObject *Sender) { WIN32_FIND_DATA f; HANDLE h; char buf[255]; TListItem *p; if (RadioButton1->Checked) ListView1->ViewStyle=vsSmallIcon; if (RadioButton2->Checked) ListView1->ViewStyle=vsIcon; if (RadioButton3->Checked) ListView1->ViewStyle=vsList; if (RadioButton4->Checked) ListView1->ViewStyle=vsReport; ImageList1->Clear(); ListView1->Items->Clear(); sprintf(buf,"%s%s", DirectoryListBox1->Directory.c_str(), "\\*.bmp"); h=FindFirstFile(buf, &f); if (h != INVALID_HANDLE_VALUE) { Graphics::TBitmap *tmpBmp = new Graphics::TBitmap(); Graphics::TBitmap *DestBmp = new Graphics::TBitmap(); DestBmp->Width=180; DestBmp->Height=120; tmpBmp->LoadFromFile(f.cFileName); tmpBmp->Canvas->StretchDraw(Rect(1,1,DestBmp->Width,DestBmp->Height),tmpBmp); p=ListView1->Items->Add(); // 新增一筆空資料到ListView內 p->ImageIndex = ImageList1->Add(DestBmp,NULL); p->Caption=f.cFileName; // 先指定檔案名稱給第一個欄位 sprintf(buf,"%d", f.nFileSizeLow); // 再把檔案大小轉成字串 p->SubItems->Add(buf); // 將字串加到第二個欄位 delete DestBmp; delete tmpBmp; while (FindNextFile(h,&f)) { Graphics::TBitmap *tmpBmp = new Graphics::TBitmap(); Graphics::TBitmap *DestBmp = new Graphics::TBitmap(); DestBmp->Width=180; DestBmp->Height=120; tmpBmp->LoadFromFile(f.cFileName); DestBmp->Canvas->StretchDraw(Rect(1,1,tmpBmp->Width,tmpBmp->Height),tmpBmp); p=ListView1->Items->Add(); p->ImageIndex = ImageList1->Add(DestBmp,NULL); p->Caption=f.cFileName; sprintf(buf,"%d", f.nFileSizeLow); p->SubItems->Add(buf); delete DestBmp; delete tmpBmp; } } }
help
一般會員


發表:12
回覆:54
積分:13
註冊:2002-06-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-06-19 15:30:33 IP:61.61.xxx.xxx 未訂閱
大哥, 您這行寫錯啦: tmpBmp->LoadFromFile(f.cFileName); tmpBmp->Canvas->StretchDraw(Rect(1,1,DestBmp->Width,DestBmp->Height),tmpBmp);//錯誤啦!!!! p=ListView1->Items->Add(); // 新增一筆空資料到ListView內 是不是該改成 DestBmp->Canvas->StretchDraw(Rect(1,1,DestBmp->Width,DestBmp->Height),tmpBmp); 因為你是要把tmpBmp的內容畫到DestBmp去啊! ^_^ gogowin
------
gogowin
help
一般會員


發表:12
回覆:54
積分:13
註冊:2002-06-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-06-19 16:36:30 IP:61.61.xxx.xxx 未訂閱
下面這裏也寫錯了 DestBmp->Canvas->StretchDraw(Rect(1,1,tmpBmp->Width,tmpBmp->Height),tmpBmp);    應改為 DestBmp->Canvas->StretchDraw(Rect(1,1,DestpBmp->Width,DestBmp->Height),tmpBmp);
------
gogowin
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-06-19 16:50:24 IP:61.220.xxx.xxx 未訂閱
感謝help大哥!您果然眼尖! 小弟剛才已經修正過此錯誤,但是只有在small Icon時才顯示出原圖之完整縮圖,其它的模式都只顯示部分,後來將ImageList的size改成32X32看起來就沒問題,是不是因為其它顯示模式原本就自動會將圖縮小到一定的大小?
help
一般會員


發表:12
回覆:54
積分:13
註冊:2002-06-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-06-19 16:58:31 IP:61.61.xxx.xxx 未訂閱
我用vsIcon模式也可以顯示, 不一定要用smallIcon. 另外, 你的imagelist沒有設定width及height.如果設成180,120就不會有問題了. gogowin
------
gogowin
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-06-20 09:28:54 IP:61.220.xxx.xxx 未訂閱
再次感謝help大哥的回應,的確又解決了一點問題,但是我設定了ImageList的寬及高後,還是只有smallIcon的圖是"完整"的縮圖,其它的都只是圖片的一個角落的圖,再請各位大哥大姐幫忙一下…
系統時間:2024-05-18 5:43:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!