1、建立图形形状的窗口

类别:VC语言 点击:0 评论:0 推荐:

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

本文地址:http://com.8s8s.com/it/it305.htm