第1种
半透明窗口
//----------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
long lRt=GetWindowLong(Handle,GWL_EXSTYLE);
lRt=lRt|WS_EX_LAYERED;
SetWindowLong(Handle,GWL_EXSTYLE,lRt);
SetLayeredWindowAttributes(Handle,clBlue,200,LWA_ALPHA);
}
//-----------------------------------------------------------------
字串8
第2种 字串9
早就想写一篇我这方面
心得, 一直特忙没有空, 不过这次点名找我, 就不
再缩头缩脑了. 字串9
其实我也还有很多问题没有解决, 在这里也向高手请教.
此篇在V-Galaxy BBS发表, 如要转贴请和作者联系info@ministars.com
1. Windows 2000
GDI 扩充集 字串4
Windows 2000内部扩充了原有
GDI指令集, 将直接提供高效
图像处理指令如Alpha Blending等. 在Win2000里有一个专门
窗口风格WS_EX_LAYERED提供透明窗口
可能. Win2000还提供如 AnimateWindow(...)一类
API, 直接支持窗口动画. 字串6
有关连接 字串9
http://www.microsoft.com/hwdev/video/GDInext.htm 字串9
http://x.wonder.ca/stevex/nthack/ 字串7
2. Win95/NT下
实现方法
字串2
既然Windows不提供现成
, 就只
自己做了. 原则上是这么过程:
字串4
a. 获取桌面
DC,生成一个兼容
Bitmap,送一个WM_PAINT消息,把桌面取到Bitmap里.(就像一个Screen Capture) 字串1
b. 把自己要开
窗口画到另一幅Bitmap
字串3
c. 用这两幅图片做Alpha Blending, 或者其他效果, 生成第三幅图. 字串2
d. 最后再把图片BitBlt出来
说起来并不难, 但技术上有几个问题.
1. 如何把hidden
窗口拷贝到图像里?
字串9
原则上说, 是做不到
. 但在自己程序里可以做一些手脚. 我在SafeClean Utilities2里用
Wizard窗口,就需要在显示之前获取图像, 再做处理. 我用
是WM_PRINT消息, 平时用
很少, 但可以把Z-Order低
窗口也拦截下来(hidden
还不行). 比如我要从第1页(p1)翻到第二页(p2), 我就得在显示新窗口之前, 把p1移到最上面, 再显示p2(被p1遮挡着), 向p2送WM_PRINT消息拦截图片, 再做动画, 关闭p1. 字串7
2. WM_PRINT
问题
字串8
WM_PRINT其实和WM_PAINT差不多, 但可以拦截被其他窗口遮住
部分. 但不是所有窗口都支持WM_PRINT, 比如Static control, 只能自己在Bitmap里把他们画上. 字串6
字串6
3. 如何把程序下面
窗口储存在Bitmap里? 字串5
要想实现真正
象Win2000
Transparent Window, 就必须得把自己程序下面
窗口存在图片里. 能否实现我也不清楚.
字串8
我用
技术其实只适合做Splash Window和象金山词霸那样静态
透明窗口.我用
代码列在下面, 因为涉及到一些其他类, 分布在不同地方, 所以并不完整. 仅供参考. 关于使用 Alpha Blending, 可以参看www.codeguru.com
Bitmap部分, 有很
代码. 这段时间实在很忙, 学校又要开始考试, 只是粗略介绍, 请大家谅解. 字串3
字串6int CFadeWindow::FadeAndSwitchWindow(CWnd* pWndFrom, CWnd* pWndTo) 字串7
{
CWnd* pDesktop = CWnd::GetDesktopWindow();
CWnd* pMain = AfxGetMainWnd();
CClientDC dc(pMain);
CRect rc;
pWndFrom->GetWindowRect(rc);
pMain->ScreenToClient(rc);
CDC *pDCFrom;
pDCFrom=pWndFrom->GetDC ();
m_dib1.PasteDC ( pDCFrom, 0, 0, rc.Width(), rc.Height());
m_dib3.PasteDC ( pDCFrom, 0, 0, rc.Width(), rc.Height());
pWndFrom->ReleaseDC ( pDCFrom );
CClientDC dcWndTo(pWndTo);
CDC dcTo;
dcTo.CreateCompatibleDC(&dcWndTo);
CBitmap bmpTo;
bmpTo.CreateCompatibleBitmap(&dcWndTo, rc.Width(), rc.Height());
CBitmap * pOldbmp = dcTo.SelectObject(&bmpTo);
SetWindowPos(pWndFrom->GetSafeHwnd(), HWND_TOP, 0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
pWndTo->ShowWindow(SW_SHOW); 字串1
pWndTo->SendMessage(WM_PRINT, (WPARAM) dcTo.GetSafeHdc(), (LPARAM)
PRF_CLIENT|PRF_CHILDREN|PRF_OWNED);
m_dib2.PasteDC ( &dcTo, 0, 0, rc.Width(), rc.Height());
dcTo.SelectObject(pOldbmp);
SetWindowPos(pWndTo->GetSafeHwnd(), HWND_TOP,0,0,0,0,
SWP_NOSIZE|SWP_NOMOVE|SWP_NOREDRAW|SWP_SHOWWINDOW);
SetWindowPos(pWndFrom->GetSafeHwnd(), NULL,0,0,0,0,
SWP_NOSIZE|SWP_NOMOVE|SWP_NOREDRAW|SWP_NOZORDER|SWP_HIDEWINDOW);
int index = 5;
for(int i=0;i< //晕。少了东西了。
{
m_dib3.Paste(&m_dib1);
m_dib3.Blend(&m_dib2, i*256/index);
m_draw.DrawDib ( &m_dib3, dc.GetSafeHdc(), rc.left, rc.top,
rc.Width(), rc.Height(), DDF_HALFTONE );
Sleep(10);
}
m_draw.DrawDib ( &m_dib2, dc.GetSafeHdc(), rc.left, rc.top,
rc.Width(), rc.Height(), DDF_HALFTONE );
return 1;
}
![我要研发网[www.51dev.com]](/templets/images/toplogo.gif)
