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

在TDrawGrid中如何點選指定的Cell做貼圖

尚未結案
robertyang
一般會員


發表:7
回覆:3
積分:2
註冊:2005-07-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-05 01:10:55 IP:61.228.xxx.xxx 未訂閱
各位專家您好: 問題是在TDrawGrid中,滑鼠點選Cell,在將指定的圖片貼入內,我的錯誤程式如下,請大家能否給予小弟指點:    void __fastcall TForm1::FormCreate(TObject *Sender) {         DrawGrid1->Align=alClient;         DrawGrid1->RowCount=5;         DrawGrid1->ColCount=10;         DrawGrid1->DefaultColWidth=80;         DrawGrid1->DefaultRowHeight=60; }    void __fastcall TForm1::DrawGrid1DrawCell(TObject *Sender, int ACol,       int ARow, TRect &Rect, TGridDrawState State) {         DrawGrid1->Canvas->Brush->Color=clRed;         TRect rt=DrawGrid1->CellRect(ARow, ACol);         DrawGrid1->Canvas->FillRect(Rect(rt.Left, rt.Top, rt.Left+1, rt.Top+1));         //上一列中的Rect有error >>>>>>> > >
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-05 06:39:21 IP:61.219.xxx.xxx 未訂閱
void __fastcall TForm1::DrawGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
  DrawGrid1->Canvas->Brush->Color=clRed;
  TRect rt=DrawGrid1->CellRect(ACol, ARow);
  DrawGrid1->Canvas->FillRect(Rect(rt.Left, rt.Top, rt.Left 1, rt.Top 1));
  // 上一列中的Rect有error
  Graphics::TBitmap *bmp=new Graphics::TBitmap;
  bmp->LoadFromFile("C:\\P1.bmp"); //P1.BMP放在C:\下
  DrawGrid1->Canvas->CopyRect()(DrawGrid1->CellRect(ACol, ARow), bmp->Canvas,
  Rect(0, 0, bmp->Width, bmp->Height));
  //上一列中的Rect也有error
  delete bmp;
}
1. ACol, ARow 弄反了 2. 參數裡面的 TRect &Rect 就是該 Cell 的 Rect, 直接用就可以了不必再用 CellRect 去取得
robertyang
一般會員


發表:7
回覆:3
積分:2
註冊:2005-07-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-05 22:15:55 IP:61.228.xxx.xxx 未訂閱
malanlk您好: 感謝您的回應,照您指點的方式去try,但還是有兩個錯誤訊息,程式如下: void __fastcall TForm1::DrawGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { DrawGrid1->Canvas->Brush->Color=clRed; DrawGrid1->Canvas->FillRect(Rect(Rect.Left, Rect.Top, Rect.Left 1, Rect.Top 1)); // error:call of nonfunction Graphics::TBitmap *bmp=new Graphics::TBitmap; bmp->LoadFromFile("C:\\P1.bmp"); //P1.BMP放在C:\下 DrawGrid1->Canvas->CopyRect(DrawGrid1->CellRect(ACol, ARow), bmp->Canvas, Rect(0, 0, bmp->Width, bmp->Height)); //error:call of nonfunction delete bmp; }
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-05 22:56:11 IP:61.219.xxx.xxx 未訂閱
那就是命名混淆了    DrawGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &aRect, TGridDrawState State) 把 Rect 換個名字, .h 檔案內的宣告也要換哦... 或是呼叫 FillRect(Classes::Rect(....)...
robertyang
一般會員


發表:7
回覆:3
積分:2
註冊:2005-07-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-06 22:07:29 IP:59.112.xxx.xxx 未訂閱
malanlk您好: 謝謝你!我照您的建議去試過了,試到沒有error了,但啟動後每個cell都貼上同一張圖,並非滑鼠點選貼圖的方式,可以再給我點建議嗎?? void __fastcall TForm1::DrawGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { DrawGrid1->Canvas->Brush->Color=clRed; TRect rt=DrawGrid1->CellRect(ARow, ACol); DrawGrid1->Canvas->FillRect(Classes::Rect(rt.left,rt.top,rt.right,rt.bottom)); Graphics::TBitmap *bmp=new Graphics::TBitmap; bmp->LoadFromFile("C:\\P1.bmp"); //P1.BMP放在C:\下 DrawGrid1->Canvas->CopyRect(DrawGrid1->CellRect(ACol, ARow), bmp->Canvas, Classes::Rect(0, 0, bmp->Width, bmp->Height)); delete bmp; }
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-06 23:10:04 IP:61.219.xxx.xxx 未訂閱
void __fastcall TForm1::DrawGrid1DrawCell(TObject *Sender, int ACol,
int ARow, TRect &Rect, TGridDrawState State)
{
  if (State.Contains(gdSelected)) {
    DrawGrid1->Canvas->Brush->Color=clRed;
    TRect rt=DrawGrid1->CellRect(ARow, ACol);
    DrawGrid1->Canvas->FillRect(Classes::Rect   (rt.left,rt.top,rt.right,rt.bottom));        Graphics::TBitmap *bmp=new Graphics::TBitmap;
    bmp->LoadFromFile("C:\\P1.bmp"); //P1.BMP放在C:\下
    DrawGrid1->Canvas->CopyRect(DrawGrid1->CellRect(ACol, ARow), bmp->Canvas,
Classes::Rect(0, 0, bmp->Width, bmp->Height));        delete bmp;
  }
}
如果 你要將圖 "保留" 在, Grid 內... "保留" 的意思就是每次更新就重畫.. 所以你要找地方(用陣列, TList...)記下哪些 Grid 被按過, 然後用記下的資料判斷 ACol, ARow是否被按過, 如果按過就畫, 沒按過就Pass
robertyang
一般會員


發表:7
回覆:3
積分:2
註冊:2005-07-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-09 00:09:57 IP:61.228.xxx.xxx 未訂閱
malanlk 謝謝你!我已試過結果了,但我還是有一點不了解,是否每次貼圖再cell內,drawgrid元件就會把所有的cell都重貼一次,但有辦法可以一次貼圖就只從貼一個cell,不要全部重貼嗎??
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-09 01:22:53 IP:61.219.xxx.xxx 未訂閱
因為視窗的特性就是可移動, 被蓋住之後又恢復...., 視窗顯示出來的畫面,都是要靠你自己的程式在收到WM_PAINT視窗訊息之後把它畫出來, 而 OnDrewGrid 就是你的程式收到視窗WM_PAINT之後,透過 DELPHI VCL 元件巧妙的安排, 要求每個顯示出來的 Grid 把自己這一格畫一遍... 所以在OnDrawGrid中如果不靠 ACol, ARow 判斷目前在哪一格,要怎樣畫, 就會每格都畫一樣的.... 所以要 "記住" 每一格該怎樣畫, 就要額外對應每一格記下繪圖資訊, 如 TImageList的ImageIndex... 如 PictIdx[1,2]=2 表示DrawGrid[1,2]的圖是放在 TImageList 中的 2 號圖. 所以每當 DrawGrid 畫到 [ACol,ARow] 格時 就取出 PictIdx[ACol,ARow] 的值, 決定要畫哪一張圖....希望這樣你看的懂...
系統時間:2024-05-09 15:53:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!