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); }

|