Cpp Builder 11 TAdvStringGrid 自绘制和鼠标滚轮的问题

首先咱们说说自绘制, 表格要填充内容,具体代码如下:

int count = [ data row count]

AdvStringGrid1->HideFocusRect=true;  //隐藏表格选中时的虚线框

// 表格初始化,表头要定好
AdvStringGrid1->Clear();   //清空表格内容
AdvStringGrid1->RowCount = count + 1;  //留一行作为表头,所以总的函数+1
AdvStringGrid1->RowHeights[0] = 47;  //第一行表头的行高度
AdvStringGrid1->Cells[0][0] = "ID";
AdvStringGrid1->ColWidths[0] = 0;  //宽度为0,就是要隐藏第0列的数据
   
AdvStringGrid1->Cells[1][0] = "编号";  //只是第1列的字段名,作为表头内容
AdvStringGrid1->ColWidths[1] = 60;     //设置第1列的像素宽度
AdvStringGrid1->Cells[2][0] = "时间";
AdvStringGrid1->ColWidths[2] = 180;
AdvStringGrid1->Cells[3][0] = "问题描述";
AdvStringGrid1->ColWidths[3] = 200;
AdvStringGrid1->Cells[4][0] = "分析类型";
AdvStringGrid1->ColWidths[4] = 100;
AdvStringGrid1->Cells[5][0] = "文件列表";
AdvStringGrid1->ColWidths[5] = 300;

//定义好表头之后来填充数据

for(int i=0; i < count; i++)
{
  int ARow = i + 1;
  
  AdvStringGrid1->RowHeights[ARow] = 47;
  AdvStringGrid1->Cells[0][ARow] = [key];
  AdvStringGrid1->Cells[1][ARow] = [key];
  AdvStringGrid1->Cells[2][ARow] = [timestamp];
  AdvStringGrid1->Cells[3][ARow] = [info];
  AdvStringGrid1->Cells[4][ARow] = [event];
  AdvStringGrid1->Cells[5][ARow] = [files];

}

需要设置表格的默认属性,还有就是在合适的地方刷新表格内容:

/*
MouseActions:  
{
    RowSelect = true  //鼠标滚动可以对表格的行进行选中

    WheelIncrement = 1  //滚动的偏移
}
*/

// 表格内容居中对齐
void __fastcall TForm1::AdvStringGrid1GetAlignment(TObject *Sender, int ARow, int ACol,
          TAlignment &HAlign, TVAlignment &VAlign)
{
	HAlign = taCenter;
    VAlign = vtaCenter;
}

void __fastcall TForm1::AdvStringGrid1ScrollCell(TObject *Sender, int ACol, int ARow,
          int ScrollPosition, int ScrollMin, int ScrollMax)
{
      ActionLogReqRefresh->Execute();
}
//---------------------------------------------------------------------------


void __fastcall TForm1::AdvStringGrid1SelectCell(TObject *Sender, int ACol, int ARow,
          bool &CanSelect)
{
	if(ARow > 0)
	{
        CanSelect = true;
	}
	else
	{
		CanSelect = false;  // 第一行作为表头,不允许被选中
	}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::AdvStringGrid1ClickCell(TObject *Sender, int ARow, int ACol)

{
	if(ARow > 0)
	{
    	AdvStringGrid1->RowSelect[ARow] = true;
		ActionLogReqRefresh->Execute(); // AdvStringGrid1->Invalidate();
	}
}
//---------------------------------------------------------------------------

//  按键也会影响到表格,所以操作按键也需要刷新表格内容
void __fastcall TForm1::AdvStringGrid1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
{
	if(Key == VK_UP || Key == VK_DOWN)
	{
		ActionLogReqRefresh->Execute(); // AdvStringGrid1->Invalidate();
    }
}

//---------------------------------------------------------------------------

void __fastcall TForm1::AdvStringGrid1SelectionChanged(TObject *Sender, int ALeft,
		  int ATop, int ARight, int ABottom)
{
	ActionLogReqRefresh->Execute();  // AdvStringGrid1->Invalidate();
}

最后咱们来说一下自绘制表格控件;

void __fastcall TForm1::AdvStringGrid1DrawCell(TObject *Sender, int ACol, int ARow,
		  TRect &Rect, TGridDrawState State)
{
		if(ARow>= 0)
		{
			AdvStringGrid1-> Canvas-> Brush-> Style = TBrushStyle::bsSolid;
			if(ARow >= 1)
			{
				if(AdvStringGrid1->RowSelect[ARow])
				{
					AdvStringGrid1-> Canvas-> Brush-> Color   =  (TColor)0xf9f6f3;
				}
				else
				{
					AdvStringGrid1-> Canvas-> Brush-> Color   =   (TColor)clWhite;
				}
			}
			else
			{
				AdvStringGrid1-> Canvas-> Brush-> Color   =  (TColor)0xf9f6f3;
			}
//			Rect.Right = Rect.Right + 1;


			AdvStringGrid1-> Canvas-> FillRect(Rect);
			AdvStringGrid1-> Canvas-> Brush-> Style = TBrushStyle::bsClear;
			AdvStringGrid1-> Canvas-> Pen-> Color = clSilver;
			AdvStringGrid1-> Canvas-> Pen-> Width = 1;
//			AdvStringGrid1-> Canvas-> Rectangle(Rect);
			AdvStringGrid1-> Canvas->MoveTo(Rect.Left, Rect.Bottom);
			AdvStringGrid1->Canvas->LineTo(Rect.Right+1, Rect.Bottom);
			if(ACol >=1)
			{
				 {
						AdvStringGrid1->Canvas->Font->Size = 12;
						DrawText(AdvStringGrid1-> Canvas-> Handle,   AdvStringGrid1-> Cells[ACol][ARow].c_str(),
						-1,   (RECT*)&Rect,   DT_SINGLELINE   |   DT_VCENTER   |   DT_CENTER);
				 }
			}
			else
			{
				AdvStringGrid1->Canvas->Font->Size = 12;
				Rect.Left = Rect.left + 15;
				DrawText(AdvStringGrid1-> Canvas-> Handle,   AdvStringGrid1-> Cells[ACol][ARow].c_str(),
					-1,   (RECT*)&Rect,   DT_SINGLELINE   |   DT_VCENTER );
			}
		}
}

 自绘制表格控件,表格的每一个单元格都需要刷新背景,否则背景会残留。


版权声明:本文为vrix原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。