線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2024
推到 Plurk!
推到 Facebook!

如何動態產生一個 ICON

 
dllee
站務副站長


發表:319
回覆:2516
積分:1710
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-07-26 17:50:03 IP:61.231.xxx.xxx 未訂閱
昨天改寫 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://blog.yam.com/dllee/
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-07-27 10:11:43 IP:203.217.xxx.xxx 未訂閱
可以RunTime Create TImage試試, Timage有Canvas可繪 image->picture->icon 可得Icon Handle 如此就不會type 不同了
dllee
站務副站長


發表:319
回覆:2516
積分:1710
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-07-29 10:02:29 IP:61.231.xxx.xxx 未訂閱
引言: 可以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://blog.yam.com/dllee/
系統時間:2017-12-14 21:10:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!