如何自画ListView的Item(XP效果)
2008-02-23 05:37:21来源:互联网 阅读 ()
关于VCL控件自画的代码先前ccrun发过很多,比如TListBox, TCheckListbox, TComboBox, TMenuItem等,下面的代码是自绘TListItem,也就是ListView在ViewStyle为vsReport时Item的自画。效果图如下:
首先定义几个我们需要用到的颜色,这里用的是Office 2003菜单的高亮条颜色:
#define MYCOLOR_BACK TColor(0x00CFB9B1)
#define MYCOLOR_BORDER clHighlight
#define MYCOLOR_ROW TColor(RGB(240, 240, 240))
一般来讲,VCL中提供了自画功能的控件都有类似OnDrawXX或OnCustomDrawXX的事件,ListView有四个类似的事件,这个例子中我们使用OnDrawItem事件。
在窗体的头文档中,声明一下自画函数,能够放在Form类的__published段内,需要注意的是,由IDE自动产生的ListViewOnDrawItem自画函数的参数和我们声明的这个略有不同,所以在设计界面上,ListView的OnDrawItem中是看不到这个函数的。
private: // User declarations
void __fastcall CrnDrawListViewItem(TCustomListView *Sender,
TListItem *Item, TRect &Rect, TOwnerDrawState State);
下面是自画函数的具体实现代码:
//---------------------------------------------------------------------------
// 自画ListView的Item
// by ccrun(老妖) info#ccrun.com
// 欢迎光临 C Builder研究 - http://www.ccrun.com
// 做人要厚道,转载要留名
//---------------------------------------------------------------------------
void __fastcall TForm1::CrnDrawListViewItem(TCustomListView *Sender,
TListItem *Item, TRect &Rect, TOwnerDrawState State)
{
TListView *lv = (TListView *)Sender;
// Rect
TRect rct(Rect.Left 1, Rect.Top, Rect.Width() - 1, Rect.Bottom);
// Fill background
if(State.Contains(odFocused) || State.Contains(odSelected))
{
// With focus
lv->Canvas->Brush->Color = MYCOLOR_BACK;
lv->Canvas->FillRect(rct);
lv->Canvas->Pen->Color = MYCOLOR_BORDER;
lv->Canvas->Rectangle(rct);
}
else
{
lv->Canvas->Brush->Color = lv->Color;
lv->Canvas->FillRect(Rect);
}
int nLeftOffset(0);
// With CheckBox?
// 63 63 72 75 6E 2E 63 6F 6D
// 本文转自 C Builder 研究 - http://www.ccrun.com/article.asp?i=656&d=qdc7kg
if(lv->Checkboxes)
{
lv->Canvas->Pen->Color = clBlack;
lv->Canvas->Pen->Width = 2;
// Draw CheckBox Rect
lv->Canvas->Rectangle(Rect.Left 4, Rect.Top 3, Rect.Left 16, Rect.Bottom - 2);
nLeftOffset = 16;
if(Item->Checked)
{
// 画CheckBox的勾
lv->Canvas->MoveTo(Rect.Left 6, Rect.Top 6);
lv->Canvas->LineTo(Rect.Left 8, Rect.Top 11);
lv->Canvas->LineTo(Rect.Left 13, Rect.Top 5);
}
lv->Canvas->Pen->Width = 1;
}
// Draw small Icon
if(lv->SmallImages && Item->ImageIndex != -1)
{
lv->SmallImages->Draw(lv->Canvas, nLeftOffset Rect.Left 2,
Rect.Top (Rect.Height() - lv->SmallImages->Height) / 2 1,
Item->ImageIndex, true);
nLeftOffset = lv->SmallImages->Width;
}
// Draw Text
lv->Canvas->Font->Color = clBlack;
lv->Canvas->TextOutA(Rect.Left 4 nLeftOffset,
Rect.Top (Rect.Height() - lv->Canvas->TextHeight("A")) / 2,
Item->Caption);
// Draw SubItem Text
int nColOffset(0);
for(int i=0; i<Item->SubItems->Count; i )
{
nColOffset = lv->Column[i]->Width;
lv->Canvas->TextOutA(nColOffset Rect.Left 4,
Rect.Top (Rect.Height() - lv->Canvas->TextHeight("A")) / 2,
Item->SubItems->Strings[0]);
}
}
// 自画代码结束
由于这个自画函数和IDE自动产生的不相同,所以需要动态指定ListView的OnDrawItem,同时,ListView还需要一些配置,当然,您能够在设计时直接在属性中更改。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 获取PE文档的导出函数列表
下一篇: 不依赖于DLL就能工作的全局钩子
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash