2007年10月27日 星期六

CopyRect



老話一句,教授給出程式碼之後一切就都變得很簡單
但是在此之前卻會查資料查的半死,然後又沒甚麼收穫
最吐血的是家裡的vista不能看程式附的help檔,真是~!#$%^&*(_+
發個牢騷 = =a

【這堂課新學的指令】
Rect是一個特殊的數據結構,又是一個函數
他的作用就是定義一個矩形位址
Rect( 左上角x , 左上角y , 右下角x , 右下角y );

CopyRect 則是將一個Canvas(A)的矩形位址,'
複製到另一個Canvas(B)的矩形位址
CopyRect( B的矩形位址 , A的Canvas , A的矩形位址 );

【讓Image在程式一打開就有圖片】
點選一個Image,在屬性視窗裡,尋找 Picture ( Name 的下面第二個)
點進去後可以載入bmp 圖檔
只能載入 bmp 圖檔,雖然其他如 jpg 的圖也可以開啟,
但是會在CopyRect時發生錯誤

【其他1】 【 動態使用指定 Image 】
如果要像教授播放的範例一樣,弄出九宮格
那至少會有10個 Image ,一個來源圖片,九個空 Image
這樣的話,就要每個 Image 都設定一次
ex:
Image1:
  int x=280,y=68;
  TRect rtTile,rtOI;
  rtTile = Rect(0,0,90,90);
  rtOI = Rect(x,y,x+90,y+90);
  Image1->Canvas->CopyRect(rtTile,Image1->Canvas,rtOI);

Image2:
  int x=280,y=68;
  TRect rtTile,rtOI;
  rtTile = Rect(0,0,90,90);
  rtOI = Rect(x,y,x+90,y+90);
  Image2->Canvas->CopyRect(rtTile,Image1->Canvas,rtOI);

Image3:
  ...
  ...
  ...
  ...

9個 Image 就要設定9次,數量一多不就寫到死了
所以我就想,難道 Image 只能固定使用,不能用其他的變數替代嗎??
或是用陣列來設定 Image ??
然後開始上網翻資料

我找到的是使用 FindComponent 函數

使用方法如下:
  (TImage*)FindComponent( "Image"+IntToStr( i ) )

(Timage*) 這個應該是元件type的宣告
( "Image"+IntToStr( i ) ) 這裡是 "元件名稱"+(編號)

((TImage*)FindComponent("Image"+IntToStr()))->Canvas
相等於 Image1->Canvas

這樣的話,要使用哪個 Image 就隨自己了
九個 Image 就可以只要更改 rtOI 的 x,y 坐標

  int x=0,y=0;
  TRect rtTile,rtOI;
  rtTile = Rect(0,0,88,88);
  rtOI = Rect(x,y,x+88,y+88);
  for(int i=0;i<8;i+=3)
  {
    for(int j=i+1;j<i+4;j++)<>
    {
      ((TImage*)FindComponent("Image"+IntToStr(j)))->Canvas->
      CopyRect(rtTile,Image10->Canvas,rtOI);
      x+=88;
      rtOI = Rect(x,y,x+88,y+88);
    }
    x=0;
    y+=88;
    rtOI = Rect(x,y,x+92,y+92);
  }
最後我發現!!
比起去想 for loop 裡面怎麼改 x,y 的座標
還不如複製貼上用個9次來的快 ...... XD
【其他2】 【 指定 Image 為陣列 】
懂了 FindComponent 怎麼用之後,就有更簡單的方法啦
先找個地方宣告 global 變數
  Timage *BMP[9];
然後把下列程式碼放在 butten 裡面或隨便哪裡 看你想怎麼使用
  for(int i=0;i<9;i++)
  BMP[i]=(TImage*)FindComponent("Image"+IntToStr(i+1));
這樣一來,
Image1->Canvas 就可以替換成 BMP[0]->Canvas
Image2->Canvas 則可以替換成 BMP[1]->Canvas
...
...
依此類推
這樣上面po的程式碼又可以更簡潔易看了
   int x=0,y=0;
  TRect rtTile,rtOI;
  rtTile = Rect(0,0,88,88);
  rtOI = Rect(x,y,x+88,y+88);
  int k=0;
  for(int i=0;i<8;i+=3)
  {
    for(int j=i+1;j<i+4;j++)
    {
      BMP[k++]->Canvas->CopyRect(rtTile,Image10->Canvas,rtOI);
      x+=88;
      rtOI = Rect(x,y,x+88,y+88);
    }
    x=0;
    y+=88;
    rtOI = Rect(x,y,x+92,y+92);
  }
問題:
暫無

2 則留言:

  1. FindComponent 真的是一個很棒的method!
    讓我們把一些需要用的的物件的指標通通存到陣列中, 這樣我們就可以透過控制陣列的index, 來簡化我們所撰寫的程式碼了!!

    回覆刪除
  2. 其實這是week6的作業,
    所以標籤應該是week6.
    另外,現在目前po的有week2,week3,week4,week5,week6(,week7)各一篇.
    問題和程式要和起來po.
    每週用一次標籤就好.

    回覆刪除