谁要是给出了有价值的意见,加他一千分也无所谓的,呵呵
60 个解决方案
#1
俺才来的,啥分也没,参与吧,您多少给点
#2
不知道,我看PB做界面实在是太不容易。不是强项啊,要做界面用DELPHI啊,而且它的数据库也很强哦。
PB的话在快速开发数据库方面还是很强的。。。还是不要考虑界面了,在内核上多下工夫吧。
PB的话在快速开发数据库方面还是很强的。。。还是不要考虑界面了,在内核上多下工夫吧。
#3
注意,做界面时注意合理的功能分类或者归类,界面就不会看上去很乱(分类时用groupbox来进行区域的合理划分)。
你可以看看WINDOWS桌面的属性等操作界面也不是很豪华,但却是十分专业、实用
我这里有个自己做的演示界面,可以发送给你。
你可以看看WINDOWS桌面的属性等操作界面也不是很豪华,但却是十分专业、实用
我这里有个自己做的演示界面,可以发送给你。
#4
做界面是有点艺术的,你也发一份给我吧
我感觉还可以定义一些用户对象,比如图片按钮呀
这样会生动一些
我感觉还可以定义一些用户对象,比如图片按钮呀
这样会生动一些
#5
sorry
忘了留e-mail :
cccmouse@china.com
忘了留e-mail :
cccmouse@china.com
#6
wangtaopublic(软件冰子),也给我一份参考一下,可以吗?先谢过啦:eheyi@21cn.com
#7
谢谢,我的email是yxylwt@21cn.com
#8
wangtaopublic(软件冰子),我也是初学者,现在正为界面烦恼,能发给我一份吗?
sclt@21cn.com 谢谢!
sclt@21cn.com 谢谢!
#9
呵呵,大家意见不发,倒成了菜鸟集会的地方了!
#10
我也要
oicq:3380046
lkyuan007@sina.com
oicq:3380046
lkyuan007@sina.com
#11
兄弟、同胞、姐妹、表兄、表姐们:
不要都伸手要,总要贡献出点东西,形成点气氛,不然让贴主:lengxue(冷血)失望了!!
lengxue(冷血) :我可不想喧宾夺主!!
不要都伸手要,总要贡献出点东西,形成点气氛,不然让贴主:lengxue(冷血)失望了!!
lengxue(冷血) :我可不想喧宾夺主!!
#12
软件冰子:我也想要一份。email:YL_YZ@SINA.COM 先谢谢了!
#13
用tab页做界面,很不错。
#14
用PB做界面,就别指望能做出什么好看的界面,还是用Delphi吧,那个做的好看,功能也强
大家都来用Delphi吧!!!!
大家都来用Delphi吧!!!!
#15
可以用树呀,不过比较麻烦,
#16
大家别吵了,想开发数据库就是用powerbuilder!delphi是什么玩意。
#17
to all
调用API函数,会做出与vc++,vb一样好的界面!
调用API函数,会做出与vc++,vb一样好的界面!
#18
to all
界面不在于漂亮,而在简洁、整齐。
界面不在于漂亮,而在简洁、整齐。
#19
软件冰子 我也要一份 e_mail: denise_k@163.net
#20
我有办法,大量使用BMP,可惜,为什么不支持其它格式:(
#21
有什么好的方法?
太多了~~
慢慢学~~
太多了~~
慢慢学~~
#22
多贴图片就完了,其它不会了.
#23
多贴图片就完了,其它不会了.????
#24
谁有陶清那的“使用pb制作的一个流程图风格的启动界面,类似于国产的进销存软件 速达2000的风格”的例子?
如果有的话,请发一个给我。多谢~~~~~~~~~~~~~~~~~~~~~~~~~~
tdsoft@china.com
如果有的话,请发一个给我。多谢~~~~~~~~~~~~~~~~~~~~~~~~~~
tdsoft@china.com
#25
合理搭配颜色。多用自定义颜色,pb给出的颜色大部分很刺眼,尽量少用。
#26
大量的图片 + 大量好看的字体 + 很好的审美观 + 大量通用对象
#27
Simply The Best!
#28
1,多用用户对象
2,尽量界面简洁
3,少一些CB,多一些event,多用mouse click,Dclick
4,可使用pop menu
5,使用MDI
6,界面颜色不要太鲜艳,可用小图标或深色字体加重效果
2,尽量界面简洁
3,少一些CB,多一些event,多用mouse click,Dclick
4,可使用pop menu
5,使用MDI
6,界面颜色不要太鲜艳,可用小图标或深色字体加重效果
#29
PB的界面完全可以做的很漂亮的,如果你有足够的时间
#30
1.统一使用‘宋体’9号字
2.颜色搭配合理
3.使用图片,画龙点睛,不要太多,太花哨
2.颜色搭配合理
3.使用图片,画龙点睛,不要太多,太花哨
#31
其实任何界面都能再pb中实现,甚至用vc实现的界面,关键看有没有这个必要。
#32
你可以做一些对象!比如我们公司的就有一套类库,可以做很多漂亮的界面
但我想做一般的数据库系统,只要简洁就好!
当然!也可用其它语言做一些控件!
但我想做一般的数据库系统,只要简洁就好!
当然!也可用其它语言做一些控件!
#33
可以pb和flash无缝结合,条件是flash要用的好!
#34
阿文,你们公司是做什么的,我们公司也有自己的一套类库的
#35
还可以动态打开窗口
#36
我要说的,只有一句话:多留心别人做出来的好的软件.学一学他的风格加到自己的程序中,我认为是一个不错的主意,要自己凭空去想,我感觉很难,你说呢???
#37
wangtaopublic(软件冰子),也给我一份参考一下,可以吗?先谢过啦:
cssyw@pub.wx.jsinfo.net
cssyw@pub.wx.jsinfo.net
#38
pb一样可以作出漂亮的界面。只要多花点工夫就行了。
#39
我觉得简洁、合理、规范的界面才是最好的界面。就象windows。
#40
基于PowerBuider的程序界面技术的若干讨论
一、问题的提出
PowerBuilder 6.5(以下简称 PB) 是一个面向对象的Client/Server开发工具,它可以在WindowsX.X、Windows NT、Macintosh、Aix/6000、Sun Solaris等开发平台上运行。PB作为数据库的前端开发工具,以其全面的功能和优异的性能受到广大开发者的青昧。但是PB开发的用户界面尽管清晰大方,但是它自身并没有实现Windows界面功能的对象。本文专门针对此问题讨论在PB中怎样实现浮动按钮、按钮的PowerTip提示技术。应用该技术后,PB开发的用户界面可以更加美观,更加具有商业化风格。
二、浮动按钮、按钮的PowerTip提示的具体实现
1、浮动按钮在PB中的实现
(1) 基本原理
实现此功能的关键是捕获Windows鼠标的移动消息,这通过在相应对象中自定义mousemove事件可以实现。然后在相应的事件中书写代码,用openuserobject()函数动态地生成可视的命令按钮。
(2) 具体方法和过程
本例中包括一个静态文本框st_1,其text属性为‘确定’,border属性为’box’。记下它的x、y、width、height属性值,具体的x=544,y=360,width=503,height=80。
然后在st_1中自定义事件mousemove ,事件ID为pbm_mousemove,在此事件中写入如下代码:
st_1.visible=false //当鼠标在st_1中移动时触发此事件并使st_1为不可见
commandbutton lc_mybutton //申明一个命令按钮实例
openuserobject(lc_mybutton,"commandbutton",544,360) //打开用户对象并在指定位置(前面我们记下的x和y值)显示
lc_mybutton.width=503 //设置命令按钮的宽度(和静态文本同宽)
lc_mybutton.height=80 //设置命令按钮的高度(和静态文本同高)
lc_mybutton.enabled=true//设置使能属性
lc_mybutton.facename='arial'//设置按钮上的字体
lc_mybutton.pointer='e:\fjm\hand-l.cur'//设置当按钮创建后的指针
lc_mybutton.text='确定'//设置命令按钮的text属性
lc_mybutton.textsize=20//设置字体的大小
lc_mybutton.visible=true//设置按钮的可见性
parent.control[ UpperBound( parent.control ) + 1] = lc_mybutton//将命令按钮加入示例窗口的控件数组中去
最后在示例窗口的mousemove事件中写入以下代码:
st_1.visible=true//当鼠标离开命令按钮进入窗口时触发此事件,恢复st_1的可视性。
2、按钮的PowerTip提示在 PB中的实现方法
(1) 基本原理
定义一个不可视用户对象,在此对象中申明本地外部函数,引入Windows API函数。然后编写用户对象函数实现向Windows发送消息等功能(例如应用窗口的句柄、为text分配内存空间、向应用窗口发送消息等等),以便在主程序中调用。在主程序中,申明此用户对象的实例变量,在相应控件事件中调用不可视用户对象函数,从而实现按钮的Powertip功能。
(2) 具体方法和过程
a、 在用户对象画板中建一个不可视用户对象名为nvo_powertip(class custom类型)
b、申明实例变量
Private:
// 常量申明
CONSTANT string TOOLTIPS_CLASS='tooltips_class32'
CONSTANT ulong CW_USEDEFAULT= 2147483648
CONSTANT long WM_USER = 1024
CONSTANT long WS_EX_TOPMOST= 8
CONSTANT long WM_SETFONT= 48
// PowerTip 消息
CONSTANT long TTM_ADDTOOL = WM_USER + 4
CONSTANT long TTM_NEWTOOLRECT = WM_USER + 6
CONSTANT long TTM_RELAYEVENT = WM_USER + 7
CONSTANT long TTM_UPDATETIPTEXT= WM_USER + 12
CONSTANT long TTM_TRACKACTIVATE= WM_USER + 17
CONSTANT long TTM_TRACKPOSITION= WM_USER + 18
//公共变量和常量
Public:
long hWndTT // Powertip 控件窗口的句柄
long ToolID = 1 //Powertip内部ID
// Powertip 标志
CONSTANT integer TTF_CENTERTIP = 2
CONSTANT integer TTF_RTLREADING= 4
CONSTANT integer TTF_SUBCLASS= 16
CONSTANT integer TTF_TRACK= 32
CONSTANT integer TTF_ABSOLUTE= 128
CONSTANT integer TTF_TRANSPARENT = 256
CONSTANT integer TTF_DI_SETITEM= 32768
c、在Local Extenal Function…申明此用户对象用的API函数
// 处理Powertip的外部函数
c.1 SubRoutine InitCommonControls() library "comctl32.dll"
c.2 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"
c.3 Function integer DestroyWindow(long hWnd) library "user32.dll"
c.4 Function integer ToolTipMsg(long hWnd, long uMsg, long wParam, REF TOOLINFO ToolInfo) library "user32.dll" Alias For "SendMessageA"
c.5 Function integer RelayMsg(long hWnd, long uMsg, long wParam, REF MSG Msg) library "user32.dll" Alias For "SendMessageA"
// 内存处理函数
c.6 Function long LocalAlloc(long Flags, long Bytes) library "kernel32.dll"
c.7 Function long LocalFree(long MemHandle) library "kernel32.dll"
c.8 Function long lstrcpy(long Destination, string Source) library "kernel32.dll"
style="MARGIN-LEFT: 84.75pt; TEXT-ALIGN: left">d、定义用户结构变量:msg、point、rect、toolinfo
msg结构定义如下:
>变量名称 >变量类型
Hwnd Long
Message Long
>Wparam >Long
>Lparam >Long
>Time >Long
>Pt >point
style="MARGIN-LEFT: 84.75pt; TEXT-ALIGN: left"> Point结构定义如下:
变量名称 变量类型
X Long
Y Long
style="MARGIN-LEFT: 84.75pt; TEXT-ALIGN: left"> Rect结构定义如下
变量名称 变量类型
Left Long
Right Long
op Long
Bottom Long
Toolinfo结构定义如下:
变量名称 变量类型
Cbsize Long
Uflags Long
Hwnd Long
Uid Long
Rect Rect
Hinstance Long
Lpsztext long
、在用户对象的constructor事件中写入代码(功能是得到应用窗口的句柄,为hwnd赋值)
> InitCommonControls()
hWndTT = CreateWindowExA(WS_EX_TOPMOST,TOOLTIPS_CLASS,0,& TTF_CENTERTIP, CW_USEDEFAULT, CW_USEDEFAULT, &
CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, Handle(GetApplication()),0)
f、在用户对象的destructor事件中写入代码(释放应用窗口的句柄)
DestroyWindow(hWndTT)
g、编写用户对象的函数。(addtool函数、relaymsg函数)
g.1 addtool函数的编制
; 函数名:addtool,
参数名称 参数类型
Object Dragobject
Tiptext String
Flags integer
返回值:integer
函数体:
TOOLINFO ToolInfo
ToolInfo.cbSize = 40
ToolInfo.uFlags = Flags
ToolInfo.hWnd = Handle(Object)
ToolInfo.hInstance = 0 // Not used
ToolInfo.uID = ToolID
ToolID++
ToolInfo.lpszText = LocalAlloc(0,80)
POST LocalFree(ToolInfo.lpszText) // Free Allocated Memory
lStrCpy(ToolInfo.lpszText,Left(tiptext,80))
ToolInfo.Rect.Left 0
ToolInfo.Rect.Top = 0
ToolInfo.Rect.Right = UnitsToPixels(Object.Width,XUnitsToPixels!)
ToolInfo.Rect.Bottom= UnitsToPixels(Object.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)
g.2、relaymsg函数的编制
函数名称:relaymsg
参数名称 >参数类型
Object Dragobject
返回值:无
函数功能:向应用程序窗口发送控件信息
函数体:
s MSG Msg
Msg.hWnd = Handle(Object)
Msg.Message = 512 // WM_MOUSEMOVE,windows提供的事件的数值编号,mousemove事件的编号为512.
Msg.WParam = Message.WordParm
Msg.LParam = Message.LongParm
RelayMsg(hWndTT,TTM_RELAYEVENT,0,Msg)
至此用户对象的准备工作已完全就绪。接下来在应用程序中相应事件中调用刚才定义的函数了。
h、在应用程序主窗口中定义实例变量
nvo_ToolTip PowerTip
i、在主窗口的open事件中将要显示powertip的控件向windows系统注册(假如
窗口中有一个命令按钮和一个sle控件)
powertip.addtool(cb_1,"测试按钮",0)
powertip.addtool(sle_1,"测试单行文本框",0)
j、为命令按钮、单行文本框定义事件mousemove,事件ID为pbm_mousemove.
k、在cb_1、sle_1的mousemove事件中调用nvo_tooltip对象的relaymsg
函数向windows发送消息
powerTip.RelayMsg(This)
此效果正是我们所要的效果。难道你不想试试吗?
三、结束语
本文比较粗略地讨论了基于PB的用户界面的增强功能。应用此功能后用PB开发的界面将更加引人入胜。但是,以上讨论也有没有涉及的地方,比如浮动按钮是动态生成的,本文还没涉及到按钮clicked事件的实现问题,还有待以后的进一步探讨。关于powertip的实现,我们还可以在不可视对象中再定义一些用户函数,来完成更加复杂的功能,比如改变tip的字体,文字内容,改变tip框的大小等等。但这些功能的有无并不影响我们对基本功能的实现和使用。
最后,愿这段文字能对你的编程思路有一定的启发作用。
四、参考文献
清华大学出版社,《powerbuilder 6.0应用与开发》,吴洁明 编著;
机械工业出版社、西蒙与舒司特国际出版公司,《powerbuilder 6.0程序设计大全》,(美)
Simon Gallagher、Simon Herbert著,康博创作室 译;
返回 主页
附加说明:易蜀水,南航509教研室在读硕士,研究方向:CIMS\PDM\MRPII
戴勇, 南航509教研室教授, 研究方向:CIMS\PDM\MRP II
>资料来源:PB之星
一、问题的提出
PowerBuilder 6.5(以下简称 PB) 是一个面向对象的Client/Server开发工具,它可以在WindowsX.X、Windows NT、Macintosh、Aix/6000、Sun Solaris等开发平台上运行。PB作为数据库的前端开发工具,以其全面的功能和优异的性能受到广大开发者的青昧。但是PB开发的用户界面尽管清晰大方,但是它自身并没有实现Windows界面功能的对象。本文专门针对此问题讨论在PB中怎样实现浮动按钮、按钮的PowerTip提示技术。应用该技术后,PB开发的用户界面可以更加美观,更加具有商业化风格。
二、浮动按钮、按钮的PowerTip提示的具体实现
1、浮动按钮在PB中的实现
(1) 基本原理
实现此功能的关键是捕获Windows鼠标的移动消息,这通过在相应对象中自定义mousemove事件可以实现。然后在相应的事件中书写代码,用openuserobject()函数动态地生成可视的命令按钮。
(2) 具体方法和过程
本例中包括一个静态文本框st_1,其text属性为‘确定’,border属性为’box’。记下它的x、y、width、height属性值,具体的x=544,y=360,width=503,height=80。
然后在st_1中自定义事件mousemove ,事件ID为pbm_mousemove,在此事件中写入如下代码:
st_1.visible=false //当鼠标在st_1中移动时触发此事件并使st_1为不可见
commandbutton lc_mybutton //申明一个命令按钮实例
openuserobject(lc_mybutton,"commandbutton",544,360) //打开用户对象并在指定位置(前面我们记下的x和y值)显示
lc_mybutton.width=503 //设置命令按钮的宽度(和静态文本同宽)
lc_mybutton.height=80 //设置命令按钮的高度(和静态文本同高)
lc_mybutton.enabled=true//设置使能属性
lc_mybutton.facename='arial'//设置按钮上的字体
lc_mybutton.pointer='e:\fjm\hand-l.cur'//设置当按钮创建后的指针
lc_mybutton.text='确定'//设置命令按钮的text属性
lc_mybutton.textsize=20//设置字体的大小
lc_mybutton.visible=true//设置按钮的可见性
parent.control[ UpperBound( parent.control ) + 1] = lc_mybutton//将命令按钮加入示例窗口的控件数组中去
最后在示例窗口的mousemove事件中写入以下代码:
st_1.visible=true//当鼠标离开命令按钮进入窗口时触发此事件,恢复st_1的可视性。
2、按钮的PowerTip提示在 PB中的实现方法
(1) 基本原理
定义一个不可视用户对象,在此对象中申明本地外部函数,引入Windows API函数。然后编写用户对象函数实现向Windows发送消息等功能(例如应用窗口的句柄、为text分配内存空间、向应用窗口发送消息等等),以便在主程序中调用。在主程序中,申明此用户对象的实例变量,在相应控件事件中调用不可视用户对象函数,从而实现按钮的Powertip功能。
(2) 具体方法和过程
a、 在用户对象画板中建一个不可视用户对象名为nvo_powertip(class custom类型)
b、申明实例变量
Private:
// 常量申明
CONSTANT string TOOLTIPS_CLASS='tooltips_class32'
CONSTANT ulong CW_USEDEFAULT= 2147483648
CONSTANT long WM_USER = 1024
CONSTANT long WS_EX_TOPMOST= 8
CONSTANT long WM_SETFONT= 48
// PowerTip 消息
CONSTANT long TTM_ADDTOOL = WM_USER + 4
CONSTANT long TTM_NEWTOOLRECT = WM_USER + 6
CONSTANT long TTM_RELAYEVENT = WM_USER + 7
CONSTANT long TTM_UPDATETIPTEXT= WM_USER + 12
CONSTANT long TTM_TRACKACTIVATE= WM_USER + 17
CONSTANT long TTM_TRACKPOSITION= WM_USER + 18
//公共变量和常量
Public:
long hWndTT // Powertip 控件窗口的句柄
long ToolID = 1 //Powertip内部ID
// Powertip 标志
CONSTANT integer TTF_CENTERTIP = 2
CONSTANT integer TTF_RTLREADING= 4
CONSTANT integer TTF_SUBCLASS= 16
CONSTANT integer TTF_TRACK= 32
CONSTANT integer TTF_ABSOLUTE= 128
CONSTANT integer TTF_TRANSPARENT = 256
CONSTANT integer TTF_DI_SETITEM= 32768
c、在Local Extenal Function…申明此用户对象用的API函数
// 处理Powertip的外部函数
c.1 SubRoutine InitCommonControls() library "comctl32.dll"
c.2 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"
c.3 Function integer DestroyWindow(long hWnd) library "user32.dll"
c.4 Function integer ToolTipMsg(long hWnd, long uMsg, long wParam, REF TOOLINFO ToolInfo) library "user32.dll" Alias For "SendMessageA"
c.5 Function integer RelayMsg(long hWnd, long uMsg, long wParam, REF MSG Msg) library "user32.dll" Alias For "SendMessageA"
// 内存处理函数
c.6 Function long LocalAlloc(long Flags, long Bytes) library "kernel32.dll"
c.7 Function long LocalFree(long MemHandle) library "kernel32.dll"
c.8 Function long lstrcpy(long Destination, string Source) library "kernel32.dll"
style="MARGIN-LEFT: 84.75pt; TEXT-ALIGN: left">d、定义用户结构变量:msg、point、rect、toolinfo
msg结构定义如下:
>变量名称 >变量类型
Hwnd Long
Message Long
>Wparam >Long
>Lparam >Long
>Time >Long
>Pt >point
style="MARGIN-LEFT: 84.75pt; TEXT-ALIGN: left"> Point结构定义如下:
变量名称 变量类型
X Long
Y Long
style="MARGIN-LEFT: 84.75pt; TEXT-ALIGN: left"> Rect结构定义如下
变量名称 变量类型
Left Long
Right Long
op Long
Bottom Long
Toolinfo结构定义如下:
变量名称 变量类型
Cbsize Long
Uflags Long
Hwnd Long
Uid Long
Rect Rect
Hinstance Long
Lpsztext long
、在用户对象的constructor事件中写入代码(功能是得到应用窗口的句柄,为hwnd赋值)
> InitCommonControls()
hWndTT = CreateWindowExA(WS_EX_TOPMOST,TOOLTIPS_CLASS,0,& TTF_CENTERTIP, CW_USEDEFAULT, CW_USEDEFAULT, &
CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, Handle(GetApplication()),0)
f、在用户对象的destructor事件中写入代码(释放应用窗口的句柄)
DestroyWindow(hWndTT)
g、编写用户对象的函数。(addtool函数、relaymsg函数)
g.1 addtool函数的编制
; 函数名:addtool,
参数名称 参数类型
Object Dragobject
Tiptext String
Flags integer
返回值:integer
函数体:
TOOLINFO ToolInfo
ToolInfo.cbSize = 40
ToolInfo.uFlags = Flags
ToolInfo.hWnd = Handle(Object)
ToolInfo.hInstance = 0 // Not used
ToolInfo.uID = ToolID
ToolID++
ToolInfo.lpszText = LocalAlloc(0,80)
POST LocalFree(ToolInfo.lpszText) // Free Allocated Memory
lStrCpy(ToolInfo.lpszText,Left(tiptext,80))
ToolInfo.Rect.Left 0
ToolInfo.Rect.Top = 0
ToolInfo.Rect.Right = UnitsToPixels(Object.Width,XUnitsToPixels!)
ToolInfo.Rect.Bottom= UnitsToPixels(Object.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)
g.2、relaymsg函数的编制
函数名称:relaymsg
参数名称 >参数类型
Object Dragobject
返回值:无
函数功能:向应用程序窗口发送控件信息
函数体:
s MSG Msg
Msg.hWnd = Handle(Object)
Msg.Message = 512 // WM_MOUSEMOVE,windows提供的事件的数值编号,mousemove事件的编号为512.
Msg.WParam = Message.WordParm
Msg.LParam = Message.LongParm
RelayMsg(hWndTT,TTM_RELAYEVENT,0,Msg)
至此用户对象的准备工作已完全就绪。接下来在应用程序中相应事件中调用刚才定义的函数了。
h、在应用程序主窗口中定义实例变量
nvo_ToolTip PowerTip
i、在主窗口的open事件中将要显示powertip的控件向windows系统注册(假如
窗口中有一个命令按钮和一个sle控件)
powertip.addtool(cb_1,"测试按钮",0)
powertip.addtool(sle_1,"测试单行文本框",0)
j、为命令按钮、单行文本框定义事件mousemove,事件ID为pbm_mousemove.
k、在cb_1、sle_1的mousemove事件中调用nvo_tooltip对象的relaymsg
函数向windows发送消息
powerTip.RelayMsg(This)
此效果正是我们所要的效果。难道你不想试试吗?
三、结束语
本文比较粗略地讨论了基于PB的用户界面的增强功能。应用此功能后用PB开发的界面将更加引人入胜。但是,以上讨论也有没有涉及的地方,比如浮动按钮是动态生成的,本文还没涉及到按钮clicked事件的实现问题,还有待以后的进一步探讨。关于powertip的实现,我们还可以在不可视对象中再定义一些用户函数,来完成更加复杂的功能,比如改变tip的字体,文字内容,改变tip框的大小等等。但这些功能的有无并不影响我们对基本功能的实现和使用。
最后,愿这段文字能对你的编程思路有一定的启发作用。
四、参考文献
清华大学出版社,《powerbuilder 6.0应用与开发》,吴洁明 编著;
机械工业出版社、西蒙与舒司特国际出版公司,《powerbuilder 6.0程序设计大全》,(美)
Simon Gallagher、Simon Herbert著,康博创作室 译;
返回 主页
附加说明:易蜀水,南航509教研室在读硕士,研究方向:CIMS\PDM\MRPII
戴勇, 南航509教研室教授, 研究方向:CIMS\PDM\MRP II
>资料来源:PB之星
#41
你喜欢做界面,觉得有意思,就开发几个通用的好界面出来;
否则就拿别人做的界面好了。大家互相帮助嘛。:)
否则就拿别人做的界面好了。大家互相帮助嘛。:)
#42
pb 天生就不是这快料,做应用还是用vc。pb强项就是数据库哦。在功能上下工夫吧。
#43
说实话我也正在为这事犯愁呢?
#44
e_mail:xyz1019@263.net
#45
要做出pb的特色,干吗要跟别人学!
#46
只要好好用一下数窗,你想做什么样的界面都可以,不过得花费不少时间在图形上
#47
没纱特殊的法子,就是靠美工补。
这个问题很久前就存在,也一直靠美工来弥补的。
这个问题很久前就存在,也一直靠美工来弥补的。
#48
#49
界面啊。我是自己在做用户对象。好像什么都得重新做啊。
菜鸟有这些经验:
1、字体小于10号
2、用图像处理软件处理一些有自己特色的图标、背影图。
注意颜色搭配,主色彩不亦多于3种。
3、对齐好了也会很美的。
老用别人的,感觉一点都不好。取人精华去其早破。
菜鸟有这些经验:
1、字体小于10号
2、用图像处理软件处理一些有自己特色的图标、背影图。
注意颜色搭配,主色彩不亦多于3种。
3、对齐好了也会很美的。
老用别人的,感觉一点都不好。取人精华去其早破。
#50
要有审美观!!
#1
俺才来的,啥分也没,参与吧,您多少给点
#2
不知道,我看PB做界面实在是太不容易。不是强项啊,要做界面用DELPHI啊,而且它的数据库也很强哦。
PB的话在快速开发数据库方面还是很强的。。。还是不要考虑界面了,在内核上多下工夫吧。
PB的话在快速开发数据库方面还是很强的。。。还是不要考虑界面了,在内核上多下工夫吧。
#3
注意,做界面时注意合理的功能分类或者归类,界面就不会看上去很乱(分类时用groupbox来进行区域的合理划分)。
你可以看看WINDOWS桌面的属性等操作界面也不是很豪华,但却是十分专业、实用
我这里有个自己做的演示界面,可以发送给你。
你可以看看WINDOWS桌面的属性等操作界面也不是很豪华,但却是十分专业、实用
我这里有个自己做的演示界面,可以发送给你。
#4
做界面是有点艺术的,你也发一份给我吧
我感觉还可以定义一些用户对象,比如图片按钮呀
这样会生动一些
我感觉还可以定义一些用户对象,比如图片按钮呀
这样会生动一些
#5
sorry
忘了留e-mail :
cccmouse@china.com
忘了留e-mail :
cccmouse@china.com
#6
wangtaopublic(软件冰子),也给我一份参考一下,可以吗?先谢过啦:eheyi@21cn.com
#7
谢谢,我的email是yxylwt@21cn.com
#8
wangtaopublic(软件冰子),我也是初学者,现在正为界面烦恼,能发给我一份吗?
sclt@21cn.com 谢谢!
sclt@21cn.com 谢谢!
#9
呵呵,大家意见不发,倒成了菜鸟集会的地方了!
#10
我也要
oicq:3380046
lkyuan007@sina.com
oicq:3380046
lkyuan007@sina.com
#11
兄弟、同胞、姐妹、表兄、表姐们:
不要都伸手要,总要贡献出点东西,形成点气氛,不然让贴主:lengxue(冷血)失望了!!
lengxue(冷血) :我可不想喧宾夺主!!
不要都伸手要,总要贡献出点东西,形成点气氛,不然让贴主:lengxue(冷血)失望了!!
lengxue(冷血) :我可不想喧宾夺主!!
#12
软件冰子:我也想要一份。email:YL_YZ@SINA.COM 先谢谢了!
#13
用tab页做界面,很不错。
#14
用PB做界面,就别指望能做出什么好看的界面,还是用Delphi吧,那个做的好看,功能也强
大家都来用Delphi吧!!!!
大家都来用Delphi吧!!!!
#15
可以用树呀,不过比较麻烦,
#16
大家别吵了,想开发数据库就是用powerbuilder!delphi是什么玩意。
#17
to all
调用API函数,会做出与vc++,vb一样好的界面!
调用API函数,会做出与vc++,vb一样好的界面!
#18
to all
界面不在于漂亮,而在简洁、整齐。
界面不在于漂亮,而在简洁、整齐。
#19
软件冰子 我也要一份 e_mail: denise_k@163.net
#20
我有办法,大量使用BMP,可惜,为什么不支持其它格式:(
#21
有什么好的方法?
太多了~~
慢慢学~~
太多了~~
慢慢学~~
#22
多贴图片就完了,其它不会了.
#23
多贴图片就完了,其它不会了.????
#24
谁有陶清那的“使用pb制作的一个流程图风格的启动界面,类似于国产的进销存软件 速达2000的风格”的例子?
如果有的话,请发一个给我。多谢~~~~~~~~~~~~~~~~~~~~~~~~~~
tdsoft@china.com
如果有的话,请发一个给我。多谢~~~~~~~~~~~~~~~~~~~~~~~~~~
tdsoft@china.com
#25
合理搭配颜色。多用自定义颜色,pb给出的颜色大部分很刺眼,尽量少用。
#26
大量的图片 + 大量好看的字体 + 很好的审美观 + 大量通用对象
#27
Simply The Best!
#28
1,多用用户对象
2,尽量界面简洁
3,少一些CB,多一些event,多用mouse click,Dclick
4,可使用pop menu
5,使用MDI
6,界面颜色不要太鲜艳,可用小图标或深色字体加重效果
2,尽量界面简洁
3,少一些CB,多一些event,多用mouse click,Dclick
4,可使用pop menu
5,使用MDI
6,界面颜色不要太鲜艳,可用小图标或深色字体加重效果
#29
PB的界面完全可以做的很漂亮的,如果你有足够的时间
#30
1.统一使用‘宋体’9号字
2.颜色搭配合理
3.使用图片,画龙点睛,不要太多,太花哨
2.颜色搭配合理
3.使用图片,画龙点睛,不要太多,太花哨
#31
其实任何界面都能再pb中实现,甚至用vc实现的界面,关键看有没有这个必要。
#32
你可以做一些对象!比如我们公司的就有一套类库,可以做很多漂亮的界面
但我想做一般的数据库系统,只要简洁就好!
当然!也可用其它语言做一些控件!
但我想做一般的数据库系统,只要简洁就好!
当然!也可用其它语言做一些控件!
#33
可以pb和flash无缝结合,条件是flash要用的好!
#34
阿文,你们公司是做什么的,我们公司也有自己的一套类库的
#35
还可以动态打开窗口
#36
我要说的,只有一句话:多留心别人做出来的好的软件.学一学他的风格加到自己的程序中,我认为是一个不错的主意,要自己凭空去想,我感觉很难,你说呢???
#37
wangtaopublic(软件冰子),也给我一份参考一下,可以吗?先谢过啦:
cssyw@pub.wx.jsinfo.net
cssyw@pub.wx.jsinfo.net
#38
pb一样可以作出漂亮的界面。只要多花点工夫就行了。
#39
我觉得简洁、合理、规范的界面才是最好的界面。就象windows。
#40
基于PowerBuider的程序界面技术的若干讨论
一、问题的提出
PowerBuilder 6.5(以下简称 PB) 是一个面向对象的Client/Server开发工具,它可以在WindowsX.X、Windows NT、Macintosh、Aix/6000、Sun Solaris等开发平台上运行。PB作为数据库的前端开发工具,以其全面的功能和优异的性能受到广大开发者的青昧。但是PB开发的用户界面尽管清晰大方,但是它自身并没有实现Windows界面功能的对象。本文专门针对此问题讨论在PB中怎样实现浮动按钮、按钮的PowerTip提示技术。应用该技术后,PB开发的用户界面可以更加美观,更加具有商业化风格。
二、浮动按钮、按钮的PowerTip提示的具体实现
1、浮动按钮在PB中的实现
(1) 基本原理
实现此功能的关键是捕获Windows鼠标的移动消息,这通过在相应对象中自定义mousemove事件可以实现。然后在相应的事件中书写代码,用openuserobject()函数动态地生成可视的命令按钮。
(2) 具体方法和过程
本例中包括一个静态文本框st_1,其text属性为‘确定’,border属性为’box’。记下它的x、y、width、height属性值,具体的x=544,y=360,width=503,height=80。
然后在st_1中自定义事件mousemove ,事件ID为pbm_mousemove,在此事件中写入如下代码:
st_1.visible=false //当鼠标在st_1中移动时触发此事件并使st_1为不可见
commandbutton lc_mybutton //申明一个命令按钮实例
openuserobject(lc_mybutton,"commandbutton",544,360) //打开用户对象并在指定位置(前面我们记下的x和y值)显示
lc_mybutton.width=503 //设置命令按钮的宽度(和静态文本同宽)
lc_mybutton.height=80 //设置命令按钮的高度(和静态文本同高)
lc_mybutton.enabled=true//设置使能属性
lc_mybutton.facename='arial'//设置按钮上的字体
lc_mybutton.pointer='e:\fjm\hand-l.cur'//设置当按钮创建后的指针
lc_mybutton.text='确定'//设置命令按钮的text属性
lc_mybutton.textsize=20//设置字体的大小
lc_mybutton.visible=true//设置按钮的可见性
parent.control[ UpperBound( parent.control ) + 1] = lc_mybutton//将命令按钮加入示例窗口的控件数组中去
最后在示例窗口的mousemove事件中写入以下代码:
st_1.visible=true//当鼠标离开命令按钮进入窗口时触发此事件,恢复st_1的可视性。
2、按钮的PowerTip提示在 PB中的实现方法
(1) 基本原理
定义一个不可视用户对象,在此对象中申明本地外部函数,引入Windows API函数。然后编写用户对象函数实现向Windows发送消息等功能(例如应用窗口的句柄、为text分配内存空间、向应用窗口发送消息等等),以便在主程序中调用。在主程序中,申明此用户对象的实例变量,在相应控件事件中调用不可视用户对象函数,从而实现按钮的Powertip功能。
(2) 具体方法和过程
a、 在用户对象画板中建一个不可视用户对象名为nvo_powertip(class custom类型)
b、申明实例变量
Private:
// 常量申明
CONSTANT string TOOLTIPS_CLASS='tooltips_class32'
CONSTANT ulong CW_USEDEFAULT= 2147483648
CONSTANT long WM_USER = 1024
CONSTANT long WS_EX_TOPMOST= 8
CONSTANT long WM_SETFONT= 48
// PowerTip 消息
CONSTANT long TTM_ADDTOOL = WM_USER + 4
CONSTANT long TTM_NEWTOOLRECT = WM_USER + 6
CONSTANT long TTM_RELAYEVENT = WM_USER + 7
CONSTANT long TTM_UPDATETIPTEXT= WM_USER + 12
CONSTANT long TTM_TRACKACTIVATE= WM_USER + 17
CONSTANT long TTM_TRACKPOSITION= WM_USER + 18
//公共变量和常量
Public:
long hWndTT // Powertip 控件窗口的句柄
long ToolID = 1 //Powertip内部ID
// Powertip 标志
CONSTANT integer TTF_CENTERTIP = 2
CONSTANT integer TTF_RTLREADING= 4
CONSTANT integer TTF_SUBCLASS= 16
CONSTANT integer TTF_TRACK= 32
CONSTANT integer TTF_ABSOLUTE= 128
CONSTANT integer TTF_TRANSPARENT = 256
CONSTANT integer TTF_DI_SETITEM= 32768
c、在Local Extenal Function…申明此用户对象用的API函数
// 处理Powertip的外部函数
c.1 SubRoutine InitCommonControls() library "comctl32.dll"
c.2 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"
c.3 Function integer DestroyWindow(long hWnd) library "user32.dll"
c.4 Function integer ToolTipMsg(long hWnd, long uMsg, long wParam, REF TOOLINFO ToolInfo) library "user32.dll" Alias For "SendMessageA"
c.5 Function integer RelayMsg(long hWnd, long uMsg, long wParam, REF MSG Msg) library "user32.dll" Alias For "SendMessageA"
// 内存处理函数
c.6 Function long LocalAlloc(long Flags, long Bytes) library "kernel32.dll"
c.7 Function long LocalFree(long MemHandle) library "kernel32.dll"
c.8 Function long lstrcpy(long Destination, string Source) library "kernel32.dll"
style="MARGIN-LEFT: 84.75pt; TEXT-ALIGN: left">d、定义用户结构变量:msg、point、rect、toolinfo
msg结构定义如下:
>变量名称 >变量类型
Hwnd Long
Message Long
>Wparam >Long
>Lparam >Long
>Time >Long
>Pt >point
style="MARGIN-LEFT: 84.75pt; TEXT-ALIGN: left"> Point结构定义如下:
变量名称 变量类型
X Long
Y Long
style="MARGIN-LEFT: 84.75pt; TEXT-ALIGN: left"> Rect结构定义如下
变量名称 变量类型
Left Long
Right Long
op Long
Bottom Long
Toolinfo结构定义如下:
变量名称 变量类型
Cbsize Long
Uflags Long
Hwnd Long
Uid Long
Rect Rect
Hinstance Long
Lpsztext long
、在用户对象的constructor事件中写入代码(功能是得到应用窗口的句柄,为hwnd赋值)
> InitCommonControls()
hWndTT = CreateWindowExA(WS_EX_TOPMOST,TOOLTIPS_CLASS,0,& TTF_CENTERTIP, CW_USEDEFAULT, CW_USEDEFAULT, &
CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, Handle(GetApplication()),0)
f、在用户对象的destructor事件中写入代码(释放应用窗口的句柄)
DestroyWindow(hWndTT)
g、编写用户对象的函数。(addtool函数、relaymsg函数)
g.1 addtool函数的编制
; 函数名:addtool,
参数名称 参数类型
Object Dragobject
Tiptext String
Flags integer
返回值:integer
函数体:
TOOLINFO ToolInfo
ToolInfo.cbSize = 40
ToolInfo.uFlags = Flags
ToolInfo.hWnd = Handle(Object)
ToolInfo.hInstance = 0 // Not used
ToolInfo.uID = ToolID
ToolID++
ToolInfo.lpszText = LocalAlloc(0,80)
POST LocalFree(ToolInfo.lpszText) // Free Allocated Memory
lStrCpy(ToolInfo.lpszText,Left(tiptext,80))
ToolInfo.Rect.Left 0
ToolInfo.Rect.Top = 0
ToolInfo.Rect.Right = UnitsToPixels(Object.Width,XUnitsToPixels!)
ToolInfo.Rect.Bottom= UnitsToPixels(Object.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)
g.2、relaymsg函数的编制
函数名称:relaymsg
参数名称 >参数类型
Object Dragobject
返回值:无
函数功能:向应用程序窗口发送控件信息
函数体:
s MSG Msg
Msg.hWnd = Handle(Object)
Msg.Message = 512 // WM_MOUSEMOVE,windows提供的事件的数值编号,mousemove事件的编号为512.
Msg.WParam = Message.WordParm
Msg.LParam = Message.LongParm
RelayMsg(hWndTT,TTM_RELAYEVENT,0,Msg)
至此用户对象的准备工作已完全就绪。接下来在应用程序中相应事件中调用刚才定义的函数了。
h、在应用程序主窗口中定义实例变量
nvo_ToolTip PowerTip
i、在主窗口的open事件中将要显示powertip的控件向windows系统注册(假如
窗口中有一个命令按钮和一个sle控件)
powertip.addtool(cb_1,"测试按钮",0)
powertip.addtool(sle_1,"测试单行文本框",0)
j、为命令按钮、单行文本框定义事件mousemove,事件ID为pbm_mousemove.
k、在cb_1、sle_1的mousemove事件中调用nvo_tooltip对象的relaymsg
函数向windows发送消息
powerTip.RelayMsg(This)
此效果正是我们所要的效果。难道你不想试试吗?
三、结束语
本文比较粗略地讨论了基于PB的用户界面的增强功能。应用此功能后用PB开发的界面将更加引人入胜。但是,以上讨论也有没有涉及的地方,比如浮动按钮是动态生成的,本文还没涉及到按钮clicked事件的实现问题,还有待以后的进一步探讨。关于powertip的实现,我们还可以在不可视对象中再定义一些用户函数,来完成更加复杂的功能,比如改变tip的字体,文字内容,改变tip框的大小等等。但这些功能的有无并不影响我们对基本功能的实现和使用。
最后,愿这段文字能对你的编程思路有一定的启发作用。
四、参考文献
清华大学出版社,《powerbuilder 6.0应用与开发》,吴洁明 编著;
机械工业出版社、西蒙与舒司特国际出版公司,《powerbuilder 6.0程序设计大全》,(美)
Simon Gallagher、Simon Herbert著,康博创作室 译;
返回 主页
附加说明:易蜀水,南航509教研室在读硕士,研究方向:CIMS\PDM\MRPII
戴勇, 南航509教研室教授, 研究方向:CIMS\PDM\MRP II
>资料来源:PB之星
一、问题的提出
PowerBuilder 6.5(以下简称 PB) 是一个面向对象的Client/Server开发工具,它可以在WindowsX.X、Windows NT、Macintosh、Aix/6000、Sun Solaris等开发平台上运行。PB作为数据库的前端开发工具,以其全面的功能和优异的性能受到广大开发者的青昧。但是PB开发的用户界面尽管清晰大方,但是它自身并没有实现Windows界面功能的对象。本文专门针对此问题讨论在PB中怎样实现浮动按钮、按钮的PowerTip提示技术。应用该技术后,PB开发的用户界面可以更加美观,更加具有商业化风格。
二、浮动按钮、按钮的PowerTip提示的具体实现
1、浮动按钮在PB中的实现
(1) 基本原理
实现此功能的关键是捕获Windows鼠标的移动消息,这通过在相应对象中自定义mousemove事件可以实现。然后在相应的事件中书写代码,用openuserobject()函数动态地生成可视的命令按钮。
(2) 具体方法和过程
本例中包括一个静态文本框st_1,其text属性为‘确定’,border属性为’box’。记下它的x、y、width、height属性值,具体的x=544,y=360,width=503,height=80。
然后在st_1中自定义事件mousemove ,事件ID为pbm_mousemove,在此事件中写入如下代码:
st_1.visible=false //当鼠标在st_1中移动时触发此事件并使st_1为不可见
commandbutton lc_mybutton //申明一个命令按钮实例
openuserobject(lc_mybutton,"commandbutton",544,360) //打开用户对象并在指定位置(前面我们记下的x和y值)显示
lc_mybutton.width=503 //设置命令按钮的宽度(和静态文本同宽)
lc_mybutton.height=80 //设置命令按钮的高度(和静态文本同高)
lc_mybutton.enabled=true//设置使能属性
lc_mybutton.facename='arial'//设置按钮上的字体
lc_mybutton.pointer='e:\fjm\hand-l.cur'//设置当按钮创建后的指针
lc_mybutton.text='确定'//设置命令按钮的text属性
lc_mybutton.textsize=20//设置字体的大小
lc_mybutton.visible=true//设置按钮的可见性
parent.control[ UpperBound( parent.control ) + 1] = lc_mybutton//将命令按钮加入示例窗口的控件数组中去
最后在示例窗口的mousemove事件中写入以下代码:
st_1.visible=true//当鼠标离开命令按钮进入窗口时触发此事件,恢复st_1的可视性。
2、按钮的PowerTip提示在 PB中的实现方法
(1) 基本原理
定义一个不可视用户对象,在此对象中申明本地外部函数,引入Windows API函数。然后编写用户对象函数实现向Windows发送消息等功能(例如应用窗口的句柄、为text分配内存空间、向应用窗口发送消息等等),以便在主程序中调用。在主程序中,申明此用户对象的实例变量,在相应控件事件中调用不可视用户对象函数,从而实现按钮的Powertip功能。
(2) 具体方法和过程
a、 在用户对象画板中建一个不可视用户对象名为nvo_powertip(class custom类型)
b、申明实例变量
Private:
// 常量申明
CONSTANT string TOOLTIPS_CLASS='tooltips_class32'
CONSTANT ulong CW_USEDEFAULT= 2147483648
CONSTANT long WM_USER = 1024
CONSTANT long WS_EX_TOPMOST= 8
CONSTANT long WM_SETFONT= 48
// PowerTip 消息
CONSTANT long TTM_ADDTOOL = WM_USER + 4
CONSTANT long TTM_NEWTOOLRECT = WM_USER + 6
CONSTANT long TTM_RELAYEVENT = WM_USER + 7
CONSTANT long TTM_UPDATETIPTEXT= WM_USER + 12
CONSTANT long TTM_TRACKACTIVATE= WM_USER + 17
CONSTANT long TTM_TRACKPOSITION= WM_USER + 18
//公共变量和常量
Public:
long hWndTT // Powertip 控件窗口的句柄
long ToolID = 1 //Powertip内部ID
// Powertip 标志
CONSTANT integer TTF_CENTERTIP = 2
CONSTANT integer TTF_RTLREADING= 4
CONSTANT integer TTF_SUBCLASS= 16
CONSTANT integer TTF_TRACK= 32
CONSTANT integer TTF_ABSOLUTE= 128
CONSTANT integer TTF_TRANSPARENT = 256
CONSTANT integer TTF_DI_SETITEM= 32768
c、在Local Extenal Function…申明此用户对象用的API函数
// 处理Powertip的外部函数
c.1 SubRoutine InitCommonControls() library "comctl32.dll"
c.2 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"
c.3 Function integer DestroyWindow(long hWnd) library "user32.dll"
c.4 Function integer ToolTipMsg(long hWnd, long uMsg, long wParam, REF TOOLINFO ToolInfo) library "user32.dll" Alias For "SendMessageA"
c.5 Function integer RelayMsg(long hWnd, long uMsg, long wParam, REF MSG Msg) library "user32.dll" Alias For "SendMessageA"
// 内存处理函数
c.6 Function long LocalAlloc(long Flags, long Bytes) library "kernel32.dll"
c.7 Function long LocalFree(long MemHandle) library "kernel32.dll"
c.8 Function long lstrcpy(long Destination, string Source) library "kernel32.dll"
style="MARGIN-LEFT: 84.75pt; TEXT-ALIGN: left">d、定义用户结构变量:msg、point、rect、toolinfo
msg结构定义如下:
>变量名称 >变量类型
Hwnd Long
Message Long
>Wparam >Long
>Lparam >Long
>Time >Long
>Pt >point
style="MARGIN-LEFT: 84.75pt; TEXT-ALIGN: left"> Point结构定义如下:
变量名称 变量类型
X Long
Y Long
style="MARGIN-LEFT: 84.75pt; TEXT-ALIGN: left"> Rect结构定义如下
变量名称 变量类型
Left Long
Right Long
op Long
Bottom Long
Toolinfo结构定义如下:
变量名称 变量类型
Cbsize Long
Uflags Long
Hwnd Long
Uid Long
Rect Rect
Hinstance Long
Lpsztext long
、在用户对象的constructor事件中写入代码(功能是得到应用窗口的句柄,为hwnd赋值)
> InitCommonControls()
hWndTT = CreateWindowExA(WS_EX_TOPMOST,TOOLTIPS_CLASS,0,& TTF_CENTERTIP, CW_USEDEFAULT, CW_USEDEFAULT, &
CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, Handle(GetApplication()),0)
f、在用户对象的destructor事件中写入代码(释放应用窗口的句柄)
DestroyWindow(hWndTT)
g、编写用户对象的函数。(addtool函数、relaymsg函数)
g.1 addtool函数的编制
; 函数名:addtool,
参数名称 参数类型
Object Dragobject
Tiptext String
Flags integer
返回值:integer
函数体:
TOOLINFO ToolInfo
ToolInfo.cbSize = 40
ToolInfo.uFlags = Flags
ToolInfo.hWnd = Handle(Object)
ToolInfo.hInstance = 0 // Not used
ToolInfo.uID = ToolID
ToolID++
ToolInfo.lpszText = LocalAlloc(0,80)
POST LocalFree(ToolInfo.lpszText) // Free Allocated Memory
lStrCpy(ToolInfo.lpszText,Left(tiptext,80))
ToolInfo.Rect.Left 0
ToolInfo.Rect.Top = 0
ToolInfo.Rect.Right = UnitsToPixels(Object.Width,XUnitsToPixels!)
ToolInfo.Rect.Bottom= UnitsToPixels(Object.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)
g.2、relaymsg函数的编制
函数名称:relaymsg
参数名称 >参数类型
Object Dragobject
返回值:无
函数功能:向应用程序窗口发送控件信息
函数体:
s MSG Msg
Msg.hWnd = Handle(Object)
Msg.Message = 512 // WM_MOUSEMOVE,windows提供的事件的数值编号,mousemove事件的编号为512.
Msg.WParam = Message.WordParm
Msg.LParam = Message.LongParm
RelayMsg(hWndTT,TTM_RELAYEVENT,0,Msg)
至此用户对象的准备工作已完全就绪。接下来在应用程序中相应事件中调用刚才定义的函数了。
h、在应用程序主窗口中定义实例变量
nvo_ToolTip PowerTip
i、在主窗口的open事件中将要显示powertip的控件向windows系统注册(假如
窗口中有一个命令按钮和一个sle控件)
powertip.addtool(cb_1,"测试按钮",0)
powertip.addtool(sle_1,"测试单行文本框",0)
j、为命令按钮、单行文本框定义事件mousemove,事件ID为pbm_mousemove.
k、在cb_1、sle_1的mousemove事件中调用nvo_tooltip对象的relaymsg
函数向windows发送消息
powerTip.RelayMsg(This)
此效果正是我们所要的效果。难道你不想试试吗?
三、结束语
本文比较粗略地讨论了基于PB的用户界面的增强功能。应用此功能后用PB开发的界面将更加引人入胜。但是,以上讨论也有没有涉及的地方,比如浮动按钮是动态生成的,本文还没涉及到按钮clicked事件的实现问题,还有待以后的进一步探讨。关于powertip的实现,我们还可以在不可视对象中再定义一些用户函数,来完成更加复杂的功能,比如改变tip的字体,文字内容,改变tip框的大小等等。但这些功能的有无并不影响我们对基本功能的实现和使用。
最后,愿这段文字能对你的编程思路有一定的启发作用。
四、参考文献
清华大学出版社,《powerbuilder 6.0应用与开发》,吴洁明 编著;
机械工业出版社、西蒙与舒司特国际出版公司,《powerbuilder 6.0程序设计大全》,(美)
Simon Gallagher、Simon Herbert著,康博创作室 译;
返回 主页
附加说明:易蜀水,南航509教研室在读硕士,研究方向:CIMS\PDM\MRPII
戴勇, 南航509教研室教授, 研究方向:CIMS\PDM\MRP II
>资料来源:PB之星
#41
你喜欢做界面,觉得有意思,就开发几个通用的好界面出来;
否则就拿别人做的界面好了。大家互相帮助嘛。:)
否则就拿别人做的界面好了。大家互相帮助嘛。:)
#42
pb 天生就不是这快料,做应用还是用vc。pb强项就是数据库哦。在功能上下工夫吧。
#43
说实话我也正在为这事犯愁呢?
#44
e_mail:xyz1019@263.net
#45
要做出pb的特色,干吗要跟别人学!
#46
只要好好用一下数窗,你想做什么样的界面都可以,不过得花费不少时间在图形上
#47
没纱特殊的法子,就是靠美工补。
这个问题很久前就存在,也一直靠美工来弥补的。
这个问题很久前就存在,也一直靠美工来弥补的。
#48
#49
界面啊。我是自己在做用户对象。好像什么都得重新做啊。
菜鸟有这些经验:
1、字体小于10号
2、用图像处理软件处理一些有自己特色的图标、背影图。
注意颜色搭配,主色彩不亦多于3种。
3、对齐好了也会很美的。
老用别人的,感觉一点都不好。取人精华去其早破。
菜鸟有这些经验:
1、字体小于10号
2、用图像处理软件处理一些有自己特色的图标、背影图。
注意颜色搭配,主色彩不亦多于3种。
3、对齐好了也会很美的。
老用别人的,感觉一点都不好。取人精华去其早破。
#50
要有审美观!!