在TDrawGrid中如何點選指定的Cell做貼圖 |
尚未結案
|
robertyang
一般會員 發表:7 回覆:3 積分:2 註冊:2005-07-19 發送簡訊給我 |
各位專家您好:
問題是在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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
robertyang
一般會員 發表:7 回覆:3 積分:2 註冊:2005-07-19 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
|
malanlk
尊榮會員 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
因為視窗的特性就是可移動, 被蓋住之後又恢復...., 視窗顯示出來的畫面,都是要靠你自己的程式在收到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] 的值, 決定要畫哪一張圖....希望這樣你看的懂...
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |