请教不规则透明窗口,高手请进!

karlzheng 2007-01-23 05:49:49
我在一个基于对话框的工程中,想加载一张图片,显示为不规则透明窗口,代码如下(参考别人的,参考的例子是基于CWnd类的)--为什么参考例子可以工作而我的不行?--基于对话框的工程还要添加额外的代码吗?
请高手帮忙指点:)

void CTransparentDlg::OnOK()
{
// TODO: Add extra validation here

//CDialog::OnOK();
//////////////////////////////////////////////////////////////////////////////////////////////////
// Load bitmap
CBitmap cbmp1;
cbmp1.LoadBitmap(IDB_BITMAP1);
BITMAP bm;
cbmp1.GetBitmap(&bm);
CDC* pdc = GetDC();
CDC dcMem;
dcMem.CreateCompatibleDC(pdc);
dcMem.SelectObject(cbmp1);
pdc->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY);
COLORREF clrMask(RGB(20,20,20));
clrMask = ::GetPixel(dcMem.m_hDC,0,0);
HRGN rgnTemp;
int iX;
int nWidth = bm.bmWidth;
int nHeight = bm.bmHeight;
int iLeft;
HRGN hrgnWnd;
hrgnWnd = ::CreateRectRgn(0, 0, 0, 0);
/////////////////////////////////////////////////////////////////////////////////////////
CRect rctWnd;
GetWindowRect(&rctWnd);
CPoint ptOrg = rctWnd.TopLeft();
CRect rcNewWnd=CRect(ptOrg,CSize(bm.bmWidth,bm.bmHeight));
for(int y=0; y<nHeight; y++)
{
iX = 0;
do
{
COLORREF clrTemp = ::GetPixel(dcMem.m_hDC,iX,y);
while(iX<nWidth && clrTemp == clrMask)
{
clrTemp = ::GetPixel(dcMem.m_hDC,iX,y);
iX++;
}
// while(iX<nWidth && ::GetPixel(dcMem.m_hDC,iX,y)==clrMask)
// {
// iX++;
// }
iLeft = iX;
while(iX<nWidth && ::GetPixel(dcMem.m_hDC,iX,y)!=clrMask)
{
iX++;
}
rgnTemp = ::CreateRectRgn(iLeft, iX, y, y+1);
CombineRgn(hrgnWnd,hrgnWnd,rgnTemp,RGN_OR);
DeleteObject(rgnTemp);
} while(iX<nWidth);
}
BOOL bResult = SetWindowRgn(hrgnWnd, true);
MoveWindow(rcNewWnd);


}
...全文
228 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
tengfei2005 2007-01-24
  • 打赏
  • 举报
回复
IDB_BITMAP1 注意下
tengfei2005 2007-01-24
  • 打赏
  • 举报
回复
第一步 定义功能

typedef BOOL (FAR PASCAL * FUNC1)(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);第二步 实现代码

在OnInitDialog中加入下列代码(如果在SDI里面,应该是在OnCreat里面添加)

.....
HMODULE hModule = GetModuleHandle("user32.dll");
FUNC1 SetLayeredWindowAttributes;
SetLayeredWindowAttributes = (FUNC1) GetProcAddress (hModule, _T( "SetLayeredWindowAttributes" ) );

// 设置分层扩展标记
SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE) | 0x80000L);
// 70% alpha
SetLayeredWindowAttributes(GetSafeHwnd(), 0, (255 * 70) / 100, 0x2);
工作完成,怎么样,现在你可以运行你的程序来查看效果,即使背景变化也能立刻反映到你的窗口当中,这一点比金山词霸的效果要好。

第三步:去除透明

void CTransparentDlg::OnOK()
{
SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE) & ~ 0x80000L);
// 重画窗口
RedrawWindow();
}

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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