zoukankan      html  css  js  c++  java
  • c++ builder ListView实现可编辑任意列(转)

     1 // ---------------------------------------------------------------------------
     2 // Form的构造函数中填充StrinGrid单元格
     3 __fastcall TForm1::TForm1(TComponent* Owner)
     4     : TForm(Owner)
     5 {
     6     for (int i = StringGrid1->FixedRows; i < StringGrid1->RowCount; i++)
     7     {
     8         for (int j = StringGrid1->FixedCols; j < StringGrid1->ColCount; j++)
     9         {
    10             StringGrid1->Cells[i][j] = i * 10 + j;
    11         }
    12     }
    13 }
    14  
    15 // ---------------------------------------------------------------------------
    16 // 在StrinGrid的OnDrawCell事件中在指定的单元格绘制按钮
    17 void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
    18       int ARow, TRect &Rect, TGridDrawState State)
    19 {
    20     TStringGrid *sg = dynamic_cast<TStringGrid *>(Sender);
    21  
    22     // 填充背景,准备重绘
    23     sg->Canvas->FillRect(Rect);
    24  
    25     // 如果当前正在绘制第三行第四列的格子(准备内嵌按钮的格子)
    26     if (ARow == 3 && ACol == 4)
    27     {
    28         // 63 63 72 75 6E 2E 63 6F 6D
    29         // 用StringGrid的Tag作按钮弹起或按下的标志, 1为弹起, 0为按下
    30         if (sg->Tag == 1)
    31             DrawFrameControl(sg->Canvas->Handle, &Rect,
    32                     DFC_BUTTON, DFCS_BUTTONPUSH | DFCS_PUSHED);
    33         else
    34             DrawFrameControl(sg->Canvas->Handle, &Rect,
    35                     DFC_BUTTON, DFCS_BUTTONPUSH);
    36     }
    37  
    38     // 以背景透明方式绘制出单元格的字符串
    39     sg->Canvas->Brush->Style = bsClear;
    40  
    41     sg->Canvas->TextOut(Rect.Left + 2,
    42             (Rect.Height() - sg->Canvas->TextHeight("A") ) / 2 + Rect.Top,
    43             sg->Cells[ARow][ACol]);
    44 }
    45  
    46 // ---------------------------------------------------------------------------
    47 // 在StringGrid的OnMouseDown事件中判断如果当前鼠标下的格子是指定的格子
    48 // 就改变StringGrid->Tag并使其重绘,以显示出按钮被按下的样子
    49 void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender,
    50       TMouseButton Button, TShiftState Shift, int X, int Y)
    51 {
    52     TStringGrid *sg = dynamic_cast<TStringGrid *>(Sender);
    53     if (!sg) return;
    54  
    55     // 获取StringGrid中当前鼠标下的行和列
    56     int nCol, nRow;
    57     TPoint ptMouse = sg->ScreenToClient(Mouse->CursorPos);
    58     sg->MouseToCell(ptMouse.x, ptMouse.y, nCol, nRow);
    59  
    60     sg->Tag = nRow == 3 && nCol == 4? 1: 0;
    61     sg->Invalidate();
    62 }
    63  
    64 // ---------------------------------------------------------------------------
    65 // 在StringGrid的OnMouseUp事件中判断如果当前鼠标下的格子是指定的格子
    66 // 就改变StringGrid->Tag并使其重绘,以显示出按钮被弹起的样子
    67 void __fastcall TForm1::StringGrid1MouseUp(TObject *Sender,
    68       TMouseButton Button, TShiftState Shift, int X, int Y)
    69 {
    70     TStringGrid *sg = dynamic_cast<TStringGrid *>(Sender);
    71     if (!sg) return;
    72  
    73     // 获取StringGrid中当前鼠标下的行和列
    74     int nCol, nRow;
    75     TPoint ptMouse = StringGrid1->ScreenToClient(Mouse->CursorPos);
    76     sg->MouseToCell(ptMouse.x, ptMouse.y, nCol, nRow);
    77  
    78     sg->Tag = 0; // 注意这里和上面OnMouseDown的不同
    79     sg->Invalidate();
    80  
    81     // 在OnMouseUp事件中处理点击事件
    82     if (nRow == 3 && nCol == 4)
    83     {
    84         // 这里加入自己的代码即可
    85  
    86         ShowMessage(String().sprintf(
    87                 TEXT("按钮 %s 被点击"), sg->Cells[nRow][nCol]));
    88     }
    89 }
  • 相关阅读:
    Delphi XE5 android 蓝牙通讯传输
    Delphi XE5 android toast
    Delphi XE5 android openurl(转)
    Delphi XE5 如何设计并使用FireMonkeyStyle(转)
    Delphi XE5 android 捕获几个事件
    Delphi XE5 android listview
    Delphi XE5 android 黑屏的临时解决办法
    Delphi XE5 android popumenu
    Delphi XE5 android 获取网络状态
    Delphi XE5 android 获取电池电量
  • 原文地址:https://www.cnblogs.com/kernel0815/p/3281656.html
Copyright © 2011-2022 走看看