98下半透明的代码,望大家改进

szjlq 2001-06-05 08:33:00
今天趁BOSS不在,偷闲写了一下,还不是很完善,主要是对图像处理部分只是简单进行了SRCAND,希望大家继续改进
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:
...全文
125 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
无果和尚 2001-06-25
  • 打赏
  • 举报
回复
你得到的是固定的桌面图象,如果你的窗口后面的图象发生了改变,你岂不是又要HIDE一下,再COPY桌面?
szjlq 2001-06-25
  • 打赏
  • 举报
回复
我暂时没有实现,我也没有注意2000下是不是可以做到。
不过金山词霸的半透明确实就存在这种毛病,如果你做到,麻烦你通知我一声。
szjlq 2001-06-23
  • 打赏
  • 举报
回复
所以我的代码写在移动的事件中,由于PB的窗口刷新是自动的,因此我首先将本窗口HIDE,
COPY到桌面后再SHOW()再将内存DC中的画布COPY到窗口上,
至于半透明只是对图象的一种处理方法而矣,在系统中不管是98还是2000都无法做到,因为
桌面画布永远只会有一层,所以各种可视控件才有PAIT事件。
无果和尚 2001-06-23
  • 打赏
  • 举报
回复
getdesktopwindow得到的是桌面,只有在程序窗口画到桌面之前拷贝背景才行,否则拷贝
的背景里还有自己程序的影子。如果你移动窗口怎么办?所以我感觉你这个方法只能显示
一下‘透明窗口’而已。谁有好的办法来解决?
nthb2001 2001-06-05
  • 打赏
  • 举报
回复
szjlq(如果问题继续存在,请与供应商联系) :
谢谢你啊

2000下我已经实现了啊
我再试试98的成不成。。。
szjlq 2001-06-05
  • 打赏
  • 举报
回复
当然能,不过2000下就没有必要这样做,上次我发过一个贴子就是针对2000下半透明的,两个API就搞定啦
am2000 2001-06-05
  • 打赏
  • 举报
回复
2000下能不能用啊,老大...
caolei1974 2001-06-05
  • 打赏
  • 举报
回复
真诚的谢谢你
szjlq 2001-06-05
  • 打赏
  • 举报
回复
实际上本程序只是将窗口后的背景拷贝到窗口中并进行了SCRAND运算,有兴趣的朋友可以再将图像进行Alpha Blend以达到真正的半透明效果
szjlq 2001-06-05
  • 打赏
  • 举报
回复
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)
szjlq 2001-06-05
  • 打赏
  • 举报
回复
接上:
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!)

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧