如何把数据窗口控件改成半透明显示?解决后另加200分。

时间:2021-08-02 06:06:38
窗口背景为地图,当点击地图上的单位名称时,从数据库中检索出单位信息,但弹出的数据窗口不能将地图完全覆盖,因此需要通过外部函数的手段来把数据窗口控件改成半透明的,注意是半透明,不是全透,我以前试过用从画的方法来实现,但速度太慢,各位高手,有谁知道怎么把数据窗口控件改成半透明的(据专家说有办法实现),不胜感激,解决后另加100分。

55 个解决方案

#1


2000下比较容易,但9x下非常麻烦,你的系统是???

#2


2000 下的api :
FUNCTION ulong SetWindowulong(ulong hwnd,ulong nIndex,ulong dwNewLong) LIBRARY "user32.dll" ALIAS FOR "SetWindowLongA"
FUNCTION ulong SetLayeredWindowAttributes(ulong hwnd,ulong crKey,ulong bAlpha , ulong dwFlags) LIBRARY  "user32.dll" 

SetWindowulong(handle(ip),-20,786688)
SetLayeredWindowAttributes(handle(ip),0,icount,2)

#3


我的系统是98

#4


这两个函数我以前试过,但在98下不行,不知道你有没有例子,发一个给我,
email: wdqsl1@21cn.com

#5


你惨了,在98下的半透明非常复杂,而且窗口不能移动,建议改为2000,比较容易

#6


这两个函数在98下没有,2000才有的啊

#7


要是有,不就不用问了

#8


98下面到底怎么做啊,我不怕麻烦

#9


可以將dw的底色白色透明的例程﹐你要不要?

#10


当然要了
aqua_w@163.com

#11


当然要了
email: wdqsl1@21cn.com

#12


谢谢。
xiaoxianhe@163.com

#13


API:


FUNCTION ulong GetDC(ulong hwnd) LIBRARY "user32.dll"


FUNCTION ulong GetDesktopWindow() LIBRARY "user32.dll"


FUNCTION ulong ReleaseDC(ulong hwnd,ulong hdc) LIBRARY "user32.dll"


FUNCTION ulong BitBlt(ulong hDestDC,ulong x,ulong y,ulong nWidth,ulong nHeight,ulong hSrcDC,ulong xSrc,ulong ySrc,ulong dwRop) LIBRARY "gdi32.dll"


FUNCTION ulong CreateCompatibleDC(ulong hdc) LIBRARY "gdi32.dll"


FUNCTION ulong SelectObject(ulong hdc, ulong hObject) LIBRARY "GDI32.dll"


FUNCTION ulong CreateCompatibleBitmap(ulong hdc,ulong nWidth,ulong nHeight) LIBRARY "gdi32.dll"


FUNCTION ulong DeleteObject(ulong hObject) LIBRARY "gdi32.dll"


FUNCTION ulong DeleteDC(ulong hdc) LIBRARY "gdi32.dll"


在窗口中扩展出一事件,ID为PBM_MOVE:


接上:


long ll_hdc,ll_desktop_hdc,ll_compdesk_hdc,ll_left,ll_width,ll_top,ll_height,ll_bmp,ll_desktop_width,ll_desktop_height


environment lev_env


GetEnvironment(lev_env)


ll_desktop_width=lev_env.screenwidth


ll_desktop_height=lev_env.screenheight



this.hide()


long ll_SRCCOPY=13369376


long ll_SRCAND=8913094


ll_hdc=getdc(handle(this))//窗口DC



ll_desktop_hdc=getdc(GetDesktopWindow())//桌面DC



ll_compdesk_hdc=CreateCompatibleDC(ll_hdc)//创建一个内存DC



ll_width=UnitsToPixels(this.width, xUnitsToPixels!)


ll_left=UnitsToPixels(this.x, xUnitsToPixels!)


ll_top=UnitsToPixels(this.y, yUnitsToPixels!) 


ll_height=UnitsToPixels(this.height, yUnitsToPixels!)

 ll_width=UnitsToPixels(this.width, xUnitsToPixels!)


ll_left=UnitsToPixels(this.x, xUnitsToPixels!)


ll_top=UnitsToPixels(this.y, yUnitsToPixels!) 


ll_height=UnitsToPixels(this.height, yUnitsToPixels!) 



ll_bmp=CreateCompatibleBitmap(ll_hdc,ll_desktop_width,ll_desktop_height)//创建一幅与设备有关位图


selectobject(ll_compdesk_hdc,ll_bmp)


//将桌面画布拷贝到内存DC中


BitBlt( ll_compdesk_hdc, 0,0, ll_desktop_width, ll_desktop_height, ll_desktop_hdc,5,23, ll_SRCCOPY)


this.show()


//将内存DC中的画布拷贝到窗口


BitBlt( ll_hdc, 0,0, ll_width, ll_height, ll_compdesk_hdc,ll_left,ll_top, ll_SRCAND)


//释放


ReleaseDC(handle(this),ll_hdc)


DeleteDC(ll_desktop_hdc)


DeleteObject(ll_bmp) 


 
 这个方法只能显示


一下‘透明窗口’而已

#14


to:BILLXIA
是不是应该写在pbm_erasebkgnd事件里效果更好些?

#15


都无所谓阿

#16


哪里都可以,随便你了

#17


您的信件已经成功发送到 wdqsl1@21cn.com,xiaoxianhe@163.com,aqua_w@163.com

請查收﹐希望合你用﹐同時謝謝代碼共享的同志們。

#18


注意

#19


学习

#20


api函数的用法哪能得到

#21


还是没有解决啊,还需要帮助

#22


怎樣沒解決?我的例程不合你用嗎?

#23


transparent例程我以前看过,但我是要把数据窗口控件变成半透明的,是半透明,不是全透,在两千下的那两个函数的原理是什么?,我想只有把它移至98下,才是最好的方案,可以用vc把它改写一下,但这太高深了,我不会啊,十分感谢各位高手,继续!!!

#24


关注

#25


大家继续啊,这个问题烦了我一年了,谁能让我释怀?

#26


to:liuyxit(都随风!都随风!心随你动!) 
能否将您的dw的底色白色透明的例程发一份,谢谢!!!
lcy006088@sina.com

#27


up

#28


chinalht的API调用的不错,可以问问他

#29


好难啊?

#30


up

#31


精彩呀。

#32


何谓半透明?二千你实现了吗?

#33


二千下没问题, billxia给出的API可以达到目的,但因为程序存在发布到不同操作系统包括(9X)的问题,这样还是有点(应该是很)难办,我苦恼啊!

#34


ip和icount分别表示什么意思?

#35


up

#36


老兄能否将你那个ole的例子发给我一份我很急呀!谢啦

msm@mail.banner.com.cn
或者是ymsmy@sina.com

#37


up

#38


二千里是用api函数,9x下又没有这个函数。唉!不想打击你也要说声:
我想……应该……没有办法了!!!!!!!!!!!!!
给流老大他们那些发个短信,看能否帮到你啦!

再帮你up一次!

#39


to  wdqsl1(胡箩卜);

区分操作系统:

Environment lenv_current

if GetEnvironment(lenv_current) <> 1 then
Messagebox(gs_errortitle,"获取系统环境信息失败!")
return -1
end if

choose case lenv_current.ostype
case windows!
gs_systemtype='windows'
case windowsnt!
gs_systemtype='windowsnt'
case else
return -1
end choose

#40


十分感谢大家,学到不少的东西·
再次感谢!

#41


ip和icount分别表示什么意思?

ip是窗口句柄
icount 是窗口透明度 值在 0-255 之间

在2000下,windows中增加了对透明的支持,所以可以让一个窗口半透明,而9x下,window没有这样的功能,所以只有强行把一个窗口后面的背景和当前窗口的内容进行计算,把两个窗口放在一个窗口内显示,这就是为什么在9x下只能静态的‘显示’一下,在2000下,半透明窗口可以移动,实际上,2000下window 作的事情和9x下我们作的是一样的,但他的比较快,我们在9x下写的两个窗口融合的程序虽然也利用了api但,如果我们作的半透明的窗口如果移动的话,系统的反映会来不急,实际上在9x下我们作的半透明的窗口移动是不现实的

#42


我的意思是就算在二千下实现了这样的功能,但当把程序发布到9x下时怎么办,还不是没办法,再此特别感谢billxia和各位高手的帮助。谢谢大家

#43


只在2000下允许使用本功能,或者你的系统只能在2000下使用

#44


to billxia:
你说9x不支持半透明窗口移动,但我看到很多专业软件在9x下运行时,也有可移动的半透明窗口啊,也许我对这方面的知识知道的太少了,无法解释。

#45


我完全丧失信心了,我这个问题无解,哎呀我的天啊,破鞋漏脚尖啊!!!

#46


我的意思是,这个工作太专业了
不是我们可以作的,要有专业的图形处理能力,
我们的pb的专长应该是系统应用,数据库处理

#47


你要明白这个问题,首先要明白什么是半透明才行的

#48


就是因为这个问题,我丢了一笔生意啊,那个客户必须要半透明显示,我做不出来,丢了项目啊。(那个客户还振振有词,他看过有人做出来,如何如何,我气啊。)

#49


哈哈,同情中

#50


学习ing

#1


2000下比较容易,但9x下非常麻烦,你的系统是???

#2


2000 下的api :
FUNCTION ulong SetWindowulong(ulong hwnd,ulong nIndex,ulong dwNewLong) LIBRARY "user32.dll" ALIAS FOR "SetWindowLongA"
FUNCTION ulong SetLayeredWindowAttributes(ulong hwnd,ulong crKey,ulong bAlpha , ulong dwFlags) LIBRARY  "user32.dll" 

SetWindowulong(handle(ip),-20,786688)
SetLayeredWindowAttributes(handle(ip),0,icount,2)

#3


我的系统是98

#4


这两个函数我以前试过,但在98下不行,不知道你有没有例子,发一个给我,
email: wdqsl1@21cn.com

#5


你惨了,在98下的半透明非常复杂,而且窗口不能移动,建议改为2000,比较容易

#6


这两个函数在98下没有,2000才有的啊

#7


要是有,不就不用问了

#8


98下面到底怎么做啊,我不怕麻烦

#9


可以將dw的底色白色透明的例程﹐你要不要?

#10


当然要了
aqua_w@163.com

#11


当然要了
email: wdqsl1@21cn.com

#12


谢谢。
xiaoxianhe@163.com

#13


API:


FUNCTION ulong GetDC(ulong hwnd) LIBRARY "user32.dll"


FUNCTION ulong GetDesktopWindow() LIBRARY "user32.dll"


FUNCTION ulong ReleaseDC(ulong hwnd,ulong hdc) LIBRARY "user32.dll"


FUNCTION ulong BitBlt(ulong hDestDC,ulong x,ulong y,ulong nWidth,ulong nHeight,ulong hSrcDC,ulong xSrc,ulong ySrc,ulong dwRop) LIBRARY "gdi32.dll"


FUNCTION ulong CreateCompatibleDC(ulong hdc) LIBRARY "gdi32.dll"


FUNCTION ulong SelectObject(ulong hdc, ulong hObject) LIBRARY "GDI32.dll"


FUNCTION ulong CreateCompatibleBitmap(ulong hdc,ulong nWidth,ulong nHeight) LIBRARY "gdi32.dll"


FUNCTION ulong DeleteObject(ulong hObject) LIBRARY "gdi32.dll"


FUNCTION ulong DeleteDC(ulong hdc) LIBRARY "gdi32.dll"


在窗口中扩展出一事件,ID为PBM_MOVE:


接上:


long ll_hdc,ll_desktop_hdc,ll_compdesk_hdc,ll_left,ll_width,ll_top,ll_height,ll_bmp,ll_desktop_width,ll_desktop_height


environment lev_env


GetEnvironment(lev_env)


ll_desktop_width=lev_env.screenwidth


ll_desktop_height=lev_env.screenheight



this.hide()


long ll_SRCCOPY=13369376


long ll_SRCAND=8913094


ll_hdc=getdc(handle(this))//窗口DC



ll_desktop_hdc=getdc(GetDesktopWindow())//桌面DC



ll_compdesk_hdc=CreateCompatibleDC(ll_hdc)//创建一个内存DC



ll_width=UnitsToPixels(this.width, xUnitsToPixels!)


ll_left=UnitsToPixels(this.x, xUnitsToPixels!)


ll_top=UnitsToPixels(this.y, yUnitsToPixels!) 


ll_height=UnitsToPixels(this.height, yUnitsToPixels!)

 ll_width=UnitsToPixels(this.width, xUnitsToPixels!)


ll_left=UnitsToPixels(this.x, xUnitsToPixels!)


ll_top=UnitsToPixels(this.y, yUnitsToPixels!) 


ll_height=UnitsToPixels(this.height, yUnitsToPixels!) 



ll_bmp=CreateCompatibleBitmap(ll_hdc,ll_desktop_width,ll_desktop_height)//创建一幅与设备有关位图


selectobject(ll_compdesk_hdc,ll_bmp)


//将桌面画布拷贝到内存DC中


BitBlt( ll_compdesk_hdc, 0,0, ll_desktop_width, ll_desktop_height, ll_desktop_hdc,5,23, ll_SRCCOPY)


this.show()


//将内存DC中的画布拷贝到窗口


BitBlt( ll_hdc, 0,0, ll_width, ll_height, ll_compdesk_hdc,ll_left,ll_top, ll_SRCAND)


//释放


ReleaseDC(handle(this),ll_hdc)


DeleteDC(ll_desktop_hdc)


DeleteObject(ll_bmp) 


 
 这个方法只能显示


一下‘透明窗口’而已

#14


to:BILLXIA
是不是应该写在pbm_erasebkgnd事件里效果更好些?

#15


都无所谓阿

#16


哪里都可以,随便你了

#17


您的信件已经成功发送到 wdqsl1@21cn.com,xiaoxianhe@163.com,aqua_w@163.com

請查收﹐希望合你用﹐同時謝謝代碼共享的同志們。

#18


注意

#19


学习

#20


api函数的用法哪能得到

#21


还是没有解决啊,还需要帮助

#22


怎樣沒解決?我的例程不合你用嗎?

#23


transparent例程我以前看过,但我是要把数据窗口控件变成半透明的,是半透明,不是全透,在两千下的那两个函数的原理是什么?,我想只有把它移至98下,才是最好的方案,可以用vc把它改写一下,但这太高深了,我不会啊,十分感谢各位高手,继续!!!

#24


关注

#25


大家继续啊,这个问题烦了我一年了,谁能让我释怀?

#26


to:liuyxit(都随风!都随风!心随你动!) 
能否将您的dw的底色白色透明的例程发一份,谢谢!!!
lcy006088@sina.com

#27


up

#28


chinalht的API调用的不错,可以问问他

#29


好难啊?

#30


up

#31


精彩呀。

#32


何谓半透明?二千你实现了吗?

#33


二千下没问题, billxia给出的API可以达到目的,但因为程序存在发布到不同操作系统包括(9X)的问题,这样还是有点(应该是很)难办,我苦恼啊!

#34


ip和icount分别表示什么意思?

#35


up

#36


老兄能否将你那个ole的例子发给我一份我很急呀!谢啦

msm@mail.banner.com.cn
或者是ymsmy@sina.com

#37


up

#38


二千里是用api函数,9x下又没有这个函数。唉!不想打击你也要说声:
我想……应该……没有办法了!!!!!!!!!!!!!
给流老大他们那些发个短信,看能否帮到你啦!

再帮你up一次!

#39


to  wdqsl1(胡箩卜);

区分操作系统:

Environment lenv_current

if GetEnvironment(lenv_current) <> 1 then
Messagebox(gs_errortitle,"获取系统环境信息失败!")
return -1
end if

choose case lenv_current.ostype
case windows!
gs_systemtype='windows'
case windowsnt!
gs_systemtype='windowsnt'
case else
return -1
end choose

#40


十分感谢大家,学到不少的东西·
再次感谢!

#41


ip和icount分别表示什么意思?

ip是窗口句柄
icount 是窗口透明度 值在 0-255 之间

在2000下,windows中增加了对透明的支持,所以可以让一个窗口半透明,而9x下,window没有这样的功能,所以只有强行把一个窗口后面的背景和当前窗口的内容进行计算,把两个窗口放在一个窗口内显示,这就是为什么在9x下只能静态的‘显示’一下,在2000下,半透明窗口可以移动,实际上,2000下window 作的事情和9x下我们作的是一样的,但他的比较快,我们在9x下写的两个窗口融合的程序虽然也利用了api但,如果我们作的半透明的窗口如果移动的话,系统的反映会来不急,实际上在9x下我们作的半透明的窗口移动是不现实的

#42


我的意思是就算在二千下实现了这样的功能,但当把程序发布到9x下时怎么办,还不是没办法,再此特别感谢billxia和各位高手的帮助。谢谢大家

#43


只在2000下允许使用本功能,或者你的系统只能在2000下使用

#44


to billxia:
你说9x不支持半透明窗口移动,但我看到很多专业软件在9x下运行时,也有可移动的半透明窗口啊,也许我对这方面的知识知道的太少了,无法解释。

#45


我完全丧失信心了,我这个问题无解,哎呀我的天啊,破鞋漏脚尖啊!!!

#46


我的意思是,这个工作太专业了
不是我们可以作的,要有专业的图形处理能力,
我们的pb的专长应该是系统应用,数据库处理

#47


你要明白这个问题,首先要明白什么是半透明才行的

#48


就是因为这个问题,我丢了一笔生意啊,那个客户必须要半透明显示,我做不出来,丢了项目啊。(那个客户还振振有词,他看过有人做出来,如何如何,我气啊。)

#49


哈哈,同情中

#50


学习ing