delphi中为自定控件绘制windows按钮

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
 

若要自定工具拦,但也要保留windows样式的按钮时

下面给出一种实现

procedure TmyButton.defaultdraw;
var arect,R:Trect;
    wpos,hpos:integer;
    Details: TThemedElementDetails;
begin
  hpos:=0;
  arect:=self.ClientRect;
  canvas.Font:=font;
  canvas.Brush.Color:=$CCFFFF;
  if assigned(fimagelist) then
  begin
    if (fimagelist.Count>0) or (fimage>=0) then
    begin
      wpos:=(width-imagelist.Width) div 2;
      if fhot and ( not (csDesigning in ComponentState) ) then
      begin
        R:=rect(wpos-8,0,wpos+fimagelist.width+8,fimagelist.Height+16);
        if ThemeServices.ThemesEnabled then
        begin
          if fdown then
          begin
            Details := ThemeServices.GetElementDetails(themes.ttbButtonPressed);
          end
          else
            Details := ThemeServices.GetElementDetails(themes.ttbButtonHot);
          ThemeServices.DrawElement(Canvas.Handle, Details, R, nil);
        end
        else
        begin
          if fdown then
          begin
            canvas.FillRect(r);
            DrawEdge(Canvas.Handle, R, BDR_SUNKENOUTER, BF_RECT);
          end
          else
            DrawEdge(Canvas.Handle, R, BDR_RAISEDINNER, BF_RECT);
        end;
      end;
      fimagelist.Draw(canvas,wpos,8,fimage);
      hpos:=hpos+fimagelist.Height+20;
    end;
    canvas.Brush.Style:=bsclear;
    wpos:=(width-canvas.textwidth(fcaption)) div 2;
    canvas.TextOut(wpos,hpos,fcaption);
    exit;
  end;
  wpos:=(width-canvas.textwidth(fcaption)) div 2;
  hpos:=4;
  canvas.TextOut(wpos,hpos,fcaption);
  if fhot and ( not (csDesigning in ComponentState) ) then
  begin
    if fdown then
      DrawEdge(canvas.Handle,arect,EDGE_ETCHED,BF_FLAT or BF_RECT)
    else
      DrawEdge(canvas.Handle,arect,EDGE_RAISED,BF_FLAT or BF_RECT);
  end;
end;

 
Windows API 关于控件的自绘——文本颜色、背景颜色、字体 首先要将控件设置为可以自画,例如:要自画一个按钮,在窗口的WM_CREATE中创建类名为“BUTTON”的子窗口,风格必须包含BS_OWNERDRAW。然后在父窗口的WM_DRAWITEM中编写自画按钮的样式,可以包含字体,背景,文本颜色等。由查询MSDN中WM_DRAWITEM可知,该消息包含两个参数:控件id以及自画信息,自画信息为一个自画结构体,该结构体包含自画需要的各种信息,通过强制转换l... 阅读详情

相关推荐

Delphi控件开发入门与实战指南

控件开发是Windows桌面应用开发的核心技术之一,通过对原生API的封装实现可视化编程。Delphi的VCL框架采用TComponent基类体系,分为TWinControl和TGraphicControl两大分支,分别处理带窗口句柄和纯图形绘制场景。在RAD开发环境中,自定控件能显著提升界面复用率,典型应用包括数据感知组件、增强型UI控件等。本文以TButton继承开发为例,演示了从属性定义、消息处理到安装部署的全流程,并涵盖双缓冲绘图、多线程安全等进阶技巧,帮助开发者掌握Delphi控件开发的核心方法

dbp5156的博客 298

如何改变delphi按钮的样式

在标准的Windows程序中所有按钮均没有颜色。因此Delphi提供的所有按钮组件也均无颜色属性,有时你可能做了一个五颜六色的程序界面,而按钮颜色可能很不相称。 在此本人提供一种用自定义组件制作有颜色属性的铵钮的方法,它遵循了Delphi的组件定义规则,完成后该按钮与普通按钮(Button)相比,多了一个Color属性,你可以永远地使用它,在设计阶段随意地改变颜色,就象是Delphi本身提供的组件一样(本文代码在Delphi 4.0下完成)。

Delphi多风格皮肤控件资源包

Delphi 自诞生以来,便以其高效的开发效率和强大的可视化能力在桌面应用开发领域占据一席之地。其核心组件库 VCL(Visual Component Library)为开发者提供了丰富的控件资源与高度可定制的界面设计能力。随着用户对界面美观性与交互体验要求的不断提升,Delphi 的界面设计也从传统的 Win32 风格逐步迈向现代视觉风格的定制与美化。本章将首先介绍 Delphi 界面设计的基础架构,包括 VCL 的组件模型与绘图机制;

weixin_42588672的博客 511

Delphi自绘控件

delphi快一年了,自己写了个控件,写的不好大家互相学习

四种风格自绘按钮,包括渐变色、位图按钮,可指定颜色、字体及图标

四种风格自绘按钮,包括渐变色、位图按钮,可指定背景及文字颜色、字体及图标。 字体可设置加粗、斜体、下划线。图标可与文字同时显示。 位图按钮有去背景功能,因此实际上可做出任意形状按钮。各种状态的按钮图及黑白遮盖图均集中于一张图片中,软件res目录下提供参考样图。

Delphi 组件开发教程指南(9)定制特色Button之QQ按钮

在上一章节,咱们实现了一个定制特色按钮的框架,不晓得列位看官,将里面的信息都消化了没有。如果都消化完全,那么现在请跟着俺的脚本来着手定制一个QQ的效果按钮。常理上,先分析一下,需要的几个效果还是上章所说的那几个效果,只是本次我们需要将上次的那个丑陋的效果换成皮肤的效果,这个皮肤的效果怎么来呢!呵呵,很简单,会PS的自己PS,不会的就直接去搞QQ的图片,抓个图,然后搞出来就行啦!抓到的图...

weixin_30929295的博客 145

Delphi TListview自绘某列添加图片按钮并实现点击事件响应

【代码】Delphi TListview中某列添加图片按钮并实现点击事件响应。

wh445306 1789

delphi-学习类的例子(带指示灯按钮的实现)

====================================================== 注:重要!程序员如何有效的放松身心!下班后做什么? ====================================================== 刷新评论列表刷新页面返回页首 发表评论 昵称: [登录] [注册] 主页: 邮箱:(仅博主可见) 验证

114

窗体样式使用WS_EX_LAYERED后,无法绘制windows控件的解决办法

根据一副png图片绘制半透明窗体时,用了WS_EX_LAYERED后当前窗体再也不会处理paint事件,所以所含的子控件是一辈子也不会画出来的,但是这个控件确实存在,而且可以响应事件 。而此时windows画制窗体是使用UpdateLayeredWindow这个api函数的。其实这个问题,3年前就在csdn网友miky的"笨笨钟"发布后就讨论过了,后来出了一个叫桌面天气秀的东东也采用类似的

jinjazz 1万+

Delphi标题栏自定按钮添加实战项目

Delphi开发中,实现对Windows原生界面元素的深度定制,尤其是标题栏区域的扩展功能(如添加自定按钮),必须突破VCL框架的标准控件限制。虽然Delphi提供了TButton、TBitBtn等丰富的可视化组件,但这些控件默认只能嵌入客户区(Client Area),无法直接绘制于系统管理的非客户区(Non-Client Area),例如标题栏、边框或滚动条区域。

weixin_33245447的博客 411

Delphi对于控件的SuperClassing

Windows内部预定义了一些通用的控件,我们在用这些控件的时候不必再调用RegisterClass注册一个窗口类,只要直接调用CreateWindows,并指定一个预定义的窗口类就可以,比如,我们要创建一个Button,只要用如下形式即可:CreateWindows(.., ‘BUTTON’,...)。但用Delphi写出来的程序,用SPY看它的某个控件的窗口类名,却是这个控件类的ClassNa

colin 3190

DELPHI 动态创建按钮 BUTTONG

DELPHI XE 10 动态建立按钮,XE10下可直接使用。可以直接用

DELPHI美化界面[转载]

手头的项目做的差不多了,交给客户,结果给出的结论是界面太难看了,至少要做成像QQ类似的界面。(目前是QQ2009界面确实还是不错的,本人也非常喜欢)。 1.透明问题。 要重新调整界面确实很麻烦,以前用DELPHI开发的界面都很土,和WEB真是没办法比。(我以前用的是DELPHI7),现在回想起来,DELPHI难做的原因是:没有透明控件。所有控件都是不透明的,并且大部分控件就是...

weixin_30530939的博客 3723

Delphi RC5.0控件:强化Windows应用界面与功能

在现代软件开发中,用户界面(UI)的美观性和用户体验(UX)至关重要。优秀的UI不仅能够吸引用户,还能提高应用程序的可用性和功能性。自定控件能够扩展UI设计的可能性,让开发人员根据特定需求创造出独特的界面元素。本章将详细介绍如何开发自定控件,并分享UI设计的最佳实践。在设计自定控件之前,开发者需要明确几个关键点:目标功能与应用场景:确定控件的目的,以及它将在什么样的UI环境中使用。这将帮助你确定控件的基本外观和行为。用户体验:考虑目标用户群体和他们的使用习惯。

weixin_28793831的博客 700

DrawFrameControl 绘制标准控件

BOOL DrawFrameControl( HDC hDC, // 设备环境句柄 LPRECT lpRect, // 矩形区域 UINT nType, // 控件类型 UINT nState // 控件状态); // 控件类型 uType 参数 DFC_CAPTION = 1; // 标题DFC_MENU = 2; /...

weixin_34186128的博客 1309

Delphi中彻底卸载ActiveX控件的方法

最近为了做一个项目,尝试了很多皮肤控件,其中一个使用ocx。尝试完后希望能够彻底删除,可是从component->import ActiveX Control中删除后再ActiveX标签中还是能够找到,而且,放置到窗口时会提示没有注册类别。 在网上搜索了一下相关的信息,希望能够彻底卸载这个控件。终于在下面这个地方找到了方法。 注销ActiveX控件 为了避免以后这个页面失效,下面简要的把这个

lixianhuo的专栏 746

Delphi控件安装方法

基本安装 1、对于单个控件,Componet-->install component..-->PAS或DCU文件-->install; 2、对于带*.dpk文件的控件包,File-->Open(下拉列表框中选*.dpk)-->install即可; 3、对于带*.bpl文件的控件包,Install Packages-->Add-->bpl文件名即可; 4、如果以上Install按钮为失效的话,试

alongwilliam的专栏 1161

Delphi中显示Windows图标

栏目刊登了一篇《提取图标的Delphi控件》的文章,所介绍的方法可以用于提取包含在文件中的图标,但对于本身没有包含图标的文件却无法像Windows的“资源管理器”那样显示出其默认的图标。本文介绍了在Delphi的ListView组件中显示这种图标的方法,和《提取图标的Delphi控件》一文结合起来就可以显示出几乎所有的图标了。该方法的一大特色是不用绘制任何图标就能够显示许多Windows图标。 -

1786

Delphi美化界面 转载

手头的项目做的差不多了,交给客户,结果给出的结论是界面太难看了,至少要做成像QQ类似的界面。(目前是QQ2009界面确实还是不错的,本人也非常喜欢)。 1.透明问题。 要重新调整界面确实很麻烦,以前用DELPHI开发的界面都很土,和WEB真是没办法比。(我以前用的是DELPHI7),现在回想起来,DELPHI难做的原因是:没有透明控件。所有控件都是不透明的,并且大部分控件就是灰色的,...

168
上一篇: fastreport2.5中直接打印报表到打印机
下一篇: delphi中常用字符处理函数(系统未提供的)
ljq900
博客等级 码龄20年 7粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值