前往Shuct.Net首页

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

关于PowerBuilder的搜索

关于PB开发的界面问题!不知大家都用什么方法美化界面。按钮的底色颜色怎样才能变啊?怎样才能在PictureButton最左边放一幅小小的图标啊? - CSDN论坛 - CSDN.NET --> 首页 论坛帮助 论坛牛人 论坛地图 CSDN > CSDN论坛 > PowerBuilder > 控件与界面 管理菜单 置顶 推荐 锁定 移动 编辑 删除 帖子加分 帖子高亮 结帖 发帖 回复 wind1825 关于PB开发的界面问题!不知大家都用什么方法美化界面。按钮的底色颜色怎样才能变啊?怎样才能在PictureButton最左边放一幅小小的图标啊? [问题点数:30分,结帖人wind1825] 不显示删除回复 显示所有回复 显示星级回复 显示得分回复 只显示楼主 收藏 wind1825 wind1825 等级: 结帖率:100% 楼主 发表于: 2001-04-20 21:29:00 关于PB开发的界面问题!不知大家都用什么方法美化界面。按钮的底色颜色怎样才能变啊?怎样才能在PictureButton最左边放一幅小小的图标啊? 分享到: 更多 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 回复次数:8 wind1825 wind1825 等级: 结帖率:100% #1 得分:0 回复于: 2001-04-20 22:31:00 哪位大虾知道啊,快救救我吧!!!!! 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 gwolfupb gwolfupb 等级: 结帖率:94.29% #2 得分:2 回复于: 2001-04-23 22:26:00 用picturebutton不行,需要自定义一个用户控件,将图片和button合在一起,组成一个图形按纽。需要用到捕获鼠标和释放鼠标的的API函数。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 gwolfupb gwolfupb 等级: 结帖率:94.29% #3 得分:9 回复于: 2001-04-23 22:42:00 具体做法: 新建一用户控件 NEW>CUSTOM VISUAL在里面加一个button cb_1 和一个picture p_1 declare local external functions Function ulong SetCapture(ulong hWnd) Library "USER32.DLL" //功能——捕获鼠标 Function BOOLEAN ReleaseCapture() Library "USER32.DLL" //功能——释放鼠标 declare instance variables Boolean capturemouse = false //捕获鼠标的标志,捕获时为true、释放时为false p_1 事件mousemove() capturemouse = true //当鼠标移入图片控件时,设置捕获鼠标标志为true SetCapture(handle(cb_1)) //当鼠标移入图片控件时,调用WindowAPI函数捕获鼠标,并指定到按钮 p_1 事件clicked() parent.postevent ('clicked') cb_1 事件 mousemove() if xpos < p_1.x or xpos > (p_1.x + p_1.width) or ypos < p_1.y and ypos > (p_1.y + p_1.height) then //当鼠标离开图片控件时 if capturemouse = true then //当捕获鼠标标志为true时 ReleaseCapture() //调用WindowAPI函数释放鼠标捕获 capturemouse = false //设置捕获鼠标标志为false end if end if cb_1 事件 clicked() parent.postevent ('clicked') //执行父窗口(用户对象)中的clicked事件 用户对象的constructor()事件 cb_1.x = 0 cb_1.y = 0 cb_1.width = This.width cb_1.height = This.height p_1.x = This.width / 16 //可根据需要修改 p_1.y = This.height / 7 If This.Enabled = False then cb_1.Enabled = False p_1.Enabled = False End if 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 BlackBone BlackBone 等级: 结帖率:100% #4 得分:5 回复于: 2001-04-23 23:43:00 要改变按纽的底色,必须使用文本框来代替。如果定义userobject,在文本框的construct事件中,改变文本框的背景色:BackColor=Parent.BackColor,这样可以根据需要自由设定颜色。加入pbm_lbuttondown,pbm_lbuttonup两个用户事件,lbuttondown时设置文本框的BorderStyle为StyleLowerd,lbuttonup时设置文本框的BorderStyle为StyleRaised,并调用Parent.Event Clicked()。当然在此文本框的上面可以放上一个小图片(显示按纽的图标)和一个文本框(显示按纽的文本),别忘了加上上述事件的代码(直接调用大文本框的事件)。唯一不足是不能在使用时改变图片和文本,必须预先设置好。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 xingjiaren xingjiaren 等级: 结帖率:100% #5 得分:1 回复于: 2001-04-24 08:28:00 同意括弧,用用户对象就能实现。 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 am2000 am2000 等级: 结帖率:100% #6 得分:13 回复于: 2001-04-24 08:39:00 PowerBuilder中图形按钮的制作 本文提出并实现了在PowerBuilder中制作图形按钮的方法,这种图形按钮除了具有普通按钮的功能外,还具有显示提示信息(Tip)、按钮局部区域显示图形、动态改变按钮上的图形等功能。 ---- 在Delphi、C++Builder等多种快速开发工具中,我们经常用到图形按钮,而在PowerBuilder中,所提供的图形按钮功能并不完善,如图形占据整个按钮,而不是显示在一侧,程序运行时没有提示信息(Tip)等。为了使PowerBuilder编写出来的程序更具专业化,有必要对其进行功能上的扩充。 ---- 1 设计思路 ---- 在普通按钮上放置一位图,程序运行时,在按钮被按动过程中让按钮上的图片随之发生改变,并且当按钮上的位图被按动时,利用WindowAPI函数[1]SetCapture()来捕获鼠标,并指定到按钮上,以实现按钮被按动的操作,利用ReleaseCapture()来释放鼠标捕获,同时利用WindowAPI函数为其提供提示信息。为了方便使用图形按钮,将其封装成用户对象,以便在窗口中调用。 ---- 2 设计过程 ---- 2.1 图形按钮的制作 ---- 创建一个定制的(custom)可视用户对象,在其中放置一个按钮(CommandButton) 控件(name = cb_1,text = ‘ 查 询’,text前面留几个空格是为了不让位图遮住按钮 上的文字)和一个图片(Picture)控件(name = p_1),并且将图片控件放在按钮控件 一侧(如左侧),将此用户对象保存为uo_picbutton。在此用户对象中声明两个实例变量: uo_tooltip ToolTip //显示提示信息的用户对象实例 Boolean capturemouse = false //捕获鼠标的标志,捕获时为true、释放时为false 在Local External Functions…中加入两个WindowAPI函数[1]声明: Function ulong SetCapture(ulong hWnd) Library "USER32.DLL" //功能——捕获鼠标 Function BOOLEAN ReleaseCapture() Library "USER32.DLL" //功能——释放鼠标 ---- 在此用户对象的事件中加入mousedown事件(对应事件ID为pbm_lbuttondown),mouseup事件(对应事件ID为pbm_lbuttonup),clicked事件(对应事件ID为pbm_bnclicked)。 在constructor事件中写代码如下: cb_1.x = 0 cb_1.y = 0 cb_1.width = This.width cb_1.height = This.height p_1.x = This.width / 14 p_1.y = This.height / 6 ToolTip.ControlRegister(cb_1,This.tag,0) //按钮控件显示提示信息所用,后面解释 ToolTip.ControlRegister(p_1,This.tag,0) //图片控件显示提示信息所用,后面解释 If This.Enabled = False then cb_1.Enabled = False p_1.Enabled = False End if ---- 在按钮控件事件中加入mousedown事件(对应事件ID为pbm_lbuttondown),mouseup事件 (对应事件ID为pbm_lbuttonup),mousemove事件(对应事件ID为pbm_mousemove)。 在mousedown事件中写入如下代码: parent.postevent ('mousedown') //执行父窗口(用户对象)中的mousedown事件 在mouseup事件中写入如下代码: parent.postevent ('mouseup') //执行父窗口(用户对象)中的mouseup事件 在clicked事件中写入如下代码: parent.postevent ('clicked') //执行父窗口(用户对象)中的clicked事件 在mousemove事件中写入如下代码: if xpos > p_1.x and xpos < (p_1.x + p_1.width) and ypos > p_1.y and ypos < (p_1.y + p_1.height) then //当鼠标在图片控件内部时,显示指定的提示信息 ToolTip.Showtip(p_1) //图片控件显示提示信息所用,后面解释 elseif xpos > cb_1.x and xpos < (cb_1.x + cb_1.width) and ypos > cb_1.y and ypos < (cb_1.y + cb_1.height) then //当鼠标在按钮控件内部时,显示指定的提示信息 ToolTip.Showtip(cb_1) //按钮控件显示提示信息所用,后面解释 end if if xpos < p_1.x or xpos > (p_1.x + p_1.width) or ypos < p_1.y and ypos > (p_1.y + p_1.height) then //当鼠标离开图片控件时 if capturemouse = true then //当捕获鼠标标志为true时 ReleaseCapture() //调用WindowAPI函数释放鼠标捕获 capturemouse = false //设置捕获鼠标标志为false end if end if 在图片控件事件中加入mousemove事件 (对应事件ID为pbm_lbuttondown)。 在mousemove事件中写入如下代码: capturemouse = true //当鼠标移入图片控件时,设置捕获鼠标标志为true SetCapture(handle(cb_1)) //当鼠标移入图片控件时,调用WindowAPI函数捕获鼠标, 并指定到按钮 ---- 2.2 给图形按钮加上提示信息 ---- 创建一个定制的(custom)非可视用户对象uo_tooltip,声明实例变量如下: Private: // Constants CONSTANT string TOOLTIPS_CLASS = 'tooltips_class32' CONSTANT ulong CW_USEDEFAULT = 2147483648 CONSTANT long WM_USER = 1024 CONSTANT long WS_EX_TOPMOST = 8 // ToolTip Messages CONSTANT long TTM_ADDTOOL = WM_USER + 4 CONSTANT long TTM_RELAYEVENT = WM_USER + 7 Public: long hWndTT // Tooltip control window handle long ToolID = 1 // Tooltip internal ID // Tooltip flags CONSTANT integer TTF_CENTERTIP = 2 CONSTANT integer TTF_RTLREADING = 4 //CONSTANT integer TTF_DI_SETITEM = 32768 在Local External Functions…中加入 八个WindowAPI函数[1]声明: //确保动态链接库(DLL)被加载 SubRoutine InitCommonControls() library "comctl32.dll" //创建窗口 Function long CreateWindowExA(ulong dwExStyle, string ClassName, long WindowName, ulong dwStyle, ulong X, ulong Y, ulong nWidth, ulong nHeight, ulong hWndParent, ulong hMenu, ulong hInstance, ulong lpParam) library "user32.dll" //清除指定的窗口以及它的所有子窗口 Function integer DestroyWindow(long hWnd) library "user32.dll" //调用一个窗口的窗口函数,将一条消息发给那个窗口 Function integer ToolTipMsg(long hWnd, long uMsg, long wParam, REF TOOLINFO ToolInfo) library "user32.dll" Alias For "SendMessageA" //调用一个窗口的窗口函数,将一条消息发给那个窗口 Function integer RelayMsg(long hWnd, long uMsg, long wParam, REF MSG Msg) library "user32.dll" Alias For "SendMessageA" //分配指定数量的内存 Function long LocalAlloc(long Flags, long Bytes) library "kernel32.dll" //释放内存并使句柄无效 Function long LocalFree(long MemHandle) library "kernel32.dll" //复制字符串到缓冲区 Function long lstrcpy(long Destination, string Source) library "kernel32.dll" 在constructor事件中写代码如下: InitCommonControls() HWndTT = CreateWindowExA ( WS_EX_TOPMOST, TOOLTIPS_CLASS, 0, TTF_CENTERTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, Handle ( GetApplication ( ) ), 0 ) 在destructor事件中写代码如下: DestroyWindow(hWndTT) 创建两个用户对象级函数 (User Object Functions…): controlregister(dragobject controlobject, string tip, integer flag)return integer TOOLINFO ToolInfo ToolInfo.cbSize = 40 ToolInfo.uFlags = Flag ToolInfo.hWnd = Handle(ControlObject) ToolInfo.hInstance = 0 ToolInfo.uID = ToolID ToolID++ ToolInfo.lpszText = LocalAlloc(0,80) POST LocalFree(ToolInfo.lpszText) // Free Allocated Memory lStrCpy(ToolInfo.lpszText,Left(tip,80)) ToolInfo.Rect.Left = 0 ToolInfo.Rect.Top = 0 ToolInfo.Rect.Right = UnitsToPixels( ControlObject.Width,XUnitsToPixels!) ToolInfo.Rect.Bottom = UnitsToPixels( ControlObject.Height,YUnitsToPixels!) If ToolTipMsg(hWndTT,TTM_ ADDTOOL, 0, ToolInfo) = 0 Then MessageBox("Error","Cannot register object in the toolwindow control! " , StopSign!, Ok! ) Return(-1) End If Return(ToolID - 1) showtip(dragobject controlobject) MSG Msg Msg.hWnd = Handle(ControlObject) Msg.Message = 512 // WM_MOUSEMOVE Msg.WParam = Message.WordParm Msg.Lparam = Message.LongParm RelayMsg(hWndTT,TTM_RELAYEVENT,0,Msg) ---- 2.3 在窗口中使用图形按钮控件 ---- 新建一个窗口,在窗口中放置图形按钮用户对象(name = uo_1),属性中指定Tag = 测试。 在constructor事件中写代码如下: this.cb_1.text = ' 测 试(&T)' 在mousedown事件中写代码如下: this.p_1.picturename = 按钮按下时显示的图片路径及名字 在mouseup事件中写代码如下: this.p_1.picturename = 按钮弹起时显示的图片路径及名字 在clicked事件中写代码如下: messagebox('测试','这是一个图形按钮') ---- 运行该程序,可以发现按钮具有按下时显示一幅位图,弹起时显示另外一幅位图,且按钮还具有显示提示信息的功能 有兴趣的话,自己慢慢看吧 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 wind1825 wind1825 等级: 结帖率:100% #7 得分:0 回复于: 2001-04-24 09:31:00 真的好开心啊,有这么多热心的朋友参加讨论!对以上所有朋友的回答在此小弟表示衷心的感谢! 好啦,我要给分啦!太感动啦,我决定再给帖子加点分! 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 wind1825 wind1825 等级: 结帖率:100% #8 得分:0 回复于: 2001-04-24 09:47:00 我已加分啦,由原来的20分加到了30分啦,谢谢各位朋友! 对我有用[0] 丢个板砖[0] 引用 | 举报 | 编辑 删除 管理 管理菜单 置顶 推荐 锁定 移动 编辑 删除 帖子加分 帖子高亮 结帖 发帖 回复 写出你眼中的IE11 赢取新年好礼! 勇敢写出你的爱 赢莫文蔚签名大礼 2014年4月微软MVP申请开始了! 陈勇- 敏捷开发现状及发展之路 CSDN高校俱乐部 高校全新改版邀你来学习和挑战 本帖子已过去太久远了,不再提供回复功能。 核心技术类目 全部主题 Java VPN Android iOS ERP IE10 Eclipse CRM JavaScript Ubuntu NFC WAP jQuery 数据库 BI HTML5 Spring Apache Hadoop .NET API HTML SDK IIS Fedora XML LBS Unity Splashtop UML components Windows Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace [关闭] [关闭]