void CLoginDialog::OnPaint()
{
CPaintDC dc(GetDlgItem(IDC_STATIC_RECT));
// TODO: Add your message handler code here and/or call default
CRect rect;
m_staRect.GetClientRect(&rect); // 得到static客户区矩形
// BITMAP bm;
// m_bmpLogon.GetBitmap(&bm);
CDC dcSrc;
dcSrc.CreateCompatibleDC(&dc); // 创建一个与目标DC相兼容的设备环境。
CBitmap *pOldSrcBmp = dcSrc.SelectObject(&m_bmpLogon);
CDC dcDes;
dcDes.CreateCompatibleDC(&dc); // 创建临时的目标DC设备环境。
CBitmap maskBitmap;
maskBitmap.CreateBitmap(rect.Width(), rect.Height(), 1, 1, NULL); // 创建一个单色掩码位图
CDC maskDc; // 创建设备环境maskDc
maskDc.CreateCompatibleDC(&dc); // 创建与当前掩码设备相兼容的设备环境。
CBitmap * pOldMaskBmp = maskDc.SelectObject( &maskBitmap );
dcDes.BitBlt( 0, 0, rect.Width(), rect.Height(), &dcSrc, 0, 0, SRCCOPY ); // 将位图临时拷贝到内存dc中。
dcDes.SetBkColor(RGB(0x00,0x00,0xff)); // 设置位图透明色。
// 生成透明区域为白色,其它区域为黑色的掩码位图.
maskDc.BitBlt(0, 0, rect.Width(),rect.Height(), &dcDes, 0, 0, SRCCOPY);
// 生成透明区域为黑色,其它区域保持不变的位图.
dcDes.SetBkColor(RGB(0, 0, 0));
dcDes.BitBlt(0, 0, rect.Width(), rect.Height(), &maskDc, 0, 0, SRCAND);
// 透明部分保持屏幕不变,其它部分变成黑色.
dc.SetBkColor(RGB(0xff,0xff,0xff));
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &maskDc, 0, 0, SRCAND);
// "或"运算,生成最终效果.
dc.BitBlt(0, 0, rect.Width(), rect.Height(), &dcDes, 0, 0, SRCPAINT);
dcSrc.SelectObject(pOldSrcBmp);
dcSrc.DeleteDC();
dcDes.DeleteDC();
maskDc.SelectObject(pOldMaskBmp);
maskDc.DeleteDC();
}