如题 。请大侠指教。

解决方案 »

  1.   

    没什么本质上的区别
    CPen::Cpen(...)内部也是调用 CreatePen, exCreatePen 的
      

  2.   

    CPen()是用于定义这个画笔对象吧
    CreatePen()是动态创建画笔的时候调用的
      

  3.   

    CPen是MFC的一个类,建立的是类对象,CreatePen则是API,建立的是一个GDI资源,前者是对后者的一个封装。
      

  4.   

    void CPainterView::OnDraw(CDC* pDC)
    {
    CPainterDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
        CRect rect;
    GetClientRect(rect);
        CPen *OldPen;
    POSITION pos=pDoc->RecordList.GetHeadPosition();
    while(pos!=NULL)
    {
    BYTE * drawtype;
    drawtype=(BYTE *)pDoc->RecordList.GetNext(pos);
    switch(*drawtype)
    {
    case LINE:
    LINENODE *line;
    line=(LINENODE *)pDoc->RecordList.GetNext(pos);
    if(line->bDo>0)
    {
    if(line->bDo!=2)
    CPen pen(line->pen.iStyle,line->pen.iWidth,line->pen.Color);
                  else   
    CPen pen(PS_DASHDOT,1,RGB(255,0,0));
    OldPen=pDC->SelectObject(&pen);
    pDC->MoveTo(line->Start);
    pDC->LineTo(line->End);
    pDC->SelectObject(OldPen);
    }
    break;
    }
    }
    }
    void CPainterView::OnDraw(CDC* pDC)
    {
    CPainterDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
        CRect rect;
    GetClientRect(rect);
        HPEN hOldPen,hPen;
    POSITION pos=pDoc->RecordList.GetHeadPosition();
    while(pos!=NULL)
    {
    BYTE * drawtype;
    drawtype=(BYTE *)pDoc->RecordList.GetNext(pos);
    switch(*drawtype)
    {
    case LINE:
    LINENODE *line;
    line=(LINENODE *)pDoc->RecordList.GetNext(pos);
    if(line->bDo>0)
    {
    if(line->bDo!=2)
     hPen=CreatePen(line->pen.iStyle,line->pen.iWidth,line->pen.Color);
                  else   
    hPen=CreatePen(PS_DASHDOT,1,RGB(255,0,0));
    hOldPen=(HPEN)SelectObject(pDC->m_hDC,hPen);
    pDC->MoveTo(line->Start);
    pDC->LineTo(line->End);
    SelectObject(pDC->m_hDC,hOldPen);
    }
    break;
    }
    }
    }那请问这两个区别在哪 为什么前面那个编译通不过。
      

  5.   

    if(line->bDo!=2) 
    CPen pen(line->pen.iStyle,line->pen.iWidth,line->pen.Color); 
                else  
    CPen pen(PS_DASHDOT,1,RGB(255,0,0)); 
    OldPen=pDC->SelectObject(&pen); 
    相当于if(line->bDo!=2) 
    {
    CPen pen(line->pen.iStyle,line->pen.iWidth,line->pen.Color); 
    // 该变量只在大括号内有效
    }
                else  
    {
    CPen pen(PS_DASHDOT,1,RGB(255,0,0)); 
    // 该变量只在大括号内有效
    }OldPen=pDC->SelectObject(&pen); // 到这里, pen 的定义已失效
      

  6.   

    两个的区别是一个是用MFC类对象的,一个是用HPEN句柄的,到底是哪一个通不过了,应该是后面哪个通不过吧,一般MFC的函数不接受句柄作参数的,楼主最好将出错信息贴出来。
      

  7.   

    up
    CPen pen;
    if(line->bDo!=2) 

    pen.CreatePen(line->pen.iStyle,line->pen.iWidth,line->pen.Color); 
    // 该变量只在大括号内有效 

                else  

    pen.CreatePen(PS_DASHDOT,1,RGB(255,0,0)); 
    // 该变量只在大括号内有效 

      

  8.   

    可以通用
    =========
    能不能通用不是绝对的,从功能上看,当然是通过的,但是你在一个API参数中总不能放一个CPen变量吧!
      

  9.   


    这个是完美的解答。 marrco2005  小弟在此谢过啦。  同时也谢谢其他各位大侠。