hClipRgn = CreateRgnFromBitmap(m_bMask,RGB(255,255,255));
if (hClipRgn){
SetWindowRgn(hClipRgn, TRUE);
CDC *pDC = GetDC();
if (pDC){
SelectClipRgn(pDC->GetSafeHdc(), hClipRgn);//根据mask图,把窗口创建不剪裁区域之后
ReleaseDC(pDC);
}
}
if (m_DrawMode==0){
SetWindowPos(NULL,0,0,GetBitmapWidth(m_bMask),//把窗口的大小调整为和位图对象大小一样,
位图对象是长方形的图片吗 现在不是修改成不规则的窗体,怎么还能对应的上呢????
GetBitmapHeight(m_bMask),SWP_NOZORDER|SWP_NOMOVE);
}

解决方案 »

  1.   

    微调整Rgn的裁剪区域,同时还可以调整底图,最后完全对应上,裁剪时还得注意尽量不要让锯齿太严重,另外可以用PNG图来实现,我写了个例子,希望能帮上你http://bbs.csdn.net/topics/390333291
      

  2.   

    是这样的 我说的窗口是按钮的剪裁//下载你的例子,代码太多。还没仔细看完。
    //我现在用bmp图片黑白图的方法剪裁按钮,然后把png图片的前景图拷贝到剪裁区域里。
    用Image把png图片的前景拷贝到窗口的某处怎么办呢?//后景RGB(255,255,255)+a 12
      

  3.   

    hdcMem.BitBlt(r.left,r.top,cx,cy,&dcBmp,0,0,SRCINVERT);
    hdcMem.BitBlt(r.left,r.top,cx,cy,&dcMask,0,0,SRCAND);
    hdcMem.BitBlt(r.left,r.top,cx,cy,&dcBmp,0,0,SRCINVERT);
    //bmp的方法!
      

  4.   

    代码的话参照
    void __fastcall TForm1::FormCreate(TObject *Sender){register int x,y;int l,r;POINT *a;bool lb,rb;HRGN WndRgn,TempRgn,tepRgn;
    Width=800;Height=600;if((a=(POINT *)malloc(800*4*(sizeof(POINT))))==NULL){ShowMessage("申请内存失败!");exit(0);}Image1->Picture->LoadFromFile(".\\face.bmp");Width=Image1->Width;Height=Image1->Height;Repaint();l=0;r=Image1->Height*2-1;WndRgn=CreateRectRgn(0,0,Image1->Width,Image1->Height);< //应用方法二产生轮廓坐标点数组for(y=0;y<Image1->Height;y++){lb=true;for(x=0;x<Image1->Width;x++)if(Image1->Canvas->Pixels[x][y]!=clWhite){a[l].x=x+1;a[l].y=y;lb=false;break;}if(lb) a[l]=a[l-1];l++;
    rb=true;for(x=Image1->Width-1;x>=0;x--)if(Image1->Canvas->Pixels[x][y]!=clWhite){a[r].x=x;a[r].y=y;rb=false;break;}if(rb) a[r]=a[r+1];r--;}//应用方法一抠去图片内凹部分r=Image1->Height*2-1;for(y=0;y<Image1->Height;y++){for(x=a[y].x;x<a[r].x;x++)if(Image1->Canvas->Pixels[x][y]==clWhite){< tepRgn=CreateRectRgn(x,y,x+1,y+1);CombineRgn(WndRgn,WndRgn,tepRgn,RGN_XOR);DeleteObject(tepRgn);}r--;} //将图片外围部分抠去TempRgn=CreatePolygonRgn(a,Image1->Height*2,ALTERNATE);CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);DeleteObject(TempRgn);free(a);//显示不规则窗体SetWindowRgn(Handle,WndRgn,true);SetWindowPos(Handle,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);}
      

  5.   

    codeproject 上面有的 源码!