不仅仅是100分...关于界面问题

xing_xing 2000-11-16 01:36:00
我想在PB编程中,能得到漂亮的界面。如在PB编程中如何与Flash技术结合好得到漂亮的界面。主要是解决开始界面的问题。如何调用API函数使窗口没有标题栏或者去掉最大化,只保留最小化及关闭。只要回答就有分加。
...全文
328 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
am2000 2001-06-08
  • 打赏
  • 举报
回复
基于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之星

blueswind 2000-12-21
  • 打赏
  • 举报
回复
OLE???
kevin_w 2000-12-20
  • 打赏
  • 举报
回复
WK,这种问题也要这么多人在讨论这么久,,,社会主义啊
pc00000 2000-12-20
  • 打赏
  • 举报
回复
干吗那么繁 啊!
PB 中把窗口属性设成POPUP !
除了VISUALABLE , ENABLE 以外全部去掉钩!
在窗口的SHOW事件中把窗口大小调整到屏幕大小!
在右上角做两个小按钮, 一个实现最小化, 一个关闭!
OK ?
szjlq 2000-12-12
  • 打赏
  • 举报
回复
要去掉标题栏可用API
FUNCTION ulong SetWindowulong(ulong hwnd,ulong nIndex,ulong dwNewLong) LIBRARY "user32.dll" ALIAS FOR "SetWindowLongA"
FUNCTION ulong SetWindowPos(ulong hwnd,ulong hWndInsertAfter,ulong x,ulong y,ulong cx,ulong cy,ulong wFlags) LIBRARY "user32.dll"
先用
SetWindowuLong(handle(this),-16,369360896)
然后用
Setwindowpos为窗口指定一个新位置和状态,在PB中注意要转换成PIX(UnitsToPixels)
lizx 2000-12-12
  • 打赏
  • 举报
回复
请访问我的帖子http://www.csdn.net/expert/TopicView.asp?id=44603,有源码送,不过你的分要给我才行
lukex 2000-11-20
  • 打赏
  • 举报
回复
你可到陶清网站www.pdriver.com,在首页上就有几个作的非常酷的软件界面,有一个触摸屏查询的程序就是pb和flash结合的,你不妨参考一下.
longzu 2000-11-20
  • 打赏
  • 举报
回复
你的问题都可以通过设置窗口属性解决嘛!
PB做的界面的确是难看,每次不管我怎么费心,可做出来的界面老板就是不满意,因为他是学美术的,也用PHOTOSHOP、FLASH什么的,做出来的东东让人眼花缭乱的。唉!我现在只要是一般的小软件都用VB或DELPHI了!
RedFire 2000-11-16
  • 打赏
  • 举报
回复
呵呵。你只要调整窗口的类型就可以在设计的时候设置标题栏什么的,当然也可以设置最大,最小,关闭按钮什么的。

要在PB中调用api函数的话,你要在global extenal function或者local extenal function中先声明api,然后就可以调用了。
下面是一个声明的例子:
Function Boolean ShowWindow(Long Hwnd, Integer Show) LIBRARY "user32.dll"

在窗口的open事件中调用如下:
ShowWindow(Handle(This), 3); // 最大化

good luck.

604

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 控件与界面
社区管理员
  • 控件与界面社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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