15,979
社区成员
发帖
与我相关
我的任务
分享
void CSDI6View::OnDraw(CDC* pDC)
{
CSDI6Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int nSaveDC = pDC->SaveDC();
//获取客户区坐标
CRect rcClient;
GetClientRect(&rcClient);
//填充背景色
pDC->FillSolidRect(rcClient, RGB(255, 255, 255));
//设置背景透明
int OldBkMode = pDC->SetBkMode(TRANSPARENT);
LOGFONT logFont = {0};
_tcscpy_s(logFont.lfFaceName, _T("Airal"));
//修改字体大小
logFont.lfHeight = -MulDiv(72, pDC->GetDeviceCaps(LOGPIXELSY), 72);
logFont.lfUnderline = 0; //无下划线
logFont.lfWeight = FW_NORMAL;
CFont NormalFont;
NormalFont.CreatePointFontIndirect(&logFont);
logFont.lfUnderline = 1; //带下划线
logFont.lfWeight = FW_HEAVY; //加黑
logFont.lfItalic = TRUE; //斜体
CFont UnderLineFont;
UnderLineFont.CreatePointFontIndirect(&logFont);
//选入常规字体
CFont *pOldFont = pDC->SelectObject(&NormalFont);
//设置字体颜色黑色
COLORREF OldtxtColor = pDC->SetTextColor(RGB(0, 0,0));
TEXTMETRIC txtMetric;
pDC->GetTextMetrics(&txtMetric);
int sx = 10, sy = 10;
{
CString szStr = _T("一般字体");
pDC->SelectObject(&NormalFont);
pDC->SetTextColor(RGB(0, 0,0));
CRect rcTxt(sx, sy, rcClient.bottom, rcClient.right);
pDC->DrawText(szStr, rcTxt, DT_LEFT|DT_TOP);
pDC->DrawText(szStr, rcTxt, DT_LEFT|DT_TOP|DT_CALCRECT);
sx += rcTxt.Width();
}
{
CString szStr = _T("红色带下划线字体");
pDC->SelectObject(&UnderLineFont);
pDC->SetTextColor(RGB(255, 0, 0));
CRect rcTxt(sx, sy, rcClient.bottom, rcClient.right);
pDC->DrawText(szStr, rcTxt, DT_LEFT|DT_TOP);
pDC->DrawText(szStr, rcTxt, DT_LEFT|DT_TOP|DT_CALCRECT);
sx += rcTxt.Width();
}
//结束清理
pDC->SetTextColor(OldtxtColor);
pDC->SelectObject(pOldFont);
pDC->SetBkMode(OldBkMode);
pDC->RestoreDC(nSaveDC);
}
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);