转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 常用软件 >> 正文
PowerBuilde应用开发系列讲座(19)续         

PowerBuilde应用开发系列讲座(19)续

作者:闵涛 文章来源:闵涛的学习笔记 点击数:948 更新时间:2009/4/24 21:43:44
p>工作原理

  OPEN事件中的代码是为了调整卷滚条的滚动速度。AddHScroll和AddVScroll中的代码分别加入水平和垂直卷滚条。RemoveHScroll和RemoveVScroll除分别移去水平和垂直卷滚条外,还要使用WindowsAPI调用。GetScrollPos函数可返回滚动块在卷滚条上的当前位置。我们必须告诉该函数需要的是哪个窗口上的哪个卷滚条的信息。在WindowsAPI中,"指向"一个窗口的方法是通过引用它 的"句柄"。PowerBuilder提供了获得应用中的指定窗口句柄的函数,这个函数叫作Handl e()。因为这些自定义用户事件是在窗口自身当中定义的,所以我们只需要将"this"作为 参数传递给Handle函数。0做为第二个参数,告诉Handle函数我们需要知道水平卷滚条的 值;而传递1则表示需要知道垂直卷滚条的值。通过将当前卷滚位置与最小位置相比较,我们就会知道用户是否滚动过窗口。如果滚动过窗口,我们就向窗口发送一个消息告诉它将窗口恢复原状。与WM_VSCROLL和WM_HSCROLL消息相对应的消息号分别是227和226。在WM_VSCROLL中,我们发送SB_TOP(6),它使窗口滚动到顶部。在WM_HSCROLL中,我们发送5使窗口滚动到左边。当用户试图最小化或最大化窗口时,卷滚条的行为会有所不同。

  我们知道,PowerBuilder 的resize事件所映射的Windows事件WM_SIZE是在一个窗口被改变大小以后触发的。而当 用户试图最小化一个窗口时,要在最小化发生之前关闭卷滚条。因此,在这种情况下resi ze事件中的代码是来不及起作用的。在这里,我们采取的方法是定义了一个映射到WM_CO MMAND消息的事件。当用户试图最小化窗口时,随该消息一起发送的值是61472。因此,如果该事件的值是61472,我们只需简单地移去卷滚条。问题是完成这些操作后,系统还将激 发一个resize事件,resize事件中是引入实例变量ib_minimized的地方。在syscommand事 件中我们设定实例变量,在resize事件中,检查该变量。该变量告诉resize事件用户正在 最小化窗口,于是resize事件就不会处理卷滚条。如果用户将窗口复原,syscommand事件 将再次被激发,但这次传递给消息的值就不是61472了。因此syscommand事件中仅仅将实 例变量标识复位,于是resize事件就又能处理卷滚条了。本文的讨论范围。 使用PowerBuilder另外500个函数(上) 乍一看到这个题目,我们可能会觉得很玄。PowerBuilder系统自身提供的函数大约只有2 00多个(不考虑多态函数),我们何从得到另外500多个函数呢? 我们在以前讨论过如? 用Windows API标准调用外部函数的问题。而使用过WindowsSD K编程的开发人员都知道,在USER.EXE、GDI.EXE等可执行文件和动态连接库中,Windows本身提供了大量函数。这些函数在PowerBuilder中都是可以直接调用的。这样我们的函数库就一下子又扩充了500多个。 在这些API函数中,相当一部分是非常有用的,我们将分类向大家介绍。

  本期介绍一些在处理自动卷滚条时用到的函数。自动卷滚条缺省情况下,MDI表单是可以重新设定大小的。这样用户就可以将窗口设成比原先的小。这种情况下,必须对窗口设置卷滚条的属性,以访问窗口上的一些控件。而另一方面,除非窗口确实小到不足以显示所有的控件,否则没有必要提供卷滚条。许多Windows的MDI应用在处理这一问题时是这样做的:当窗口小到无法显示所有控件时, 打开卷滚条;而窗口大小合适时,关闭卷滚条。PowerBuilder系统本身并没有提供自动处理上述操作的功能,但是我们自己加上这一功能是很容易的,而且实现上述自动卷滚条的功能也用不到Windows API调用,只需在MDI表单窗口的resize事件中触发另一个事件,以判断在当前窗口尺寸小于某一阈值时显示卷滚条(后面将介绍为什么要另外触发一个事件 ,而不在resize事件中直接做)。此后用户在滚动卷滚条时,窗口会自动随之滚动;当用户再次改变窗口大小并大于该阈值时,我们应该关闭卷滚条,我们仍然可以不调用Windows API而做到这一点。然而在整个例子中,真正有难度的是在关闭卷滚条之前,我们需要检查 用户是否滚动了卷滚条。如果用户滚动了卷滚条,我们则应当首先将窗口移回原始状态, 这就要用到Windows API函数了。因为我们需要确定:卷滚条的滚动范围、滚动块在卷滚 条上的当前位置。为了做到这一点,我们需要使用两个Windows API调用:GetScrollPos和 GetScrollRange。 为了使用这两个API函数,首先在需要使用它们的窗口中将它们声明为local external函 数。在Local external函数对话框中,加入如下语句:

Function int GetScrollPos(uint Handle,int Bar)Library"USER.EXE"

SubRoutine GetScrollRange(uint Handle,int Bar,Ref int MinPos,RefintMaxPos)Li brary"USER.EXE"

同时在该窗口中声明如下实例变量:

//判断用户是否要最小化窗口
Boolean ib_minimized=FALSE
//判断是否显示卷滚框
int ii_desired_height=1000
int ii_desired_width=2000

  其中的两个整形变量ii_desired_height和ii_desired_width是用来决定什么时候打开或移去卷滚条的阈值。当然,每个窗口中都必须设置这两个变量。为了使窗口更为通用,我们也可以定义一个窗口级的函数,该函数在窗口open事件中能分析窗口的control属性,也就是窗口内所有控件的最大值,以决定应将以上两个整形变量设置为多少。布尔型实例变量ib_minimized是用来确定用户是否正要将窗口最小化。如果是,则我们处理卷滚条时会有些不同,稍后我们将讨论这种情况。

在open事件中,加入如下语句:

this.LinesPerPage=10
this.ColumnsPerPage=10
this.UnitsPerLine=this.ii_desired_height*.009
this.UnitsPerColumn=this.ii_desired_width*.009

  监视resize 接下来要监视resize事件,根据用户改变窗口大小的不同方式,改变卷滚条的状态。这里的问题是,在移去或加上卷滚条时会引起另一个resize事件。因此,在resize事件中直接改变卷滚条的状态会引起递归调resize事件,这是我们不希望发生的。为了防止递归调用,我们要定义一些用户自定义事件,在这些事件中处理卷滚条的移去或加入。在用户事件对话框中,输入如下值:

EventName EventID
addhscroll pbm_custom01
addvscroll pbm_custom02
removehscroll pbm_custom03
removevscroll pbm_custom04
syscommand pbm_syscommand

加入前4个自定义用户事件的语句如下:

ADDHSCROLL事件:

//加入卷滚条
this.hscrollbar=TRUE

ADDVSCROLL事件:

//加入卷滚条
this.vscrollbar=TRUE

REMOVEHSCROLL事件:

uint WinHandle
nteger ScrollPos,MinPos,MaxPos
//得到窗口句柄
WinHandle=Handle(this)
//得到滚动块在卷滚条上的当前位置
ScrollPos=GetScrollPos(WinHandle,0)
//得到卷滚条的滚动范围
GetScrollRange(WinHandle,0,MinPos,MaxPos)
//滚动窗口
IF ScrollPos >MinPos THEN

Send(WinHandle,276,5,0)
ScrollPos = GetScrollPos ( WinHandle, 0 )
//消除滚动条
this.hscrollbar=FALSE

REMOVEVSCROLL事件:

uint WinHandle
integer ScrollPos,MinPos,MaxPos
WinHandle = Handle ( this )
ScrollPos = GetScrollPos ( WinHandle, 1 )
GetScrollRange ( WinHandle, 1, MinPos, MaxPos )
IF ScrollPos > MinPos THEN

Send ( WinHandle, 277, 6, 0 )
this.vscrollbar = FALSE

  我们还需要在resize事件中增加下列代码以决定什么时候调用这些自定义用户事件。

RESIZE事件:

//如用户进行的是最小化窗口的操作则返回
IF ib_minimized THEN

Return

ELSE
//否则考察是否需要卷滚条
IF this.width < ii_desired_width AND NOT this.hscrollbar THEN

PostEvent (th is, "AddHScroll" )

IF this.height < ii_desired_height AND NOT this.vscrollbar THEN

PostEvent( this, "AddVScroll" )

IF this.width > ii_desired_width AND this.hscrollbar THEN

PostEvent ( this,"RemoveHScroll" )

IF this.height > ii_desired_height AND this.vscrollbar THEN

PostEvent ( this, "RemoveVScroll" )

END IF

SYSCOMMAND事件:

//如用户试图最小化窗口,则立即取消卷滚条
IF message.wordparm = 61472 THEN

ib_minimized = TRUE
this.vscrollbar = FALSE
this.hscrollbar = FALSE

ELSE

ib_minimized = FALSE

END IF

工作原理

  OPEN事件中的代码是为了调整卷滚条的滚动速度。AddHScroll和AddVScroll中的代码分别加入水平和垂直卷滚条。RemoveHScroll和RemoveVScroll除分别移去水平和垂直卷滚条外,还要使用WindowsAPI调用。

   GetScrollPos函数可返回滚动块在卷滚条上的当前位置。我们必须告诉该函数需要的是哪个窗口上的哪个卷滚条的信息。在WindowsAPI中,"指向"一个窗口的方法是通过引用它的"句柄"。PowerBuilder提供了获得应用中的指定窗口句柄的函数,这个函数叫作Handl e()。因为这些自定义用户事件是在窗口自身当中定义的,所以我们只需要将"this"作为参数传递给Handle函数。0做为第二个参数,告诉Handle函数我们需要知道水平卷滚条的值;而传递1则表示需要知道垂直卷滚条的值。

  通过将当前卷滚位置与最小位置相比较,我们就会知道用户是否滚动过窗口。如果滚动过窗口,我们就向窗口发送一个消息告诉它将窗口恢复原状。与WM_VSCROLL和WM_HSCROLL消息相对应的消息号分别是227和226。在WM_VSCROLL中,我们发送SB_TOP(6),它使窗口滚动 到顶部。在WM_HSCROLL中,我们发送5使窗口滚动到左边。

  当用户试图最小化或最大化窗口时,卷滚条的行为会有所不同。我们知道,PowerBuilder 的resize事件所映射的Windows事件WM_SIZE是在一个窗口被改变大小以后触发的。而当用户试图最小化一个窗口时,要在最小化发生之前关闭卷滚条。因此,在这种情况下resize事件中的代码是来不及起作用的。在这里,我们采取的方法是定义了一个映射到WM_CO MMAND消息的事件。当用户试图最小化窗口时,随该消息一起发送的值是61472。因此,如果该事件的值是61472,我们只需简单地移去卷滚条。问题是完成这些操作后,系统还将激发一个resize事件,resize事件中是引入实例变量ibminimized的地方。在syscommand事件中我们设定实例变量,在resize事件中,检查该变量。该变量告诉resize事件用户正在最小化窗口,于是resize事件就不会处理卷滚条。如果用户将窗口复原,syscommand事件将再次被激发,但这次传递给消息的值就不是61472了。因yscommand事件中仅仅将实例变量标识复位,于是resize事件就又能处理卷滚条了。本文的讨论范围。


[办公软件]在sybase中插入图片、PDF、文本文件  [办公软件]安装Sybase ASE
[办公软件]linux指令大全(完整篇)  [办公软件]Linux新手入门常用命令大全
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[办公软件]Linux程序员必读:中文化与GB18030标准  [办公软件]linux指令大全
[办公软件]制作Linux启动盘的四种方法  [办公软件]Linux文件系统的反删除方法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台