前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于PowerBuilder的搜索

PowerBuilder制作IE风格的图标按钮 - PowerBuilder/PB技术交流站(PB源码PB论坛PB框架PB编程框架 PB类库仿SBO编程框架PB即时通讯PBIMPBQQ电子邮件短信平台文档编辑器智能升级工作流) - PB创新网 Email:2322888@qq.com 原创产品定制开发PB培训技术文章编程论坛关于我们 首页 PowerBuilder制作IE风格的图标按钮 减小字体 增大字体 作者:佚名 来源:本站整理 发布时间:2009-03-16 23:05:48 ---- 本文介绍在PowerBuilder中实现IE风格的图标按钮的技巧。在C++ Builder开发工具中,有一种图标按钮(SpeedButton),这种按钮可以在鼠标移入按钮后,在图片的周围会出现凸出的边框,鼠标移出按钮后边框消失。而在PowerBuilder中没有提供这种功能的按钮,为了使开发的应用程序界面更丰富,我们使用自定义图形控件(Picture)扩展并实现了此功能,这种方法设计出的程序简洁实用。 ---- 一、实现功能 ---- 按钮可以显示四种状态图形: ---- 1、Normal状态; ---- 2、Disabled状态; ---- 3、MouseOver状态(鼠标进入按钮区); ---- 4、ClickDown状态(鼠标按下)。 ---- 二、关键方法 ---- 1、当鼠标进入按钮区域时,控件图片改换成MouseOver状态的图片,并设置状态信号; ---- 2、鼠标滑入按钮区域后用Windows API函数SetCapture来捕获鼠标输入消息,跟踪鼠标位置; ---- 3、当监测到鼠标滑出按钮区域时,用ReleaseCapture函数释放鼠标捕获,恢复按钮图片到Normal状态并设置状态信号; ---- 4、改变控件的图片(PictureName)前,先用ReleaseCapture释放鼠标捕获,然后改变PictureName属性值,接着重新调用SetCapture函数,因为改变图片后PowerBuilder重新建立了控件窗口,窗口的句柄(hWnd)也随之改变了。 ---- 三、设计过程 ---- 1、新建“User Object” -〉选择Visual的Standard类 -〉选择“Picture”; ---- 2、定义全局的或局部的外部函数: // ******************************* // Declare External Functions // ******************************* function ulong SetCapture (ulong hwnd) library "user32.dll" function boolean ReleaseCapture (ulong hwnd) library "user32.dll" function boolean DrawEdge(ulong hdc, ref rect qrc, uint edge, uint grfFlags) library "user32.dll" ---- 3、定义结构数据类型 RECT { long left long top long right long bottom } ---- 4、定义控件共享变量: // ******************************* // Declare Shared Variables // ******************************* boolean sb_SupdivssHoverBorder ---- 5、定义控件实例变量: // ******************************* // Declare Instance Variables // ******************************* Private: boolean ib_MouseCaptured Public: string is_PicNormal string is_PicDisabled string is_PicMouseOver string is_PicClickDown int in_State ---- 6、定义用户事件: // ******************************* // Declare User Events // ******************************* Event Name="mousemove", ID="pbm_mousemove" Event Name="lbuttondown", ID="pbm_lbuttondown" Event Name="lbuttonup", ID="pbm_lbuttonup" ---- 7、编写事件代码: // “Constructor” 事件代码 // *** begin constructor event *** // is_PicNormal = this.PictureName is_PicDisabled = "Disabled状态图片.bmp" is_PicMouseOver = "MouseOver状态图片.bmp" is_PicClickDown = "ClickDown状态图片.bmp" in_State = 0 sb_SupdivssHoverBorder = FALSE // // *** end constructor event *** // “MouseMove” 事件代码 // *** begin mousemove event *** // rect lr_Border if not ib_MouseCaptured then if flags < > 1 then this.PictureName = is_PicMouseOver else // Left Button Down this.PictureName = is_PicClickDown end if in_State = 1 SetCapture(handle(this)) ib_MouseCaptured = TRUE if not sb_SupdivssHoverBorder then lr_Border.left = 0 lr_Border.top = 0 lr_Border.right = UnitsToPixels (this.Width, XUnitsToPixels!) lr_Border.bottom = UnitsToPixels (this.Height, YUnitsToPixels!) if flags < > 1 then DrawEdge(GetDC(handle(this)), lr_Border, 4, 1+2+4+8) else // Left Button Down DrawEdge(GetDC(handle(this)), lr_Border, 2, 1+2+4+8) end if end if else // 检测鼠标是否滑出按钮区域? if (XPos < 0 or YPos < 0) or (XPos > this.Width or YPos > this.Height) then ib_MouseCaptured = FALSE ReleaseCapture() in_State = 0 this.PictureName = is_PicNormal end if end if return 1 // // *** end mousemove event *** // “LButtonDown” 事件代码 // *** begin lbuttondown event *** // rect lr_Border if ib_MouseCaptured then ib_MouseCaptured = FALSE ReleaseCapture() end if in_State = 2 this.PictureName = is_PicClickDown SetCapture(handle(this)) ib_MouseCaptured = TRUE if not sb_SupdivssHoverBorder then lr_Border.left = 0 lr_Border.top = 0 lr_Border.right = UnitsToPixels (this.Width, XUnitsToPixels!) lr_Border.bottom = UnitsToPixels (this.Height, YUnitsToPixels!) DrawEdge(GetDC(handle(this)), lr_Border, 2, 1+2+4+8) end if return 1 // // *** end lbuttondown event *** // “LButtonUp” 事件代码 // *** begin lbuttonup event *** // rect lr_Border if ib_MouseCaptured then ib_MouseCaptured = FALSE ReleaseCapture() end if if (XPos < 0 or YPos < 0) or (XPos > this.Width or YPos > this.Height) then in_State = 0 this.PictureName = is_PicNormal else in_State = 1 this.PictureName = is_PicHover SetCapture(handle(this)) ib_MouseCaptured = TRUE if not sb_SupdivssHoverBorder then lr_Border.left = 0 lr_Border.top = 0 lr_Border.right = UnitsToPixels (this.Width, XUnitsToPixels!) lr_Border.bottom = UnitsToPixels (this.Height, YUnitsToPixels!) DrawEdge(GetDC(handle(this)), lr_Border, 4, 1+2+4+8) end if end if // 产生Clicked事件 this.event post clicked() return 1 // // *** end lbuttonup event *** // “Other” 事件代码 // *** begin other event *** // if message.number = 533 and ib_MouseCaptured then // wm_CaptureChanged ib_MouseCaptured = FALSE in_State = 0 this.PictureName = is_PicNormal return 1 end if return 0 // // *** end other event *** ----  四、简要说明 ---- 1、ib_MouseCaptured变量是作为MouseMove事件的刷新控件图片的信号灯及判断是否已安装了鼠标捕捉器; ---- 2、sb_SupdivssHoverBorder变量,默认值为FALSE,当值为TRUE时,控件不绘制凸或凹边框; ---- 3、“Other”事件,当鼠标捕捉器被释放或被替换时会触发WM_CAPTURECHANGED事件,例如:您在Clicked事件中调用MessageBox函数时,将触发WM_CAPTURECHANGED事件,在此事件代码中恢复按钮到Normal状态。 Tags:作者:佚名 [] [返回上一页] [打 印] 0 好的评价 如果您觉得此文章好,就请您 0%(0) 差的评价 如果您觉得此文章差,就请您 0%(0) 用户名: ! 查看更多评论 分 值:100分 85分 70分 55分 40分 25分 10分 1分 内 容: ! 通知管理员 验证码: 点击获取验证码 栏目导航 PowerBuilder 数据库开发 本类热门阅览 1PB中的数据窗口自动刷新技术 2优化你的PowerBuilder程序 3在PB中实现ftp传输 4浅谈PB中动态DataWindow的技术应 5在PB中动态修改SQL语句 6PB修改数据库表结构的技巧 7pb实用代码集(全有例程) 8PB中读取地磅BCD解码 9PB程序中在普通激光打印机上实现 10如何发布独立的PowerBuilder应用 11在PB中调用外部程序并判断其运行 12PowerBuilder中实现数据窗口打印 13在MicroHelp Bar上显示时间 14PowerBuilder菜单属性的修改 15在PB中实现对EXCEL的操作 16PowerBuilder制作IE风格的图标按 17GRAPH在PowerBuilder中的应用在线 18在pb中用winsock控件使用问题 19如何得到下拉数据窗口DDDW列的显 20PB 5中PFC的使用 相关文章 &rsaquo; 优化你的PowerBuilder程序 &rsaquo; 如何发布独立的PowerBuilder应用... &rsaquo; 利用PowerBuilder开发数据库的WE... &rsaquo; 采用Sybase、PowerBuilder、Note... &rsaquo; PowerBuilder中实现数据窗口打印... &rsaquo; PowerBuilder中的几个注册表函数... &rsaquo; PowerBuilder制作IE风格的图标按... &rsaquo; PowerBuilder7.0在Internet中的应... &rsaquo; PowerBuilder程序出错处理 &rsaquo; PowerBuilder菜单属性的修改 &rsaquo; PowerBuilder 特性 &rsaquo; PowerBuilder 开发分布式计算结构... &rsaquo; PowerBuilder 初识 &rsaquo; PowerBuilder 10 Beta1下载和相关... &rsaquo; 用PowerBuilder开发WEB数据库 &rsaquo; 用PowerBuilder进行分布式应用开... &rsaquo; PowerBuilder与数据库的连接 &rsaquo; PowerBuilder问题与解答 &rsaquo; PowerBuilder数据窗口与数据库 &rsaquo; PowerBuilder开发分布式计算结构... 我要加盟 法律声明 友情链接 站点地图 联系我们 --> 请扫描二维码添加站长微信 本站站长:PCM(12年以上PB开发经验)业务QQ:2322888 QQ讨论群1:94326106(2千人超级群,最火爆的PB讨论群) QQ讨论群2:231518(史上最大的千人IT休闲群,屌丝必入) QQ讨论群3:73513447(千人IT招聘群,招聘求职必入群...) PB创新网版权所有 &copy;2012 蜀ICP备05006790号