【问题标题】:How to fill 50% opaque color to polygon?如何将 50% 的不透明颜色填充到多边形?
【发布时间】:2020-09-19 15:25:11
【问题描述】:

我可以用这段代码填充颜色

      void  FillColorPolygon(POINT  pts[],int   ilnum,long  fillColor)  
      { 
        COLORREF    fillcol;
        fillcol = Gc_disp::ColorSet(fillColor);
        HBRUSH hBrushNew = CreateSolidBrush(fillcol);
        HBRUSH hBrushOld = (HBRUSH)SelectObject(m_hDC, hBrushNew);
        SetPolyFillMode(m_hDC, WINDING);    

        Polygon(m_hDC, pts, (short)ilnum);              
        SelectObject(m_hDC, hBrushOld);
        DeleteObject(hBrushNew);    
     }

ColorSet 函数填充 100% 不透明

     COLORREF Gc_disp::ColorSet(long    col)
     {
         COLORREF   rcol = RGB(0, 0, 0);
         if( col >= 0 && col <= GRIP_MAXCOLORS + 1 )
             rcol = g_tblColor[ col ];

         return( rcol );
     }

但我不知道如何用 50% opeque 填充颜色?

编辑:

遵循@Jonathan 的建议后。我尝试使用 AlphaBlend 功能。 首先我尝试让一些位图变成透明的,看起来可行。

       void  FillColorPolygonAlpha(POINT  pts[],int   ilnum,long  fillColor)  
       {
         BLENDFUNCTION m_bf;    
         m_bf.BlendOp = AC_SRC_OVER;
         m_bf.BlendFlags = 0;
         m_bf.SourceConstantAlpha = 0xC8;
         m_bf.AlphaFormat = 0;

         CBitmap  m_bitmap;
         CImage image;
         image.Load(_T("C:\\Blas_grande.png"));
         CBitmap bitmap;
         m_bitmap.Attach(image.Detach());

         int m_nWidth, m_nHeight;
         BITMAP aBmp;
         m_bitmap.GetBitmap(&aBmp);
         m_nWidth = aBmp.bmWidth ;
         m_nHeight = aBmp.bmHeight;

         CDC* pDC = CDC::FromHandle( GetDC() );
         CDC  dcMem;    
         dcMem.CreateCompatibleDC(pDC); 

         CBitmap *pOldBitmap  =  dcMem.SelectObject(&m_bitmap);

          AlphaBlend(m_hDC, 0,0, m_nWidth, m_nHeight, dcMem, 0,0,m_nWidth, m_nHeight,m_bf);

         dcMem.SelectObject(pOldBitmap);
       }

图像是用透明的,如下所示。

但是当我尝试填充多边形时它不起作用。 我通过更改填充多边形来修改 FillColorPolygonAlpha() 函数。

     void  FillColorPolygonAlpha(POINT  pts[],int   ilnum,long  fillColor)  
       {
         BLENDFUNCTION m_bf;    
         m_bf.BlendOp = AC_SRC_OVER;
         m_bf.BlendFlags = 0;
         m_bf.SourceConstantAlpha = 0xC8;
         m_bf.AlphaFormat = 0;

         CDC* pDC = CDC::FromHandle( GetDC() );
         CDC  dcMem;    
         dcMem.CreateCompatibleDC(pDC); 

         COLORREF   fillcol;
         fillcol = Gc_disp::ColorSet(fillColor);
         HBRUSH hBrushNew = CreateSolidBrush(fillcol);  
         Polygon(dcMem, pts, (short)ilnum); 

          AlphaBlend(m_hDC, 0,0, m_nWidth, m_nHeight, dcMem, 0,0,m_nWidth, m_nHeight,m_bf);

       }

它不绘制任何多边形。

【问题讨论】:

  • 使用 GDI,您能做的最好的事情就是用您想要的颜色填充内存 DC,然后使用 AlphaBlend 函数将其混合到目标上。
  • @Fame th Jonathan 提供了一个有用的解决方案。您可以使用位于BLENDFUNCTION 结构中的SourceConstantAlpha 来实现自定义透明度。
  • 现在我尝试使用 SourceConstantAlpha 和 AlphaBlend。当我使用位图然后将其混合为透明时它可以工作。只使用位图重要吗?有什么可能?如果我在不创建位图的情况下填充多边形。

标签: winapi gdi


【解决方案1】:

我使用 GDI+ 解决了这个问题。

因为SolidBrush可以通过alpha值设置透明。

void FillColorPolygonAlpha(POINT  pts[],int   ilnum,long  fillColor,int alpha)  
 {      
    COLORREF    rcol;
    rcol = Gc_disp::ColorSet(fillColor);

    Gdiplus::Graphics gr(m_hDC);    
    Gdiplus::SolidBrush semiTransBrush(Gdiplus::Color(alpha, GetRValue(rcol), GetGValue(rcol), GetBValue(rcol) ));      
    CArray<Gdiplus::Point,Gdiplus::Point> arrPoints;
    for(int i=0; i<sizeof(pts); i++)
    {
        Gdiplus::Point pt(pts[i].x , pts[i].y);
        arrPoints.Add(pt); 
    }   

    Gdiplus::Point* pPoints = arrPoints.GetData(); 
    gr.FillPolygon(&semiTransBrush,pPoints,ilnum);      
}

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    相关资源
    最近更新 更多