如何使用CPen类选择各种粗细的画笔?

楼主swordman_guo(菜鸟飞飞) 2004-12-05 10:49:16 在 VC/MFC / 图形处理/算法 提问

我用CPen画曲线,需要的线型:(实线、点画线、短虚线、长虚线)每种分粗细两种,共8种。但除了实线以外,其他3种都不能加粗,只能用1像素单位的粗细。  
       
      我查了MSDN上面也是这样说的(PS_DASHDOT:   Creates   a   pen   with   alternating   dashes   and   dots.   Valid   only   when   the   pen   width   is   1   or   less,   in   device   units.)请问应该怎么将另外3中加粗。 问题点数:20、回复次数:13Top

scrolling="no" frameborder="0" src="http://topic.csdn.net/Include/Board.htm?Tags=ps,cpen,penstyle,%E7%94%BB%E7%BA%BF,logbrush,%E9%95%BF%E5%BA%A6,%E5%AE%9E%E7%BA%BF,pdc,%E7%BA%BF%E5%9E%8B,ilength">

1 楼property1(lubiao)回复于 2004-12-05 12:19:37 得分 0

自己   画把Top

2 楼I_Love_CPP(Never stop!)回复于 2004-12-05 12:48:26 得分 5

1、用CBrush替代如何?  
  2、把两个CPen合成一个不就可以加宽么:  
        //已经调试成功!  
        pdc->MoveTo(ptStart);  
        pdc->LineTo(ptEnd);  
        pdc->MoveTo(ptStart.x,ptStart.y+1);  
        pdc->LineTo(ptEnd.x,ptEnd.y+1);Top

3 楼handwolf(青松崖)回复于 2004-12-05 12:52:15 得分 0

刚好我也要用,写好了给你!Top

4 楼cbc(逍遥子)回复于 2004-12-05 12:59:37 得分 0

WINNT下,可以用以下方式创建画笔  
   
                LOGBRUSH   brush;  
   
                brush.lbColor=DrawColor;  
   
                brush.lbStyle=BS_SOLID;  
   
  mPen.CreatePen(PS_GEOMETRIC|PS_USERSTYLE|PS_ENDCAP_FLAT,(int)LineWide,&brush,i,PenStyle);Top

5 楼cbc(逍遥子)回复于 2004-12-05 13:00:06 得分 10

Win98中,给DC设置合适的笔宽,选择实线,下面函数可以根据PenStyle数组给定长度值画直线。如果画曲线或者折线,需要把曲线离散成直线段,根据上次画线返回值确定本次画线的起始值,就可以了  
   
  #include   "math.h"  
   
  DWORD       PenStyle[16]   =   {0,0,0,0,0,0,0,0,  
   
  0,0,0,0,0,0,0,0};  
   
  typedef   struct   xyz   {  
   
                double   x;  
   
                double   y;  
   
                double   z;  
   
  }   XYZ,*PXYZ,**PPXYZ;  
   
     
   
  //按照PenStyle[]画一条从p1点到p2点的直线  
   
  //例如PenStyle[0]=5,PenStyle[1]=2表示按照长度为5的实线、长度为2的间隔形成的线型画线  
   
  //_____     _____     _____     _  
   
  //并且指定从线型的何处画,例如iStart=6从Penstyle[1]处的第二个空格开始画  
   
  //iStart取值范围为0到一个线型的总长度-1  
   
  //返回值:线型总长度与剩余最后一段线长度之差,表示下一次画线应该指定的从何处开始画  
   
  int   DrawLineA(CDC*   pDC,POINT   p1,POINT   p2,int   iStart)  
   
  {  
   
                int   i=0;  
   
                int   iEnd=0;//返回值,表示最后一段不完全的线段的长度  
   
                //计算直线长度  
   
                double   dDistance=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));  
   
                int   iLineType=0;//线型的长度  
   
                if(dDistance<2)  
   
                {  
   
                              for(i=0;i<16;i++)  
   
                              {  
   
                                            if(PenStyle[i]==0)break;  
   
                                            iLineType+=PenStyle[i];  
   
                              }  
   
                              iEnd=(int(iStart-dDistance))%iLineType;  
   
                              if(iEnd<0)iEnd+=iLineType;  
   
                              return   iEnd;  
   
                }  
   
                double   ddltx[16]={0,0,0,0,//每一段线型的x距离  
   
                              0,0,0,0,  
   
                              0,0,0,0,  
   
                              0,0,0,0};  
   
                double   ddlty[16]={0,0,0,0,//每一段线型的y距离  
   
                              0,0,0,0,  
   
                              0,0,0,0,  
   
                              0,0,0,0};  
   
                double   dXScale=(p2.x-p1.x)/dDistance;//x方向长度和总长度比例  
   
                double   dYScale=(p2.y-p1.y)/dDistance;//y方向长度和总长度比例  
   
                //计算每一段线型的x、y距离及线型的长度  
   
                for(i=0;i<16;i++)  
   
                {  
   
                              if(PenStyle[i]==0)break;  
   
                              ddltx[i]=PenStyle[i]*dXScale;  
   
                              ddlty[i]=PenStyle[i]*dYScale;  
   
                              iLineType+=PenStyle[i];  
   
                }  
   
                iEnd=(int(dDistance+iStart))%iLineType;  
   
                if(iEnd<0)iEnd+=iLineType;  
   
                 
   
                XYZ   pp={0,0,0};//第一段之前的完整线型开始点  
   
                pDC->MoveTo(p1);  
   
                int   iLength=-iStart;//已经画的线段的长度  
   
                pp.x=iLength*dXScale+p1.x;  
   
                pp.y=iLength*dYScale+p1.y;  
   
                for(;;)  
   
                {  
   
                              for(i=0;i<16;i++)  
   
                              {  
   
                                            if(PenStyle[i]==0)break;  
   
                                            pp.x+=ddltx[i];  
   
                                            pp.y+=ddlty[i];  
   
                                            iLength+=PenStyle[i];  
   
                                            if(i%2==0)  
   
                                            {  
   
                                                          if(iLength>0)  
   
                                                          {  
   
                                                                        if(iLength<dDistance)  
   
                                                                        {  
   
                                                                                      pDC->LineTo(pp.x,pp.y);  
   
                                                                        }  
   
                                                                        else  
   
                                                                        {  
   
                                                                                      pDC->LineTo(p2);  
   
                                                                                      return   iEnd;  
   
                                                                        }  
   
                                                          }  
   
                                            }else  
   
                                            {  
   
                                                          if(iLength>0)  
   
                                                          {  
   
                                                                        if(iLength<dDistance)  
   
                                                                        {  
   
                                                                                      pDC->MoveTo(pp.x,pp.y);  
   
                                                                        }  
   
                                                                        else  
   
                                                                        {  
   
                                                                                      pDC->MoveTo(p2);  
   
                                                                                      return   iEnd;  
   
                                                                        }  
   
                                                          }  
                                            }  
                              }  
                }  
                return   iEnd;  
   
  }  
   
  Top

6 楼koko1998(高价购买火车票)回复于 2004-12-05 14:15:43 得分 0

gzTop

7 楼swordman_guo(菜鸟飞飞)回复于 2004-12-08 16:25:01 得分 0

不用这么复杂吧,有没有比较简单的哦。我是从数据库内读取的数据,然后进行画线,这样处理程序改起来好麻烦啊。Top

8 楼bobob(静思)回复于 2004-12-08 16:37:56 得分 5

LOGBRUSH   logBrush;  
  logBrush.lbStyle   =   BS_SOLID;  
  logBrush.lbColor   =   m_crLineColor;//字体颜色  
  logBrush.lbHatch   =   0;  
   
  CPen   pen;  
  if(!pen.CreatePen(PS_DASH|PS_GEOMETRIC|PS_ENDCAP_SQUARE;,   m_nLineWidth,//线宽  
    &logBrush,   0,   NULL))  
  return;  
  CPen   *pOldPen   =   m_pDc->SelectObject(&pen);  
   
                    ……  
   
                    m_pDc->SelectObject(pOldPen);Top

9 楼bobob(静思)回复于 2004-12-08 16:39:01 得分 0

上面多了一个分号Top

10 楼qiqiyeye(BenQ打杂的@_@)回复于 2004-12-09 08:54:43 得分 0

CPen(   int   nPenStyle,   int   nWidth,   COLORREF   crColor   );  
  第一个参数是pen的样式,可以是直线,点线,点划线和短划线  
  第二个参数就是宽度  
  第三个参数是颜色  
   
  你可以先定义几个pen,然后用pDC->SelectObject(&pen)就能调用不同的pen了Top

11 楼swordman_guo(菜鸟飞飞)回复于 2004-12-12 11:23:32 得分 0

re:   回复人:   qiqiyeye(导航组打杂的@_@)  
  用CPen只能画粗实线,其他线性不能画粗的。  
   
  re:回复人:   bobob(6颗星星就变绿色了!)(★★★★★★)  
  用你说的那种调用BRUSH的方法画横线和竖线还可以,画曲线的效果很差,我要画曲线图,根本用不了。Top

12 楼qiqiyeye(BenQ打杂的@_@)回复于 2004-12-12 11:42:25 得分 0

给你个土办法,呵呵  
  画曲线的时候画三条,是不是也加粗了,呵呵Top

13 楼qiqiyeye(BenQ打杂的@_@)回复于 2004-12-12 11:49:53 得分 0

或者用坐标函数将逻辑单位转换为设备单位LPtoDP,设定单位坐标的size,应该可以加粗的,试试吧 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值