1、建立图形形状的窗口
1、首先要申请画板变量CDC memDC 用于绘制导入图形;
2、申请CBitmap变量 m_bmpDraw 用于导入图形 pOldMemBmp 用于保存原画板状态;
3、申请COLORREF变量 col,colMask;分别用于保存当前点颜色和比较颜色,以便以后设置为透明作准备。
4、申请CRect 变量cRect;用于保存窗口矩形。
5、申请CRgn变量wndRgn,rgnTemp;用于保存窗口区域,和临时窗口区域。
6、申请BITMAP变量用于保存图形的结构。
过程:
1、首先要保预先准备好的图形导入m_bmpDraw 并把图形结构倒入BITMAP变量;
2、把窗口矩形存入cRect;
3、新建矩形使其适合图形大小
4、建立和形参画板一致的画板 并用用图形变量初始化memDC;
5、提取画板需要做透明处理的颜色存入colMask;
6、建立和图形大小相一致的区域
7、对每一点与需要处理的点相比较,根据比较判断来生成该点所对应的区域,把该区域与已有区域异或。
并在最后删除临时点
8、恢复画板初始值。
9、重新设置区域。
10、通过响应WM_ERASEBKGND消息把原位图拷贝到指定的矩形中。
void Cl15031Dlg::setwin(CDC * cdc)
{
CDC memdc;
CBitmap *m_oldebitmap;
BITMAP bm;
memdc.CreateCompatibleDC(cdc);
m_bitmap.GetObject(sizeof(bm),&bm);
CRect m_rect;
GetWindowRect(&m_rect);
CRect rect=CRect(m_rect.TopLeft(),CSize(bm.bmWidth,bm.bmHeight));
CRgn m_rgn,m_temprgn;
m_rgn.CreateRectRgn(0,0,rect.Width(),rect.Height());
m_oldebitmap=memdc.SelectObject(&m_bitmap);
COLORREF c1,c2;
c1=memdc.GetPixel(0,0);
for(int x=0;x<rect.Width();x++)
for(int y=0;y<rect.Height();y++)
{
c2=memdc.GetPixel(x,y);
if(c1==c2)
{
m_temprgn.CreateRectRgn(x,y,x+1,y+1);
m_rgn.CombineRgn(&m_rgn,&m_temprgn,RGN_XOR);
m_temprgn.DeleteObject();
}
}
memdc.SelectObject(&m_oldebitmap);
SetWindowRgn((HRGN)m_rgn,true);
}
void Cl15031Dlg::OnNcLButtonDblClk(UINT nHitTest, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
OnOK();
CDialog::OnNcLButtonDblClk(nHitTest, point);
}
BOOL Cl15031Dlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CDC memdc;
CRect rect;
GetWindowRect(&rect);
CBitmap *bitmap=NULL;
CBitmap &mbitmap=m_bitmap;
memdc.CreateCompatibleDC(pDC);
bitmap=memdc.SelectObject(&mbitmap);
pDC->BitBlt(0,-20,rect.Width(),rect.Height(),&memdc,0,0,SRCCOPY);
memdc.SelectObject(bitmap);
return true;// CDialog::OnEraseBkgnd(pDC);
}