VC MSFlexGrid基本使用
1. 給FlexGrid控制項綁定成員變數:m_FlexGrid。
2. 設定行列數 m_FlexGrid.SetCols(4); //設定列數 m_FlexGrid.SetRows(6); //設定行數
3. 設定固定行數和固定列數 m_FlexGrid.SetFixedRows(1); //設定固定行數為1行
m_FlexGrid.SetFixedCols(0); //設定固定列數為0列
4. 設定列寬、行高 m_FlexGrid.SetColWidth(1,1500); //設定列號為1的列寬為1500
m_FlexGrid.SetRowHeight(2,300); //設定行號為2的行高為300
5. 設定文本對齊 m_FlexGrid.SetColAlignment(1,4); //設定列號為1的文本對齊
參數對應描述為: 0 單元內容頂部靠左對齊。 1 單元內容中間靠左對齊。對字串的預設設定值。 2 單元內容底部靠左對齊。 3 單元內容頂部置中。 4 單元內容中間置中。 5 單元內容底部置中。 6 單元內容頂部靠右對齊。 7 單元內容中間靠右對齊。對數位預設設定值。 8 單元內容底部靠右對齊。 9 單元內容一般對齊。對字串中間靠左對齊而對數值中間靠右對齊。
6. 設定表頭和儲存格內容 m_FlexGrid.SetTextArray(0,"Head1"); //設定表頭(第1列)內容為“Head1”
m_FlexGrid.SetTextMatrix(1,1,"Text"); //設定儲存格(行號1列號1)內容為“Text”
7. 增加一行 m_FlexGrid.AddItem("AddString",(COleVariant)(3L)); //在行號為3的位置增加一行
8. 合併儲存格 for(i=0;i<4;i++)
m_FlexGrid.SetTextMatrix(5,i,"合計"); //將行號為5、列號從0到4的儲存格內容設定成相同“合計”
m_FlexGrid.SetMergeCells(2); //設定儲存格合并方式(下述)
m_FlexGrid.SetMergeRow(5,TRUE); //設定要合并的行
SetMergeCells函數的參數值如下:
0: flexMergeNever 預設的選項,就是不合并
1: flexMergeFree 不規則的合并
2: flexMergeRestrictRows 行合并
3: flexMergeRestrictColumns 列合并
4: flexMergeRestrictBoth 行,列都合并
注意只有儲存格內容相同時才能進行合併作業。
9. 製作可編輯的FlexGrid控制項
放置一個Edit控制項,綁定成員變數為m_Edit,並設定初始狀態為不可見。
響應FlexGrid控制項的Click事件:
void CBlackBKDlg::OnClickMsflexgrid()
{
long lCol=m_FlexGrid.GetColSel(); //擷取點擊的行號
long lRow=m_FlexGrid.GetRowSel(); //擷取點擊的列號
if(lRow>m_FlexGrid.GetRows() || lRow==0) //判斷點擊是否有效
return;
CRect rect;
m_FlexGrid.GetWindowRect(&rect); //擷取FlexGrid控制項的視窗矩形
ScreenToClient(&rect); //轉換為客戶區矩形
CDC* pDC=GetDC(); //MSFlexGrid 控制項的函數的長度單位是“緹(twips)”,需要將其轉化為像素,1440 緹 = 1 英寸 //計算象素點和緹的轉換比例
int nTwipsPerDotX=1440/pDC->GetDeviceCaps(LOGPIXELSX);
int nTwipsPerDotY=1440/pDC->GetDeviceCaps(LOGPIXELSY); //計算選中格的左上方的座標(象素為單位)
long y = m_FlexGrid.GetRowPos(lRow)/nTwipsPerDotY;
long x = m_FlexGrid.GetColPos(lCol)/nTwipsPerDotX; //計算選中格的尺寸(象素為單位)。加1是實際調試中,發現加1後效果更好
long width = m_FlexGrid.GetColWidth(lCol)/nTwipsPerDotX+1;
long height = m_FlexGrid.GetRowHeight(lRow)/nTwipsPerDotY+1; //形成選中個所在的矩形地區
CRect rc(x,y,x+width,y+height); //轉換成相對對話方塊的座標 rc.OffsetRect(rect.left+1,rect.top+1);
CString strValue=m_FlexGrid.GetTextMatrix(lRow,lCol); //擷取儲存格內容
m_Edit.ShowWindow(SW_SHOW); //顯示控制項 m_Edit.MoveWindow(rc); //改變大小並移到選中格位置
m_Edit.SetWindowText(strValue); //顯示文本
m_Edit.SetFocus(); //擷取焦點 }
編輯完成釋放焦點之後,將資料寫回儲存格。響應Edit控制項的EN_KILLFOCUS事件:
void CBlackBKDlg::OnKillfocusEditChange() { CString strInput; GetDlgItemText(IDC_EDIT_CHANGE,strInput); //擷取輸入框內容 m_FlexGrid.SetText(strInput); //設定儲存格內容 m_Edit.ShowWindow(SW_HIDE);