ToolBar自绘

wangcftxz 2012-05-23 11:14:15
求一个ToolBar的自绘Demo

发现ToolBar有四个Event可以自绘
OnAdvancedCustomDraw
OnAdvanceCustomDrawButton
OnCustomDraw
OnCustomDrawButton

在网上找了半天,找到想要的东西。自己又摸索了半天,还是不会。

杯具,一天过去了,没有收获。发帖求大神给一段代码,小弟感激不尽。
...全文
97 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoh1234 2012-05-23
  • 打赏
  • 举报
回复
wangcftxz 2012-05-23
  • 打赏
  • 举报
回复
妖哥一如既往的给力 膜拜
ccrun.com 2012-05-23
  • 打赏
  • 举报
回复
发一张效果图:


BTW:以上代码是在C++Builder6中编译测试的。
ccrun.com 2012-05-23
  • 打赏
  • 举报
回复
我来了!!!
先设置一下ToolBar:
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ToolBar1->Flat = true;
ToolBar1->List = true;
ToolBar1->ShowCaptions = true;
}

然后在ToolBar的OnCustomDrawButton事件事绘制按钮:
void __fastcall TForm1::ToolBar1CustomDrawButton(TToolBar *Sender,
TToolButton *Button, TCustomDrawState State, bool &DefaultDraw)
{
// 取消缺省的绘制
DefaultDraw = false;

TToolBar *tlb = ((TToolBar*)Sender);

// 当前按钮的边框
TRect rctItemBorder = Button->BoundsRect;

// 当前按钮的内部区域
TRect rctItem(rctItemBorder.Left + 1, rctItemBorder.Top + 1,
rctItemBorder.Right - 1, rctItemBorder.Bottom - 1);

if (Sender->Enabled && (State.Contains(cdsHot) || Button->Down)) // 处理热点信息
{
// 选中项的文字颜色
tlb->Canvas->Font->Color = clRed;

// 选中项的画刷和画笔颜色
tlb->Canvas->Brush->Color = (TColor)0x00EFD3C6;
tlb->Canvas->Pen->Color = clBlue;

// 绘制选中项的背景
tlb->Canvas->FillRect(rctItem);
tlb->Canvas->Rectangle(rctItemBorder);

}
else
{
// 普通按钮的文字颜色
tlb->Canvas->Font->Color = Button->Enabled && Sender->Enabled ?
clBlack: clGray;
}

// 文本字体
tlb->Canvas->Font->Name = "宋体";
tlb->Canvas->Font->Size = 9;

// 背景透明
::SetBkMode(tlb->Canvas->Handle, TRANSPARENT);

// 绘出标题
if (tlb->ShowCaptions)
{
TRect rct;
if (tlb->List) // 横排方式
{
rct = TRect(Button->Left + (tlb->Images? tlb->Images->Width + 4: 2),
Button->Top + 2, rctItem.Right, rctItem.Bottom);

::DrawTextA(tlb->Canvas->Handle, AnsiString(Button->Caption).c_str(),
Button->Caption.Length(), &rct, DT_SINGLELINE | DT_VCENTER | DT_TOP);
}
else // 竖排
{
rct = TRect(Button->Left + 2,
Button->Top + (tlb->Images?
tlb->Images->Height + 4 : 2), rctItem.Right, rctItem.Bottom);

::DrawTextA(tlb->Canvas->Handle,
AnsiString(Button->Caption).c_str(),
Button->Caption.Length(), &rct, DT_SINGLELINE | DT_CENTER | DT_LEFT);
}
}
// 绘出按钮的图标
if (tlb->DisabledImages && (!Button->Enabled || !Sender->Enabled))
{
tlb->DisabledImages->Draw(tlb->Canvas,
tlb->List ? Button->Left + 2:
Button->Left + (Button->Width - tlb->DisabledImages->Width) / 2,
tlb->List?
Button->Top + (Button->Height - tlb->DisabledImages->Height) / 2:
Button->Top + 2, Button->ImageIndex, true);
}
else
if (tlb->Images)
{
tlb->Images->Draw(tlb->Canvas,
tlb->List ? Button->Left + 2:
Button->Left + (Button->Width - tlb->Images->Width) / 2,
tlb->List?
Button->Top + (Button->Height - tlb->Images->Height)/ 2:
Button->Top + 2, Button->ImageIndex, true);
}
}
wangcftxz 2012-05-23
  • 打赏
  • 举报
回复
楼上要表达的是什么意思?看不懂啊

13,825

社区成员

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

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