PB中消息对话框的居中显示.doc_第1页
PB中消息对话框的居中显示.doc_第2页
PB中消息对话框的居中显示.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PB中消息对话框的居中显示(深圳:独孤求败2003-05-26)与大多数的开发环境相类似,PowerBuilder(以下简称PB)中的MessageBox函数是不提供对话框居中显示功能的。但在PB中我们可以通过多线程技术来解决这个问题。由于MessageBox函数要在对话框关闭后才能返回,所以我们无法使用线程同步技术。为此,我们在应用程序的主线程中创建一个新线程,该线程将在指定的时间内循环调用FindWindowEx函数来查找MessageBox函数生成的对话框,在获得对话框句柄后,调用MoveWindow函数改变窗口位置使其居中。在PB中实现多线程技术,有两种方法:一种是用VC将各种操作写入函数并编译成动态链接库供PB调用;另一种是用PB的SharedObject系列函数来实现多线程。本文基于PB的编程技术,介绍第二种实现方法。SharedObject系列函数和共享对象有关的函数包括:SharedObjectRegister、SharedObjectGet、SharedObjectUnregister和SharedObjectDirectory函数。首先,用SharedObjectRegister函数初始化共享对象,并建立一个单独的线程。如:SharedObjectRegister(“ccuo_thread”,“thread1”)其中ccuo_thread是一个共享的自定义类用户对象的类名,thread1是共享对象实例的共享名。如果SharedObjectRegister函数返回Success,则新线程创建成功。然后,执行指定代码。有两种方法让新线程执行指定的代码:一种是在自定义类用户对象的constructor事件中编写脚本,新线程创建后就会自动执行该事件脚本;另一种方法是使用SharedObjectGet函数。该函数实现共享对象实例的引用,如:SharedObjectGet(“thread1”,inv_thread)其中inv_thread是用来存储共享对象实例的一个对象变量,要求与ccuo_thread具有同一个类名。最后,通过使用Post语句,即以inv_thread.Postof_function(agrs)的形式,异步调用共享对象的函数of_function。在完成任务后,可以用SharedObjectUnregister函数中止线程,也可用SharedObjectDirectory函数列出所有有效的共享对象。函数调用部分本文所用Win32API函数原型为:FunctionUlongFindWindowA(StringlpClassName,StringlpWindowName)Library“user32.dll”FunctionUlongGetTickCount()Library“kernel32.dll”FunctionUlongGetDesktopWindow()Library“user32.dll”FunctionBooleanGetWindowRect(UlonghWnd,refstc_rectlpRect)Library“user32.dll”FunctionBooleanMoveWindow(UlonghWnd,intX,intY,intnWidth,intnHeight,BooleanbRepaint)Library“user32.dll”下面具体讨论如何实现消息对话框的居中显示:/声明对象变量ccuo_threadlccuo_thread/创建新线程SharedObjectRegister(ccuo_thread,thread_center)/引用实例SharedObjectGet(thread_center,lccuo_thread)/调用窗口居中函数lccuo_thread.Postof_center(32770,Demostration,2000)/创建消息对话框MessageBox(Demostration,Copyright(c)2001byY.L.Sun)/中止线程SharedObjectunRegister(thread_center)函数实现部分实现窗口居中显示的函数是自定义类用户对象ccuo_thread的对象函数of_center,其实现代码如下:ccuo_thread.of_center(Stringlpclassname,Stringlpwindowname,Ulongdwtimeout)returnBoolean/lpclassname:消息对话框的类名(32770)/lpwindowname:消息对话框的标题/dwtimeout:超时计数Ulonglul_hwnd/存放消息对话框的句柄Ulonglul_start/计时开始时刻的值lul_start=GetTickCount()/计时开始do/查找顶层窗口lul_hwnd=FindWindowA(lpclassname,lpwindowname)/找到顶层窗口后,跳出循环iflul_hwnd0thenexit/判断是否已超时loopwhileGetTickCount()lul_startdwtimeout/没有找到消息对话框iflul_hwnd=0thenreturnfalseelse/对话框居中returnof_center(0,lul_hwnd)endifof_center的重载函数代码如下:ccuo_thread.of_center(Ulonghwndp,Ulonghwndc)returnBoolean/hwndp:父窗口的句柄,值为0时认为是桌面/hwndc:子窗口的句柄intli_x/窗口的X坐标intli_y/窗口的Y坐标stc_rectlstc_parent/父窗口的4边坐标stc_rectlstc_child/子窗口的4边坐标/值为0时认为是桌面ifhwndp=0thenhwndparent=GetDesktopWindow()/获得窗口的4边坐标ifnotGetWindowRect(hwndcurrent,lstc_child)thenreturnfalseifnotGetWindowRect(hwndparent,lstc_parent)thenreturnfalseli_x=(lstc_parent.rightlstc_parent.left)(lstc_child.rightlstc_child.left)/2li_y=(lstc_parent.bottomlstc_parent.top)(lstc_child.bottomlstc_child.top)/2/计算子窗口的X、Y坐标ifli_x0orli_y0thenretu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论