变色字体

CRect rect;

     GetClientRect(hWnd, rect);
     HDC  hdc = GetDC(hWnd);
     HDC  memDC = CreateCompatibleDC(hdc);
 
     BITMAPINFO bmi;
     bmi.bmiHeader.biSize =  sizeof (BITMAPINFOHEADER);
     bmi.bmiHeader.biBitCount = 32;
     bmi.bmiHeader.biHeight = rect.Height();
     bmi.bmiHeader.biWidth = rect.Width();
     bmi.bmiHeader.biPlanes = 1;
     bmi.bmiHeader.biCompression = BI_RGB;
     bmi.bmiHeader.biClrImportant = 0;
     bmi.bmiHeader.biClrUsed = 0;
     bmi.bmiHeader.biXPelsPerMeter = 0;
     bmi.bmiHeader.biYPelsPerMeter = 0;
     bmi.bmiHeader.biSizeImage = rect.Width()*rect.Height() * 32 / 8;
     
     HBITMAP  bmp = CreateDIBSection(hdc, &bmi, 0, NULL, NULL, 0);
     SelectObject(memDC, bmp);
 
     Gdiplus::Graphics *graphics =  new  Gdiplus::Graphics(memDC);
     graphics->SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
     graphics->SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias);
 
#ifdef _UNICODE
     LPWSTR  str = ( LPWSTR )_lyric;
#else
     USES_CONVERSION;
     LPWSTR  str = A2W(_lyric);
#endif // _UNICODE
     Gdiplus::FontFamily fontFamily(L "微软雅黑" );
     Gdiplus::Font m_pFont(&fontFamily, 48, Gdiplus::FontStyleRegular, Gdiplus::UnitPixel);
     Gdiplus::Font m_pFont2(&fontFamily, 48, Gdiplus::FontStyleUnderline, Gdiplus::UnitPixel); //下划线
 
     Gdiplus::StringFormat format; 
     RectF layoutRect(0, 0, 1000, 100);
     RectF boundingBox;
     StringFormat strfmt;
     strfmt.SetTrimming(StringTrimmingWord);
     strfmt.SetFormatFlags(StringFormatFlagsNoWrap);
     strfmt.SetLineAlignment(StringAlignmentCenter);
     strfmt.SetAlignment(StringAlignmentCenter);
     graphics->MeasureString(str, -1, &m_pFont, layoutRect, &strfmt, &boundingBox);
     
     
     Gdiplus::GraphicsPath stringPath(FillModeAlternate); //创建路径
 
     stringPath.AddString(str, -1, &fontFamily, m_pFont.GetStyle(), 48, boundingBox,&strfmt);  //把文字加入路径
     
     graphics->DrawPath(&Pen(Color(150,0,0,0)), &stringPath); //绘制边框
     
     Gdiplus::LinearGradientBrush brush(boundingBox, Color::Blue, Color::Red, LinearGradientModeHorizontal);
 
     int  colors[] = { Color::Red ,Color::Orange ,Color::Yellow ,Color::Green ,Color::Cyan,Color::Blue ,Color::Purple };
     REAL positions[] = { 0.0f,0.16f,0.33f,0.50f,0.67f,0.83f,1.0f };
     brush.SetInterpolationColors((Color*)colors, positions, 7);
     graphics->FillPath(&brush, &stringPath); //填充路径
 
     RectF fillrect = boundingBox;
     fillrect.Width = (boundingBox.Width*0.2);
     stringPath.AddString(str, -1, &fontFamily, m_pFont2.GetStyle(), 48, boundingBox, &strfmt);  //把文字加入路径
 
     graphics->IntersectClip(fillrect);
     graphics->FillPath(&SolidBrush(Color::Red), &stringPath);
 
     RectF fillrect2 = boundingBox;
     fillrect2.X += 500;
     fillrect2.Width = (boundingBox.Width*0.2);
     graphics->SetClip(fillrect2);   
     graphics->FillPath(&SolidBrush(Color::Green), &stringPath);
 
     delete  graphics;
     
     BLENDFUNCTION bldfun;
     bldfun.AlphaFormat = AC_SRC_ALPHA;
     bldfun.BlendFlags = 0;
     bldfun.BlendOp = AC_SRC_OVER;
     bldfun.SourceConstantAlpha = 255;
     UpdateLayeredWindow(hWnd, hdc, NULL, &CSize(1000, 100), memDC, &CPoint(0, 0), 0, &bldfun, ULW_ALPHA);
     
     ::ReleaseDC(hWnd, hdc);
     ::DeleteDC(memDC);
     DeleteObject(bmp);
 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值