标题:我编写的定时柜(含桌面日历),给各位老师交作业.
只看楼主
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 10 楼 kongxc
SetLayeredWindowAttributes(thisform.HWnd,thisform.BackColor, n透明度, 3)
2014-07-03 20:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
SetLayeredWindowAttributes(thisform.HWnd,thisform.BackColor, 0, 1)      && 透明背景颜色值有效,透明度无效。
SetLayeredWindowAttributes(thisform.HWnd,0, n透明度, 2)                  && 透明背景颜色值无效,透明度有效。
SetLayeredWindowAttributes(thisform.HWnd,thisform.BackColor, n透明度, 3) && 透明背景颜色值有效,透明度有效。
2014-07-03 20:13
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
利用SetLayeredWindowAttributes()设置透明背景,还可以设计异形窗体,如在表单上画椭圆或贴上一定形状的背影图片。
2014-07-04 07:57
kongxc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:60
专家分:104
注 册:2007-9-30
得分:0 
非常感谢吹水佬老师的指教.不知道Flag参数有3, 我在网上搜过,网上介绍只有1和2两个参数,没有找到更详细的资料..
我用SetLayeredWindowAttributes(thisform.HWnd,thisform.BackColor, n透明度, 3)测试后,发现与2不完全相同,上面的其他控件文字被透明化的强度有所减弱,在n透明度=128时还可以看清文字,基本可以达到需要.
但最理想的需要是: 背景颜色透明度可调整,整体透明度无效(就是不透明化文字).
我测试了大于3的参数,都与2的效果一样..那只能这样了,再一次多谢吹老师的热心指导.

[ 本帖最后由 kongxc 于 2014-7-4 09:00 编辑 ]
2014-07-04 08:43
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 14 楼 kongxc
SetLayeredWindowAttributes()背景无透明度,自画透明背景有点麻烦。
或者用怪招:加一个下层空窗口,用 2 调透明度。上层用 1。
2014-07-04 09:50
kongxc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:60
专家分:104
注 册:2007-9-30
得分:0 
吹老师14楼说的方法确实是一个办法,顶层表单调透明度,在顶层表单中的子表单(实为主表单)只透明背景,这样就满足背景透明度可调的要求..确实是个怪招,哈哈,也是个高明的设想..再一次表示感谢.

但测试发现,第二个子表单在实行透明化时不起作用,不知道怎么回事? 难道二个表单都要是顶层表单,此透明只对顶层表单有效,可能是这个道理.不知道我理解是否正确.

[ 本帖最后由 kongxc 于 2014-7-4 12:04 编辑 ]
2014-07-04 11:44
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 16 楼 kongxc
是的,8楼liuxingang28老师已提醒过。
2014-07-04 14:08
kongxc
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:60
专家分:104
注 册:2007-9-30
得分:0 
经测试,使用双顶层表单方式,一般情况还是可行的。但是,把此双表单窗体嵌入桌面后,主表单上所有的控件事件均失效,无法进行操作。这二个顶层表单是重叠的,分别嵌入桌面,不管哪个先嵌入,结果都一样。因此,该双顶层表单的怪招,对于嵌入桌面的窗体来说看来是行不通的。我只有再做其他方面的测试,基本放弃改变背景透明度的方案。
再次谢谢各位老师的指教。
2014-07-06 16:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
理论上就没解决的问题,急于实现,注定要碰钉子。

授人以渔,不授人以鱼。
2014-07-06 21:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 18 楼 kongxc
透明窗口嵌入桌面的实例见过不少。
用VFP写代码,试了怪招应该还是可行:

* 将透明窗口嵌入桌面
_SCREEN.Visible = .F.
SET TALK OFF
CLEAR

DECLARE LONG GetDesktopWindow IN User32
DECLARE LONG FindWindowEx IN User32 LONG, LONG, STRING@, STRING@
DECLARE LONG SetParent IN User32 LONG, LONG

DECLARE LONG SetWindowLong IN user32 LONG, LONG, LONG
DECLARE LONG GetWindowLong IN user32 LONG, LONG
DECLARE LONG SetLayeredWindowAttributes IN user32 LONG, LONG, LONG, LONG
DECLARE LONG SetFocus IN user32 LONG

PUBLIC oForm1, oForm2
oForm1 = NEWOBJECT("Form1")
oForm2 = NEWOBJECT("Form2")
oForm1.Show
oForm2.Show

READ EVENTS
CLEAR DLLS
_SCREEN.Visible = .T.
RETURN

DEFINE CLASS Form1 As Form
    Height = 300
    Width  = 400
    ShowWindow = 2
    WindowType = 1
    AutoCenter = .T.
    BorderStyle = 0
    TitleBar = 0
    hParent = 0

    PROCEDURE Load
        *SetWindowLong(this.hWnd, -20, 0x80000)
        SetWindowLong(this.hWnd, -20, BITOR(GetWindowLong(this.hWnd, -20), 0x80000))
    ENDPROC
        
    PROCEDURE Init
        hDesktop = FindWindowEx(GetDesktopWindow(), 0, "Progman", NULL)
        hDesktop = FindWindowEx(hDesktop, 0, "SHELLDLL_DefView", NULL)
        hDesktop = FindWindowEx(hDesktop, 0, "SysListView32", NULL)
        this.hParent = SetParent(this.hWnd, hDesktop)
    ENDPROC

    PROCEDURE Activate  
        IF EMPTY(this.Tag)
            this.Tag = "1"
            LOCAL n透明度
            n透明度 = 125    && 0--255
            SetLayeredWindowAttributes(thisform.HWnd, 0, n透明度, 2)                  && 透明背景颜色值无效,透明度有效。
        ELSE
            SetFocus(oForm2.hWnd)
        ENDIF
    ENDPROC

    PROCEDURE Destroy
        SetParent(this.hWnd, this.hParent)
        CLEAR EVENTS
    ENDPROC
ENDDEFINE

DEFINE CLASS Form2 As Form
    Height = 300
    Width  = 400
    ShowWindow = 2
    WindowType = 1
    AutoCenter = .T.
    BorderStyle = 0
    TitleBar = 0
    hParent = 0

    Add Object Command1 As CommandButton WITH Top=100, Left=100, Width=80, Height=30, Caption="关闭"

    PROCEDURE Load
        *SetWindowLong(this.hWnd, -20, 0x80000)
        SetWindowLong(this.hWnd, -20, BITOR(GetWindowLong(this.hWnd, -20), 0x80000))
    ENDPROC

    PROCEDURE Init
        hDesktop = FindWindowEx(GetDesktopWindow(), 0, "Progman", NULL)
        hDesktop = FindWindowEx(hDesktop, 0, "SHELLDLL_DefView", NULL)
        hDesktop = FindWindowEx(hDesktop, 0, "SysListView32", NULL)
        this.hParent = SetParent(this.hWnd, hDesktop)
    ENDPROC
        
    PROCEDURE Activate   
        IF EMPTY(this.Tag)
            this.Tag = "1"
            SetLayeredWindowAttributes(this.HWnd, this.BackColor, 0, 1)
        ENDIF
    ENDPROC

    PROCEDURE Moved
        oForm1.Top = this.Top
        oForm1.Left = this.Left
    ENDPROC

    PROCEDURE Destroy
        SetParent(this.hWnd, this.hParent)
        oForm1.Release
    ENDPROC

    PROCEDURE Command1.Click
        thisform.Release
    ENDPROC
ENDDEFINE
2014-07-06 21:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-433575-1-1.html




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

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