回 帖 发 新 帖 刷新版面

主题:以前有人问过vfp做异形窗口的问题,现在小妹来答

在VFP中制做异型窗口
制做异型窗口听起来好象只是在VB、VC程序设计中才能够做到的。但是,在VFP中,只要你灵活运用API函数,这并不是一件很难实现的事情。通过本文的介绍,你一定能够发现VFP程序的强项不仅仅是数据处理,在程序界面设计方面也可以和其他的编程语言相媲美。 

  一、实现原理 

  在VB、VC程序的设计中,如果想要改变窗口的形状,通常会通过对SetWindowRgn的调用来达到目的。SetWindowRgn函数能够将窗口设定成任意形状。该函数的调用格式如下: 

  int SetWindowRgn( HWND hWnd, HRGN hRgn, BOOL bRedraw ) 

  其中各参数的含意为: 

  hWnd:欲改变窗口的句柄 

  hRgn:窗口的显示区域 

  bRedraw:指明窗口在被改变显示区域之后是否需要重绘,通常情况下该值为真。 

  通过上面对SetWindowRgn函数的介绍,我们可以看出,在VFP中要想改变窗口的形状,需要知道VFP窗口的句柄。在VFP中要想直接得到有关窗口的情况是很困难的,因此必须利用API例程库。VFP自带的API例程库“Foxtools.fll”提供了对窗口操作的相关函数。本文中能够用到的例程有_WOnTop()和_WhToHwnd()两种,其中_WOnTop()是用来获得顶层窗口的句柄,_WhToHwnd()返回指定窗口的句柄。这两个API例程的调用格式很简单,这里就不再详细介绍了。 

  二、实现过程 

  有了上面的认识之后,我们便可以试着去设计异型窗口的程序了。设计步骤如下: 

  1.新建一表单Mult_shape,按表1设置表单的属性。 


表1

属性名



设置值



备  注



AutoCenter



.T.



自动居中



BackColor



0,0,160



蓝色背景



BorderStyle



No Border



窗口无边框



ControlBox



.F.



去掉表单的最大化、最小化、恢复按钮



Caption



圆形窗口



 



FillColor



128,255,0



 



ShowWindow



2-as Top-Level Form



将表单作为顶层表单,否则表单不能独立于VFP而存在



TitleBar



0-Off



取消标题栏



  在表1中,对表单界面所做的设定,目的是为了让表单在运行之后更像一圆形窗口,因此,我们需要去掉标题栏、窗口大小控制按钮等常规窗口上的内容。 

  2.在表单上加入一标签控件(Label1)和按钮控件(Command1),分别设定其标题为“VFP圆形窗口示例”和“退出”。 

  3.设定表单和控件的事件代码,其中表单的Load事件代码为: 

  *注册API函数 

  declare integer SetWindowRgn in win32api integer,integer,integer 

  declare integer CreateRoundRectRgn in win32api integer,integer,integer,integer,integer,integer 

  *注册VFP的API例程库 

  SET LIBRARY TO "C:\Program Files\Microsoft Visual Studio\Vfp98\Foxtools.fll" 

  *设定表单的大小 

  thisform.top=0 

  thisform.left=0 

  thisform.height=200 

  thisform.width=200 

  表单的Activate事件代码为: 

  thisform.Label1.top=thisform.top+thisform.height/2-thisform.label1.height 

  thisform.Label1.left=thisform.left+(thisform.width-thisform.label1.width)/2 

  thisform.command1.top=thisform.height-3*thisform.command1.height 

  thisform.command1.left=thisform.left+(thisform.width-thisform.command1.width)/2 

  *上述代码主要是用来在圆形窗口中准确定位各控件的位置 

  topwindow=_WOnTop( ) 

  *获得顶层窗口 

  hwnd=_WhToHwnd(topwindow) 

  *获得顶层窗口的句柄 

  CRN1=CreateRoundRectRgn(0,0,200,200,200,200) 

  *建立一圆形窗口,如果要做其他形状的窗口,只需调用不同的建立区域的函数 

  SetWindowRgn(hWnd,CRN1,.T.) 

  Command1控件的Click事件代码为: 

  thisform.release 

  4.运行该表单,结果如图1所示。 

  图1 

  另外,如果你还想设计出其他形状的窗口,只需要将Form1中的Activate事件代码中的CreateRoundRectRgn(0,0,200,200,200,200)做相应的修改。比如你想要建立一苹果形窗口,将该语句改为: CreateRoundRectRgn(0,0,200,200,90,1800)即可。 

  通过本文所介绍的程序,以前看起来很困难的事情转眼间就做到了。试试看吧,你能够做出更加丰富多彩的异型窗口!

回复列表 (共8个回复)

沙发

收集

板凳

收藏啦!多谢.我还真没有试验过苹果形状的窗口.这次要看看效果怎么样拉!呵呵

3 楼

顶一下!

4 楼

各位,看得出来,你们对vfp也到达了一定境界,我还只是一个新手,有很多不懂的,望你们多看看我的贴,多多帮忙,支持

5 楼

我要好好学习,学习啊!
好经典的贴啊

6 楼


试试效果先!

7 楼

先试一下

8 楼

试过了,不错,只是里面的函数有些不太懂,希望楼主能展开来说,比如想要其它的形状需要调用哪些函数,函数中的参数是什么意义,怎样知道foxtools.fll里都有哪些API函数可以使用?等等问题,希望楼主或者其他高手给解释一下.
请教了!

我来回复

您尚未登录,请登录后再回复。点此登录或注册