本文代码简单实现了类似CnPack中的一个界面效果,利用TListBox的自画。 演示图片: http://www.bccn.net/Article/UploadFDL0024/200601/20060103023924211.gif //--------------------------------------------------------------------------- // ListBox自画的另一种效果 // by ccrun(老妖) // info ccrun.com //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop
#include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TMainForm *MainForm; //--------------------------------------------------------------------------- __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { // ListBox的风格,要自画必须选lbOwnerDrawFixed和lbOwnerDrawVariable lbxMain->Style = lbOwnerDrawFixed; // 去掉ListBox的边框,可有可无 lbxMain->Ctl3D = false; // ListBox的每一项的高度 lbxMain->ItemHeight = 50; pStrList = new TStringList; // 往ListBox中添加些数据 for(int i=0; i<10; i++) { lbxMain->Items->Add("ListBox Items of " + String(i)); pStrList->Add("Second of " + String(i) + String((char)0x03) + "Third of " + String(i)); } } //--------------------------------------------------------------------------- void __fastcall TMainForm::lbxMainDrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State) { // 填充的背景颜色 lbxMain->Canvas->Brush->Color = clWhite; // 文字颜色 lbxMain->Canvas->Font->Color = clBlack; // 填充背景 lbxMain->Canvas->FillRect (Rect) ; // 圆角矩形的背景颜色 lbxMain->Canvas->Brush->Color = TColor(0x00FFF7F7); // 圆角矩形的边框颜色 lbxMain->Canvas->Pen->Color = TColor(0x00131315); // 画出圆角矩形 lbxMain->Canvas->RoundRect(Rect.Left + 3, Rect.Top + 3, Rect.Right - 2, Rect.Bottom - 2, 8, 8); // 以不同的宽度和高度再画一次,实现立体效果 lbxMain->Canvas->RoundRect(Rect.Left + 3, Rect.Top + 3, Rect.Right - 3, Rect.Bottom - 3, 5, 5); // 如果是当前选中项 if(State.Contains(odSelected)) { // 选中项的背景颜色 lbxMain->Canvas->Brush->Color = TColor(0x00FFB2B5); // 以不同的背景色画出选中项的圆角矩形 lbxMain->Canvas->RoundRect(Rect.Left + 3, Rect.Top + 3, Rect.Right - 3, Rect.Bottom - 3, 5, 5); // 选中项的文字颜色 lbxMain->Canvas->Font->Color = clBlue; // 如果当前项拥有焦点 if(State.Contains(odFocused)) // 重画焦点虚框,实际上就是擦除了原先的焦点虚框 // 我看到CnPack的设置中好象没有去除那个框. ccrun注 ::DrawFocusRect(lbxMain->Canvas->Handle, &Rect); } // 画出图标 ImageList1->Draw(lbxMain->Canvas, Rect.Left + 7, Rect.top + (lbxMain->ItemHeight - ImageList1->Height)/2, Index, true); // Item的第一行文字 lbxMain->Canvas->TextOutA(Rect.Left + 32 + 10, Rect.Top + 4, lbxMain->Items->Strings[Index]); String strTemp = pStrList->Strings[Index]; // Item的第二行文字 lbxMain->Canvas->TextOutA(Rect.Left + 32 + 10, Rect.Top + 18, strTemp.SubString(1, strTemp.Pos((char)0x03) - 1).c_str()); // Item的第三行文字 lbxMain->Canvas->TextOutA(Rect.Left + 32 + 10, Rect.Top + 32, strTemp.SubString(strTemp.Pos((char)0x03) + 1, strTemp.Length()).c_str()); } //--------------------------------------------------------------------------- // 点击ListBox以后显示点击的项目 void __fastcall TMainForm::lbxMainClick(TObject *Sender) { pnlStatusBar->Caption = " " + lbxMain->Items->Strings[lbxMain->ItemIndex]; } //--------------------------------------------------------------------------- void __fastcall TMainForm::FormShow(TObject *Sender) { lbxMain->ItemIndex = 0; lbxMain->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TMainForm::FormDestroy(TObject *Sender) { delete pStrList; } //--------------------------------------------------------------------------- void __fastcall TMainForm::lbxMainDblClick(TObject *Sender) { TEditForm *p = new TEditForm(MainForm); p->edtFirst->Text = lbxMain->Items->Strings[lbxMain->ItemIndex]; String strTemp = pStrList->Strings[lbxMain->ItemIndex]; p->edtSecond->Text = strTemp.SubString(1, strTemp.Pos((char)0x03) - 1); p->edtThird->Text = strTemp.SubString(strTemp.Pos((char)0x03) + 1, strTemp.Length()); p->pnlTitle->Caption = " 当前ListBox选中项:" + String(lbxMain->ItemIndex); p->pnlTitle->Tag = lbxMain->ItemIndex; p->Left = Left + (Width - p->Width) / 2; p->Top = Top + (Height - p->Height) / 2; p->ShowModal(); delete p; } //--------------------------------------------------------------------------- void __fastcall TMainForm::pnlTitleMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { // 移动没有标题栏的窗体 Refresh(); if(Button == mbLeft) { ReleaseCapture(); Perform(WM_SYSCOMMAND, 0xF017, 0); } } //--------------------------------------------------------------------------- void __fastcall TMainForm::btnMenuCloseClick(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TMainForm::btnMenuUpDownClick(TObject *Sender) { if(btnMenuUpDown->Caption == "6") { // 还原窗体 btnMenuUpDown->Caption = "5"; Height = 310; } else { // 上卷窗体 btnMenuUpDown->Caption = "6"; Height = 25; } } //--------------------------------------------------------------------------- void __fastcall TMainForm::imgLogoClick(TObject *Sender) { // 打开 C++Builder研究 网站 ShellExecute(Handle, NULL, "http://www.ccrun.com", NULL, NULL, SW_SHOWNORMAL); } //---------------------------------------------------------------------------
 
|