MFC Windows 程序设计(3)

 
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
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值