透明窗体的又一实现
2010-07-01 20:43:16 来源:WEB开发网我的MaskColor = 0xFF00,也就是 RGB(0,255,0).
建立一个基于对话框的工程,修改对话框资源的属性,主要修改两个地方。一是指定没有TitleBar,二是指定BorderStyle为None.这样才能保证出来的窗体符合你的要求
把图片加入资源,付ID = IDB_BACKGROUND
下面就开始写代码了,呵呵,看下面的代码这么长。是不是头有点大呀,别急,这些多半都是工程向导自动生成的,我加的都已经注解上了,并用黄色表示没有几行的。要不然我怎么敢向各位吹嘘这个实现方法简单呢。
a.首先我们给窗体添加两个成员变量:CBitmap * m_oldBitmap; //指向内存DC原来的 Bitmap
CDC m_DC; //用于存放背景图片的内存DC
b.在窗体的OnInitDialog()函数中做一番初始化: BOOL CTransWindowDlg::OnInitDialog()
就像注释的那样,我们首先把图片Load进来,然后把m_DC创建一个与窗口DC兼容的DC,并把刚才Load进来的图片绑定到该内存DC上,并用m_oldBitmap 记录下原有Bitmap,用户最后释放。
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
///////////////////////////////////////
//段会锋添加的代码
//实现背景图以及窗口透明
//调用背景图片
CBitmap bitmap;
BITMAP bitInfo;
bitmap.LoadBitmap(IDB_BACKGROUND);
//得到图片大小并调整窗口大小适应图片
bitmap.GetBitmap(&bitInfo);
CRect rect;
GetWindowRect(&rect);
rect.right = rect.left + bitInfo.bmWidth;
rect.bottom = rect.top + bitInfo.bmHeight;
MoveWindow(rect);
//创建并保存DC
m_DC.CreateCompatibleDC(GetDC());
m_oldBitmap = m_DC.SelectObject(&bitmap);
//设置窗口掩码颜色和模式
//首先获得掩码颜色
COLORREF maskColor = m_DC.GetPixel(0,0);
#define LWA_COLORKEY 0x00000001
#define WS_EX_LAYERED 0x00080000
typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)(HWND hWnd,
COLORREF crKey,
BYTE bAlpha,
DWORD dwFlags);
lpfnSetLayeredWindowAttributes SetLayeredWindowAttributes;
HMODULE hUser32 = GetModuleHandle("user32.dll");
SetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)GetProcAddress(hUser32,
"SetLayeredWindowAttributes");
SetWindowLong(GetSafeHwnd(),
GWL_EXSTYLE,
GetWindowLong(GetSafeHwnd(),
GWL_EXSTYLE) | WS_EX_LAYERED);
SetLayeredWindowAttributes(GetSafeHwnd(),
maskColor,
255,
LWA_COLORKEY);
FreeLibrary(hUser32);
////////////////////////////////////////
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
c.向OnPaint中添加代码,用于把背景图片绘制到窗口上: void CTransWindowDlg::OnPaint()
{
if (IsIconic())
{
//这里是MFC的框架代码,为了减少篇幅省略…
}
else
{
////////////////////////////////////
//段会锋修改的代码,用于绘制背景图片
//CDialog::OnPaint();
CDC * pDC = this->GetDC();
CRect rect;
GetWindowRect(&rect);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_DC,0,0,SRCCOPY);
////////////////////////////////////
}
}
更多精彩
赞助商链接