首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

打造可編輯表格控件:MSFlexGrid 搭配 Edit/ComboBox 視覺欺騙法

     編輯:VC++

核心概念:視覺欺騙

MSFlexGrid 本身不支援直接編輯,解法是在滑鼠點選儲存格時,動態顯示一個隱藏的 CEdit 或 CComboBox,精確覆蓋該儲存格,造成「直接編輯」的假象。

實作步驟

  1. 偵測點選儲存格(OnClick),判斷該欄採用文字編輯或下拉選單。
  2. 取得儲存格螢幕座標與尺寸(單位為 twips,需換算像素)。
  3. 將對應編輯控件 MoveWindow 至該矩形並 ShowWindow(SW_SHOW)。
  4. 填入原儲存格文字,設定焦點與全選。
  5. 失去焦點時(OnKillFocus),回寫新值至 MSFlexGrid,隱藏編輯控件。

關鍵程式碼

座標換算

CRect rectGrid;
m_FlexGrid.GetWindowRect(&rectGrid);
ScreenToClient(&rectGrid);

CDC* pDC = GetDC();
int twipsPerPixelX = 1440 / pDC->GetDeviceCaps(LOGPIXELSX);
int twipsPerPixelY = 1440 / pDC->GetDeviceCaps(LOGPIXELSY);

long row = m_FlexGrid.GetRowSel();
long col = m_FlexGrid.GetColSel();

long x = m_FlexGrid.GetColPos(col) / twipsPerPixelX;
long y = m_FlexGrid.GetRowPos(row) / twipsPerPixelY;
long w = m_FlexGrid.GetColWidth(col) / twipsPerPixelX + 1;
long h = m_FlexGrid.GetRowHeight(row) / twipsPerPixelY + 1;

CRect rcCell(x, y, x + w, y + h);
rcCell.OffsetRect(rectGrid.left + 1, rectGrid.top + 1); // 轉為對話框客戶區座標

顯示編輯控件

CString strVal = m_FlexGrid.GetTextMatrix(row, col);

if (m_ChangeCombo.GetCount() > 0) // 該欄用下拉選單
{
    m_ChangeCombo.ShowWindow(SW_SHOW);
    m_ChangeCombo.MoveWindow(&rcCell);
    m_ChangeCombo.SelectString(-1, strVal);
    m_ChangeCombo.SetFocus();
}
else // 文字編輯
{
    m_Change.ShowWindow(SW_SHOW);
    m_Change.SetWindowText(strVal);
    m_Change.SetFocus();
    m_Change.SetSel(0, -1);
    m_Change.MoveWindow(&rcCell);
}

失去焦點回寫

void OnKillFocusEdit()
{
    UpdateData(TRUE);
    m_FlexGrid.SetText(m_sChange);
    m_Change.ShowWindow(SW_HIDE);
    UpdateData(FALSE);
}

void OnKillFocusCombo()
{
    UpdateData(TRUE);
    CString str;
    m_ChangeCombo.GetWindowText(str);
    m_FlexGrid.SetText(str);
    m_ChangeCombo.ShowWindow(SW_HIDE);
    UpdateData(FALSE);
}

擴充建議

  • 依欄位類型預先準備多組不同風格的編輯控件(日期選擇器、數字輸入框等)。
  • 處理鍵盤導航(Enter/Tab/Escape)以符合使用者習慣。
  • 大量資料時考慮虛擬模式或改用 CListCtrl + LVS_EX_LABELTIP 等現代替代方案。

此法雖屬經典技巧,但在維護舊專案或輕量需求時仍具實用價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved