如何動態產生一個 ICON |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
昨天改寫 ddy 的釋放記憶體後,想到作出類似 Cacheman 的功能,即可以在 tray 中顯示目前剩下的實體記憶體,於是先試著作出可以放在 tray 的功能,主要是由 BCB5 Example 中的 Apps\TrayIcon 去改。
在 TrayIcon 中,它使用 TrayMessage() 來處理相關的 Message,同時利用 IconHandle() 及 TipText() 來決定每次要更新時所要顯示的圖示及提示字串,程式碼如下:
bool __fastcall TFormMain::TrayMessage(DWORD dwMessage) { NOTIFYICONDATA tnd; PSTR pszTip; pszTip = TipText(); tnd.cbSize = sizeof(NOTIFYICONDATA); tnd.hWnd = Handle; tnd.uID = IDC_MYICON; tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; tnd.uCallbackMessage = MYWM_NOTIFY; if (dwMessage == NIM_MODIFY) { tnd.hIcon = (HICON)IconHandle(); if (pszTip) lstrcpyn(tnd.szTip, pszTip, sizeof(tnd.szTip)); else tnd.szTip[0] = '\0'; } else { tnd.hIcon = NULL; tnd.szTip[0] = '\0'; } return (Shell_NotifyIcon(dwMessage, &tnd)); } HICON __fastcall TFormMain::IconHandle(void) { if (RadioButton1->Checked) return (Image1->Picture->Icon->Handle); else return (Image2->Picture->Icon->Handle); } PSTR __fastcall TFormMain::TipText(void) { if (RadioButton1->Checked) return (Edit1->Text.c_str()); else return (Edit2->Text.c_str()); }而我想在 TipText() 中就傳回目前記憶體狀態的文字資訊,而 IconHandle() 則要用 ICON 表示目前記憶體的大小。我有試過用 int iFree=MemoryStatus.dwAvailPhys >> 20; Graphics::TBitmap *pBmp = new Graphics::TBitmap; pBmp->Height=32; pBmp->Width=32; TRect thisRect=Rect(0,0,32,32); pBmp->Canvas->Brush->Color=clWhite; pBmp->Canvas->FillRect(Rect(0,0,32,32)); pBmp->Canvas->TextRect(thisRect,4,4,IntToStr(iFree)); ImageIcon->Picture->Icon->Assign(pBmp); delete pBmp; return (ImageIcon->Picture->Icon->Handle);但是在 ImageIcon->Picture->Icon->Assign(pBmp);會 Exception!!! 說無法將 TBitmap Assign 給 TIcon ??! 請問,有什麼方法可以動態產生 ICON 呢? 如果不行,那可能要用最笨的方法,那就是在程式中放 0,1,2...256 或 512 甚至到 1024 的數字 ICON .....
------
http://www.ViewMove.com |
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
引言: 可以RunTime Create TImage試試, Timage有Canvas可繪 image->picture->icon 可得Icon Handle 如此就不會type 不同了請看以下的程式碼:(在 Form1 加入一個 TImage 及 TBitBtn,再 TBitBtn 按下後執行以下的程式碼) //----------------------------------------------------------------------------// void __fastcall TForm1::BitBtn1Click(TObject *Sender) { TImage *img=new TImage(this); TRect thisRect=Rect(0,0,32,32); img->Width=32; img->Height=32; img->Canvas->Brush->Color=clWhite; img->Canvas->FillRect(Rect(0,0,32,32)); img->Canvas->TextRect(thisRect,8,8,"88"); // Image1->Assign(img->Picture->Icon); // Exception! Cannot Assign TIcon to TImage // Image1->Picture->Assign(img->Picture->Icon); // No Exception, But Image still nothing // Image1->Picture->Icon->Assign(img->Picture->Icon); // No Exception, But Image still nothing Image1->Canvas->Draw(0,0,img->Picture->Icon); // Draw a Empty Image Image1->Canvas->Draw(0,0,img->Picture->Bitmap); // Draw a 88 Image Image1->Picture->Assign(img->Picture); // No Exception, And Image show this->Icon->Assign(img->Picture->Icon); // nothing happen to form icon delete img; }我把每種可能都寫上了(當然我是每個分開測,結果寫在一起)。 由以上的結果可以知道,動態產生的 TImage::Canvas 也還是 Picture 的 Bitmap。 我們在 IDE 中使用 TImage 時可以對 Picture 屬性載入圖檔,此時,如果是 .ico,則可以見到 Picture 會顯示 (TIcon) 如果載入的是圖檔,則 Picture 會顯示 (TBitmap) 這表示,同一時間,這個 Picture 不是 Icon 就是 Bitmap 不可能同時存在的!! 在以上的程式動態產生 TImage 時 img->Picture->Icon 的值確實不是 NULL ,不過也還是不能使用。
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |