无法正确读取图标 |
缺席
|
bigdogchina
版主 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
大大们好,小弟问题多多,请在茫茫迷海中给我指条明路吧
在我的这个小程式中,要实现的目的是把 class="code">
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TIcon *MyIcon = new TIcon();
HICON hIcon;
TListItem *MyListItem; if(OpenDialog1->Execute())
{
AnsiString MyFileName = OpenDialog1->FileName;
hIcon = ExtractIcon(Form1->Handle,MyFileName.c_str(),0);
MyIcon->Handle = hIcon;
ImageList1->AddIcon(MyIcon); MyListItem = ListView1->Items->Add();
MyListItem->Caption = ExtractFileName(MyFileName);
MyListItem->ImageIndex = ListView1->Items->Count - 1;
}
delete MyIcon;
}
当按下Button1时,弹出对话框,在指定了exe文件后,程式会将文件名和该文件的略缩图标显示出来.
现在的问题是:
1.当打开自己有特定图标的文件是可以成功的读取,例如:Notepad.exe等,但是在系统目录下有很多的exe文件的图标无法读出来,例如C:\WINNT\system32\systray.exe,以及C:\WINNT\system32\FTP.EXE等.我不知道为什么会产生这样的情况,盼您点拨一下我.
2.HICON hIcon是代表在栈中申请的空间,所以不用自己去销毁,VCL会帮我们做完的,TIcon *MyIcon = new TIcon()是代表在堆中申请的,所以在最后要自己去把它销毁掉.我的问题是:TListItem *MyListItem算是在那里申请的哦?堆还是栈?我在后面没有把它销毁掉,会不会造成资源的泄漏呢?
又得麻烦大大您们了,您们是世界上最无私奉献的人!!! 人生在勤,不索何获?
------
人生在勤,不索何获? |
bigdogchina
版主 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
小弟还有一个问题:
对于一个AnsiString的字符串,如果里面包含了路径和相关的参数,存不存在这样的可能: 把相关的路径提出来呢?
例如字符串: AnsiString str1,str2,str3;
str1="C:\\PROGRAM FILES\\REAL\\REALONE PLAYER\\RealPlay.exe SYSTEMBOOTHIDEPLAYER";
str2="C:\\Program Files\\QuickTime\\qttask.exe -atboottime";
str3="mobsync.exe /logon"; 能否把exe的路径读出来呢?让它们变成下面这样的形式: str1="C:\\PROGRAM FILES\\REAL\\REALONE PLAYER\\RealPlay.exe";
str2="C:\\Program Files\\QuickTime\\qttask.exe";
str3="mobsync.exe"; 我的确不知道可不可能实现这样的功能?如果有,请大大您指点我,好吗?如果没有也没什么的,小弟多有打搅,抱歉了! 人生在勤,不索何获?
------
人生在勤,不索何获? |
bigdogchina
版主 發表:238 回覆:523 積分:312 註冊:2003-04-28 發送簡訊給我 |
感谢大家,我自己已经把问题解决了.
1. 有些系统文件的图标自身是没有的,它是引用的Explorer中的图标.可以用下面的代码来判断是否能正确读出图标:
void __fastcall TForm1::Button1Click(TObject *Sender) { HICON hIcon; if(OpenDialog1->Execute()) { AnsiString MyFileName = OpenDialog1->FileName; hIcon = ExtractIcon(Form1->Handle,MyFileName.c_str(),0); if(hIcon != NULL) { ShowMessage("能把图标搞定哦"); } else ShowMessage("哎,无能为力了^_^"); } }2.关于将字段提出来的办法.因为都有规律,所以就可拆解: AnsiString __fastcall TForm1::MyStringSegment(AnsiString Str,AnsiString Comma,int Seg) { AnsiString sResult; //做为结果返回 if((Str.IsEmpty()) || (Seg <1)) { sResult = ""; return sResult; } String C = Comma; if(C == "") C = ","; String s = Str; String sTemp; int iPosComma; TStringList *TempList = new TStringList; //哦,这里有一个列表哈 TempList->Clear(); while(s.Pos(C) > 0) { iPosComma = s.Pos(C); //什么哦 sTemp = s.SubString(1,iPosComma - 1); TempList->Add(sTemp); s = s.SubString(iPosComma 1,s.Length()); } if(s.Length() != 0) TempList->Add(s); if(Seg > TempList->Count) { sResult = ""; } else sResult = TempList->Strings[Seg - 1]; delete TempList; return sResult; }只需要将.号前面的拆出后再加上exe就搞定了 人生在勤,不索何获?
------
人生在勤,不索何获? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |