GDI+渐变画刷怎么实现两种以上颜色渐变?两种颜色的渐变很好做
两种颜色以上的呢?

解决方案 »

  1.   

    如果是3个颜色,好像有一个办法,不过仅仅算法上的
    将这3个颜色,放在全色平面上,这个全色平面好像我在什么地方看到过可以用RGB来表示的,是一个近似三角形的,经常用于和CMYK颜色体系什么的比较然后就是计算过3个点的圆弧,极端情况是一条线段,
    然后用圆弧或者线段上的颜色去描不过实际使用上似乎很麻烦
      

  2.   

    GDI+竟然连三色渐变都这么麻烦吗
      

  3.   

    HBITMAP hBmp = (HBITMAP)::LoadImage(NULL, szFileName, IMAGE_BITMAP, bmih.biWidth, bmih.biHeight, LR_LOADFROMFILE | LR_CREATEDIBSECTION );    m_iWidth    = bmih.biWidth;
        m_iHeight   = bmih.biHeight;    HWND hWnd = pDevice->GetWnd();
        HDC hdcWindow = ::GetDC( hWnd );    m_hBitmap       = ::CreateCompatibleBitmap( hdcWindow, m_iWidth, m_iHeight );
        m_hMaskBitmap   = ::CreateBitmap( m_iWidth, m_iHeight, 1, 1, NULL );    HDC hTempDC = ::CreateCompatibleDC( hdcWindow );
        m_hDC       = ::CreateCompatibleDC( hdcWindow );
        m_hMaskDC   = ::CreateCompatibleDC( hdcWindow );    HBITMAP hOldBitmap  = (HBITMAP)::SelectObject( hTempDC, hBmp );
        m_hOldBitmap        = (HBITMAP)::SelectObject( m_hDC, m_hBitmap );
        m_hOldMaskBitmap    = (HBITMAP)::SelectObject( m_hMaskDC, m_hMaskBitmap );    ::BitBlt( m_hDC, 0, 0, m_iWidth, m_iHeight, hTempDC, 0, 0, SRCCOPY );    ::SetBkColor( m_hDC, RGB(0,0,255) );
        ::BitBlt( m_hMaskDC, 0, 0, m_iWidth, m_iHeight, m_hDC, 0, 0, SRCCOPY );    ::SetBkColor( m_hDC, RGB(0,0,0) );
        ::SetTextColor( m_hDC, RGB(255,255,255) );
        ::BitBlt( m_hDC, 0, 0, m_iWidth, m_iHeight, m_hMaskDC, 0, 0, SRCAND );    ::SelectObject( hTempDC, hOldBitmap );
        DeleteDC( hTempDC );
        DeleteObject( hBmp );    ::ReleaseDC( hWnd, hdcWindow );
      

  4.   

    Graphics g(lpDrawItemStruct->hDC);                             //从hDC创建Graphics对象
    Rect gRect(rc.left ,rc.top ,rc.Width (),rc.Height ()); //从CRect创建Rect对象
    Color colors[]={Color::Red ,Color::Yellow ,Color::Blue };   //定义3种颜色
    REAL positions[] = {0.0f,0.3f,1.0f};                                  //定义3种颜色距离起点位置//创建渐变画刷,初始的颜色值其实无效
    LinearGradientBrush lbrush   (gRect,Color::Green ,Color::Brown  ,LinearGradientModeVertical);
    lbrush.SetInterpolationColors (colors,positions,3);                //定义多色渐变
    g.FillRectangle (&lbrush,gRect);       //绘制矩形区域