我想使用位图填充一个不规则的多边形区域,怎样做呢?qq"16976440

解决方案 »

  1.   

    1.
    CDC::FillRgn(CRgn* pRgn, CBrush* pBrush)2.CDC::PlgBlt(LPPOINT lpPoint, CDC* pSrcDC, int xSrc, int ySrc,
    int nWidth, int nHeight, CBitmap& maskBitmap, int xMask, int yMask)
      

  2.   

    CBrush NewBrush,*pOldBrush;
    LOGBRUSH lb;
    BOOL bResult=0;
    CBitmap *pBitmap;
    switch(m_pFillStyle)
    {
    case 0://挖空,不填充
    lb.lbStyle=BS_NULL;
    lb.lbColor=m_pFillColor;
    lb.lbHatch=HS_CROSS;
    NewBrush.CreateBrushIndirect(&lb);
    break;
    case 1://实体填充,颜色
    lb.lbStyle=BS_SOLID;
    lb.lbColor=m_pFillColor;
    lb.lbHatch=HS_CROSS;
    NewBrush.CreateBrushIndirect(&lb);
    break;
    case 2://图形填充
    pBitmap=new CBitmap();
    bResult=pBitmap->LoadBitmap(IDB_BITMAP1);
    NewBrush.CreatePatternBrush(pBitmap);
    break;
    case 3://斜线填充
    lb.lbStyle=BS_HATCHED;
    lb.lbHatch=HS_CROSS;
    lb.lbColor=m_pFillColor;
    NewBrush.CreateBrushIndirect(&lb);
    break;
    }
    pOldBrush=pDC->SelectObject(&NewBrush);   //选择新的画笔画刷
    pOldPen=pDC->SelectObject(&NewPen);
    pDC->Polygon(m_pPoints,m_pNum);           //画多边形
    pDC->SelectObject(pOldPen);               //恢复画笔,画刷
    pDC->SelectObject(pOldBrush);
    if (bResult!=0)
    delete pBitmap;
    NewBrush.DeleteObject();
      

  3.   

    1.生成RGN
    HRGN cr;  BeginPath(hDC);
    MoveToEx(hDC, 0, 0, NULL);
    LineTo(hDC, 64, 0);
    LineTo(hDC, 64, 16);
    LineTo(hDC, 48, 32);
    LineTo(hDC, 0, 32);
    LineTo(hDC, 0, 0);
    EndPath(hDC);
    cr = CreateRectRgn(0, 0, 63, 63);
    cr = PathToRegion(hDC);
    ....
    DeleteObject(cr);
    生成CBitmap就不用我说了吧
      

  4.   

    CBrush NewBrush,*pOldBrush;
    LOGBRUSH lb;
    BOOL bResult=0;
    CBitmap *pBitmap;
    switch(m_pFillStyle)
    {
    case 0://挖空,不填充
    lb.lbStyle=BS_NULL;
    lb.lbColor=m_pFillColor;
    lb.lbHatch=HS_CROSS;
    NewBrush.CreateBrushIndirect(&lb);
    break;
    case 1://实体填充,颜色
    lb.lbStyle=BS_SOLID;
    lb.lbColor=m_pFillColor;
    lb.lbHatch=HS_CROSS;
    NewBrush.CreateBrushIndirect(&lb);
    break;
    case 2://图形填充
    pBitmap=new CBitmap();
    bResult=pBitmap->LoadBitmap(IDB_BITMAP1);
    NewBrush.CreatePatternBrush(pBitmap);
    break;
    case 3://斜线填充
    lb.lbStyle=BS_HATCHED;
    lb.lbHatch=HS_CROSS;
    lb.lbColor=m_pFillColor;
    NewBrush.CreateBrushIndirect(&lb);
    break;
    }
    pOldBrush=pDC->SelectObject(&NewBrush);   //选择新的画笔画刷
    pOldPen=pDC->SelectObject(&NewPen);
    pDC->Polygon(m_pPoints,m_pNum);           //画多边形
    pDC->SelectObject(pOldPen);               //恢复画笔,画刷
    pDC->SelectObject(pOldBrush);
    if (bResult!=0)
    delete pBitmap;
    NewBrush.DeleteObject();
      

  5.   

    好人做到底:
    CBitmap bmp;
    bmp.LoadBitmap(IDB_TEST);
    CBrush br;
    br.CreatePatternBrush(CBitmap::FromHandle(bmp));
    ........
    ::DeleteObject(br);
    ::DeleteObject(bmp);
      

  6.   

    int nSaveDC=dc.SaveDC();
    1.建立你的区域
    2.SelectClipRgn( CRgn* pRgn );
    然后就可以画你的位图了,只显示区域内图像的
    dc.RestoreDC(nSaveDC);
      

  7.   

    spwnihao(海盗) 的方法真的好!谢谢海盗!!!!robothn(雷鸟)的也可以,雷鸟兄,你回答我的自画listbox,listview的滚动条的问题,你尝试过吗,我以前尝试过,好象不好用.