有关imagelist的问题

tuiger2003 2003-05-19 01:30:45
奇怪得很,我的imagelist在窗口中显示不出来图像。程序我简化后只有一句:

void __fastcall TForm1::FormShow(TObject *Sender)
{
ImageList1->Draw(Form1->Canvas,100, 100,1,true);
}

可在窗口中显示不出来,是为什么呢?
...全文
79 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tuiger2003 2003-05-19
  • 打赏
  • 举报
回复
请指教,在线等待! :))
tuiger2003 2003-05-19
  • 打赏
  • 举报
回复
我是放一个图标在imagelist里呀,开始放16*16的bmp文件,试了不行,我又换了ico文件,可还是不行呀。我自己不画?那你是说下面的文章是错的?


  在数据栏中显示图像


  使用DBGrid1控件来全屏显示编辑数据时,为了使界面生动活泼,我们希望能根据字段枚举数值(其取值通常为几个特定值)的不同显示不同的图像。

  我们可以在DBGrid控件的OnDrawColumnCell事件中编写代码来增强DBGrid控件的显示效果,如果其DefaultDrawing属性为true,DBGrid控件在OnDrawColumnCell事件响应前按默认效果显示,然后以此为基础执行OnDrawColumnCell事件的代码。需要完全取代DBGrid控件的显示效果时,可将其DefaultDrawing属性设为false,并在OnDrawColumnCell事件中编写控制显示效果的脚本。如果希望某些列产生特定效果,可以在OnDrawColumnCell事件中调用DefaultDrawColumnCell方法,然后修正特定列的输出效果。以下示例是在DBGrid控件数据栏中显示图像效果的程序。

  新建工程,在Form1上拖放TTable、TDatasource 、TDbGrid和TImageList控件,Name属性分别是Table1、Datasource1、DbGrid1和ImageList1,然后将它们关联起来,Table1 的DatabaseName属性指向DBDEMOS(该别名指代C++ Builder自带的例程数据库表)、TableName属性为Clients.dbf、Datasource1的Dataset属性值为Table1、DbGrid1的Datasource属性等于Datasource1。使用DbGrid1的列编辑器让DbGrid1仅显示Last_Name、First_Name、Risk_Level和 Occupation四个字段,再设置DbGrid1的DefaultDrawing属性为false,然后设置ImageList1存放向下、向上、向左的三种箭头图像。DBGrid1的On DrawColumnCell事件代码如下:

  void __fastcall TGridDrawForm::DBGrid1DrawColumnCell(TObject Sender,

   const TRect &&Rect, int DataCol, TColumn Column,TGridDrawState State)

  {

  if (DBGrid1->Columns->Items[DataCol]->FieldName == "RISK_LEVEL")

   {

   DBGrid1->Canvas->FillRect(Rect);

   if (DBGrid1->Columns->Items[DataCol]->Field->AsString == "LOW")

   {//字段值为“LOW”,绘制向下的箭头

   ImageList1->Draw(DBGrid1->Canvas,Rect.Left+4,Rect.Top,0,True);

   }

   else if (DBGrid1->Columns->Items[DataCol]->Field->AsString == "MED")

   {//字段值为“MED”,绘制向左的箭头

   ImageList1->Draw(DBGrid1->Canvas,Rect.Left+4,Rect.Top,1,True);

   }

   else

   {//否则绘制向上的箭头

   ImageList1->Draw(DBGrid1->Canvas,Rect.Left+4,Rect.Top,2,True);

   }

   }

   else

   DBGrid1->DefaultDrawColumnCell(Rect,DataCol,Column,State);

   }

   当绘制DBGrid时,绘制屏幕上当前可见行的每个数据单元都调用上述事件过程。DataCol用于显示DBGrid的Columns属性的顺序。根据DataCol值可以确定将绘制的数据单元的栏目名称。此例中,如果栏目的字段不是“Risk_Level”则调用DefaultDrawColumnCell方法,使其成默认的显示效果。反之,则先调用FillRect方法清除背景,然后根据该字段值的不同,调用ImageList的Draw方法,实施对象是DBGrid控件的画布对象,Rect中参数Left和Top值决定了绘制坐标的位置,图像列表中不同的值决定了产生图像的不同。

whp320 2003-05-19
  • 打赏
  • 举报
回复
Imagelist不能这么用,你不自己画。找一个图表放到Imagelist里面,肯定可以显示出来。
tuiger2003 2003-05-19
  • 打赏
  • 举报
回复
我的问题其实是在dbGrid中一个字段上画出图像,当值为1时显示imagelist2的第二个图像。请再帮忙看看哪儿有错?
  void __fastcall TForm1::Grid_MailDrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
   {   
   if (Grid_Mail->Columns->Items[DataCol]->FieldName == "Import")
{
Grid_Mail->Canvas->FillRect(Rect);
if (Column->Field->AsBoolean == true)
{
Grid_Mail->Canvas->Brush->Color = clBlue;
ImageList2->Draw(Grid_Mail->Canvas,Rect.Left,Rect.Right,1,true);
}
}
else
Grid_Mail->DefaultDrawColumnCell(Rect,DataCol,Column,State);
   }
tuiger2003 2003-05-19
  • 打赏
  • 举报
回复
那如果在一个dbgrid的DrawColumnCell(TObject *Sender,const TRect &Rect, int DataCol, TColumn *Column,TGridDrawState State)里画呢?
我在一个cell里也画不出来,也没有paint事件呀?
hitbabiq 2003-05-19
  • 打赏
  • 举报
回复
没错,在show的时候不能显示,该在Form的OnPaint中。
pp616 2003-05-19
  • 打赏
  • 举报
回复
ImageList1->Draw(Form1->Canvas,100, 100,1,true);
这是没问题的。问题在你放错的地方。
你应该放到FormPaint中。
Sephil 2003-05-19
  • 打赏
  • 举报
回复
不要在Form上画
在Image上画试试
tuiger2003 2003-05-19
  • 打赏
  • 举报
回复
我自己解决了。并非是不能用imagelist->draw这种方法,而是不能在上面用其他颜色的brush ,否则画了以后,系统用自动调用drawcolumncell再重画 :(  所以始终看不到结果,一次次地重画。大家要切记。 另外,如果想在选定行中以其他颜色显示,要用drawcell方法进行重载才可以。参见下面的文章:

http://sanjianxia.myrice.com/delphi/158.htm

考虑到我开始的问题朋友们已经给出了答案,我结帖!

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧