GDI
画笔和
CPen
类
如果需要改变画线方式,需要创建一个GDI画笔,再由CDC::SelectObject选入设备描述表。
用
CPen
类创建
GDI
画笔
CPen pen(PS_SOLID,RGB(255,0,0));
调用CPen::CreatePen创建GDI画笔
CPen pen;
Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));
向LOGPEN结构中填充画笔参数,调用CPen::CreatePenIndirect生成画笔
CPen pen;
LOGPEN lp;
Lp.lopnStyle=PS_SOLID;
Lp.lopnWidth.x=1;//画笔宽度
Lp.lopnColor=RGB(255,0,0);
Pen.CreatePenIndirect(&lp);
常见画笔样式
PS_SOLID 实线
PS_DASH , PS_DOT ,PS_DASHDOT ,PS_DASHDOTDOT
PS_NULL NULL画笔
用CDC::Ellipse画一个圆,windows会自动用当前选入设备描述表的画笔给圆加边框。可以将NULL画笔选入设备描述表,这样圆就没有可见的边框了。
将笔选入设备描述表就可以使用了
CPen pen(PS_SOLID,10,RGB(255,0,0));
CPen * pOldPen=dc.SelectObject(&pen);
De.Ellipse(0,0,100,100);
GDI
画刷和
CBrush
类
默认情况下,CDC输出函数画出的封闭图形填充白色像素点。
通过创建GDI画刷并在画图前将它选入设备描述表可以改变图形的填充色。
画刷有3种基本类型:单色、带阴影线和带图案。
创建画刷
将值传递给CBrush构造函数,创建画刷
CBrush brush(RGB(255,0,0));
//创建一个阴影线画刷
CBrush brush(HS_DIAGCROSS,RGB(255,0,0));
调用CBrush::CreateSolidBrush创建画刷
CBrush brush;
Brush.CreateSolidBrush(RGB(255,0,0));
//创建一个阴影线画刷
Brush.CreateSolidBrush(HS_DIAGCROSS,RGB(255,0,0));
通过初始化LOGBRUSH并调用创建画刷
绘制五星
void CMfc2View::DrawTri(CDC * MemDC)
{
static POINT apt[5], apt1[5];
int r = 50;
static POINT point, point1;
point.x = point.y = 100;
point1.x = point1.y =1;
for(int i = 0; i < 5; i++)
{
apt[i].y = (long)(point.y - r * cos(2*3.14159 * 72 * i / 360));
apt[i].x = (long)(point.x + r * sin(2*3.14159 * 72 * i / 360));
}
apt1[0] = apt[0];
apt1[1] = apt[2];
apt1[2] = apt[4];
apt1[3] = apt[1];
apt1[4] = apt[3];
LOGPEN logPen;
logPen.lopnColor = RGB(255,0,0);
logPen.lopnStyle = PS_NULL;
logPen.lopnWidth = point1;
(*MemDC).SelectObject(CreatePenIndirect(&logPen));
(*MemDC).SetPolyFillMode(WINDING);
(*MemDC).SelectObject(CreateSolidBrush(RGB(255,0,0)));
//绘制五角星
(*MemDC).Polygon(apt1, 5);
}
输出字符
右对齐输出
CString str=_T(“Now is the time”);
CSize size=dc.GetTextExtent(str);
dc.SetTextJustification(mWidth-size.cx,3);
dc.TextOut(0,y,str);
旋转文字
void CMfc2View::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CRect rect;
GetClientRect(&rect);
dc.SetViewportOrg(rect.Width()/2,rect.Height()/2);
dc.SetBkMode(TRANSPARENT);
for(int i=0;i<3600;i+=150)
{
LOGFONT lf;
ZeroMemory(&lf,sizeof(lf));
lf.lfHeight=50;
lf.lfWeight=FW_BOLD;
lf.lfEscapement=i;
lf.lfOrientation=i;
lstrcpy(lf.lfFaceName,_T("Arial"));
CFont font;
font.CreateFontIndirect(&lf);
CFont * pOldFont=dc.SelectObject(&font);
dc.TextOut(0,0,CString(_T("Hello,MFC")));
dc.SelectObject(pOldFont);
}
}
选入备用对象
CGdiObject::CreateStockObject创建
CDC::SelectStockObject选入设备
英寸标尺
void CRulerView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
dc.SetMapMode(MM_LOENGLISH);//单位0.01in.
dc.SetTextAlign(TA_CENTER|TA_BOTTOM);//对齐方式
dc.SetBkMode(TRANSPARENT);
CBrush brush(RGB(255,255,0));
CBrush * pOldBrush=dc.SelectObject(&brush);
dc.Rectangle(100,-100,1300,-200);
dc.SelectObject(pOldBrush);
for(int i=200;i<1300;i+=100)
{
dc.MoveTo(i,-175);
dc.LineTo(i,-200);
CString str;
str.Format(_T("%d"),(i/100)-1);
dc.TextOut(i,-175,str);
}
for(i=150;i<1300;i+=50)
{
dc.MoveTo(i,-184);
dc.LineTo(i,-200);
}
for(i=125;i<1300;i+=25)
{
dc.MoveTo(i,-192);
dc.LineTo(i,-200);
}
// Do not call CView::OnPaint() for painting messages
}