| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6860 人关注过本帖
标题:VFP中怎样实现表单背景图片在表单普通显示和最大化时都能够以全图显示
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
可以根据这个思路把背景封装为表单的属性的

授人以渔,不授人以鱼。
2013-02-04 14:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
下面是把背景封装成属性的代码:

程序代码:
Main()
RETURN 

PROCEDURE Main
    LOCAL loForm
    loForm = CREATEOBJECT("_Form")
    WITH loForm
        .Caption = "桌面背景测试程序"
        .Background = "Z:\test\VFP\China 06.JPG"
        *.BackgroundStretch = 2
        .Show
    ENDWITH
    READ EVENTS
ENDPROC 

DEFINE CLASS _Form AS Form
   
    * 自定义属性
    Background = ""             && 表单背景图片文件名,可带路径
    BackgroundStretch = 1       && 背景图的拉伸属性,传递给Image控件
   
    * 属性Background的关联事件,属性值发生变化即触发
    PROCEDURE Background_Assign(tcFileName)
        ThisForm.Background = IIF((VARTYPE(tcFileName) == "C") .AND. !EMPTY(tcFileName), tcFileName, "")
        IF !EMPTY(ThisForm.Background)
            * 检查背景图控件是否存在,若不存在方创建
            IF VARTYPE(ThisForm.imgBackground) != "O"
                ThisForm.AddObject("imgBackground", "Image")
            ENDIF
            WITH ThisForm.imgBackground
                .Picture = ThisForm.Background
                * 取图片的长宽比备用,在图片中创建自定义属性Scale保存这个比例数值
                .Stretch = 0
                .AddProperty("Scale", .Width / .Height)
                * 设置图片的拉伸与表单的自定义属性相同
                .Stretch = ThisForm.BackgroundStretch
                .Visible = .T.
            ENDWITH
        ELSE
            * 撤销背景图
            WITH ThisForm.imgBackground
                .Picture = ""
                .Visible = .F.
            ENDWITH
        ENDIF
    ENDPROC
   
    PROCEDURE BackgroundStretch_Assign(tnValue)
        WITH ThisForm
            .BackgroundStretch = IIF((VARTYPE(tnValue) == "N") .AND. BETWEEN(tnValue, 0, 2), tnValue, 1)
            .imgBackground.Stretch = .BackgroundStretch
        ENDWITH
    ENDPROC
   
    PROCEDURE Activate
        This.Resize
    ENDPROC
   
    PROCEDURE Resize
        IF VARTYPE(ThisForm.imgBackground) == "O"
            WITH ThisForm.imgBackground
                .Top = 0
                .Left = 0
                .Height = ThisForm.Height
                .Width = ThisForm.Width
            ENDWITH
        ENDIF
    ENDPROC
   
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC
   
ENDDEFINE


[ 本帖最后由 TonyDeng 于 2013-2-4 15:54 编辑 ]
收到的鲜花
  • tlliqi2013-02-06 11:37 送鲜花  20朵   附言:谢谢

授人以渔,不授人以鱼。
2013-02-04 15:43
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
貌似t版的vf比c还厉害

DO IT YOURSELF !
2013-02-04 15:44
陶然愚者
Rank: 1
等 级:新手上路
帖 子:151
专家分:8
注 册:2012-12-13
收藏
得分:0 
T版的方法的确很专业,可惜这种纯代码的方法要消化还需要时日。昨日在网上看到一种方法,貌似也可实现标题所述目的:
第一步:用图片编辑软件将作为背景的图片修改为与表单大小相同;

第二步:在表单中添加图片控件,设置其Picture属性为想作为背景的图片文件名(含文件后辍和文件存放路径),设置其Stretch属性为2(变比填充);

第三步:在表单的Activate事件和Resize事件中分别添加如下代码:
WITH thisform.Image1
    .top=0
    .left=0
    .height=thisform.height
    .width=thisform.width
ENDWITH

此方法貌似更加简单易懂。
2013-02-06 09:02
陶然愚者
Rank: 1
等 级:新手上路
帖 子:151
专家分:8
注 册:2012-12-13
收藏
得分:0 
回复 3楼 wzxc
这个表单没有实现标题所要求的目的哦
2013-02-06 09:20
陶然愚者
Rank: 1
等 级:新手上路
帖 子:151
专家分:8
注 册:2012-12-13
收藏
得分:0 
以下是引用sdta在2013-1-31 18:31:19的发言:

表单INIT事件
THISFORM.ADDOBJECT('IMAGE1','IMAGE')
WITH THISFORM.IMAGE1
     .WIDTH = THISFORM.WIDTH
     .HEIGHT = THISFORM.HEIGHT
     .VISIBLE = .T.
     .STRETCH = 2
     .PICTURE=SYS(5)+SYS(2003)+'\2.JPG'
ENDWITH
这段代码貌似应当放在表单的Activate事件和Resize事件中吧?不知对不?
2013-02-06 09:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
    PROCEDURE Activate
        This.Resize
    ENDPROC
  
    PROCEDURE Resize
        IF VARTYPE(ThisForm.imgBackground) == "O"
            WITH ThisForm.imgBackground
                .Top = 0
                .Left = 0
                .Height = ThisForm.Height
                .Width = ThisForm.Width
            ENDWITH
        ENDIF
    ENDPROC


你觉得我这部分的代码对应你表单设计中哪个部分?把表单的源代码提出来,就看得到它实际上写的是什么了。同样的代码,在两个事件中重复两次?

授人以渔,不授人以鱼。
2013-02-06 10:33
陶然愚者
Rank: 1
等 级:新手上路
帖 子:151
专家分:8
注 册:2012-12-13
收藏
得分:0 
就是因为看不懂源代码,听T版这样将部分代码抽取出来解说以后才好象有点明白了。
   PROCEDURE Activate
        This.Resize
    ENDPROC
    这段代码的意思就是在表单的“Activate”事件中添加“This.Resize”这行代码,也就是执行与表单的“Resise”事件相同的事件代码,不知对不对?
    之前那么多代码行,慢慢对照帮助文件进行翻译,仍然不知道如何下手,在表单设计器环境下应该如何操作,直到昨天在网上看到一位老师以文字形式解说之后觉得比较简单易懂。
    碰到这样的学生,作为老师,一定感觉很头疼吧

[ 本帖最后由 陶然愚者 于 2013-2-6 11:46 编辑 ]
2013-02-06 11:32
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
以下是引用陶然愚者在2013-2-6 09:02:32的发言:

T版的方法的确很专业,可惜这种纯代码的方法要消化还需要时日。昨日在网上看到一种方法,貌似也可实现标题所述目的:
第一步:用图片编辑软件将作为背景的图片修改为与表单大小相同;

第二步:在表单中添加图片控件,设置其Picture属性为想作为背景的图片文件名(含文件后辍和文件存放路径),设置其Stretch属性为2(变比填充);

第三步:在表单的Activate事件和Resize事件中分别添加如下代码:
WITH thisform.Image1
    .top=0
    .left=0
    .height=thisform.height
    .width=thisform.width
ENDWITH

此方法貌似更加简单易懂。
这个可行
2013-02-06 11:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是的。其实在表单中填写Resize代码,就是我这里PROCEDURE/ENDPROC中间的那些代码,每个事件/方法,都是这样的。表单书写和我那种代码书写的区别,只不过是后者把所有事件/方法/属性填写全部写在一起,而前者是用鼠标分别点击进入填写的(其弊端是无法一眼看到整个程序都干了些什么,要到处翻查寻找)。

比如下面的代码:
程序代码:
    * 自定义属性
    Background = ""             && 表单背景图片文件名,可带路径
    BackgroundStretch = 1       && 背景图的拉伸属性,传递给Image控件

其实就是平时填写表单属性的做法,你是一个一个找属性,而这是全部集中在一起赋值,一眼就知道程序专门修改了哪些默认属性。这里做自定义属性,也比鼠标操作的那种简单,这是很自然地写出属性名的,与原有属性/方法混为一体,不用专门操作要新建自定义属性或方法之类。

12楼的代码,把背景封装成属性,目的是要让这个背景可以随时被变换,使用时只要改变这个属性的值(图片文件名)就可以了,即动态桌面背景,而你所说的那个相对简单的方法,是没有这样方便地变换背景的,需要直接对表单内特定名称的Image控件操作(那也是我前一版本的做法),这在一定程度上违反了细节隐藏原则(为此而改成后来的代码)。

[ 本帖最后由 TonyDeng 于 2013-2-6 11:51 编辑 ]

授人以渔,不授人以鱼。
2013-02-06 11:47
快速回复:VFP中怎样实现表单背景图片在表单普通显示和最大化时都能够以全图显示
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029376 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved