本帖最后由 shb8845369 于 2013-01-30 08:48:23 编辑

解决方案 »

  1.   

    使用cpen
    然后用dc::selectobject
      

  2.   

    问题1: 总是不变就在构造函数中,如果需要保存,就写在Serialize,保存到文件。
    问题2:Get/Set 好,结构清晰,谁用的东西谁管理。
      

  3.   

    CDocument/CView/CFrameWnd是三口组,因为想在画图之前通过菜单栏或者工具栏修改CRectangle类的画笔和画刷数据,涉及到菜单栏和数据的交互,Serialize函数只是保存通过菜单栏修改后的数据,而且每画一次都需要更新链表,感觉初始化放在Serialize并不合适。关注点在数据的交互更新,而不是数据更新后的保存过程。
      

  4.   


    那就没什么好纠结的啊。初始化可以定义一个默认的(不定义也可以,当然画图的时候需要做些判断),然后通过Get/Set改值就好了。
    画笔和画刷是每个CRectangle的属性,跟链表也没多大关系啊。
    如果你意在让链表中的所有元素都用同一个画笔和画刷。那就让画刷和画笔变成CDocument的属性。
      

  5.   

    其实你需要搞清楚的问题很多
    1,MFC文档视图框架中,程序运行之初执行了哪些函数;
    实际框架都为你准备好了,你只要写入代码既可2 document中存放数据的成员变量,比如CObjectList m_objList;或者CObjectArray
    中存入矩形CRectangle,矩形要支持 DECLARE_SERIAL  ,实现Serialize
     让对象自己读/写自己, 自己画自己,
    文档类中只需要m_objList.Serialize(ar),你提供的CRectangle显然不具备以上功能
    3 你的链表类CObjectList 或者CObjectArayr或者CArray或自定义的
    如果没有提供序列化元素的函数,你要写帮助器器函数
    4 清场工作,
    5 它的都是小菜
      

  6.   

    其实你需要搞清楚的问题很多
    1,MFC文档视图框架中,程序运行之初执行了哪些函数;
    实际框架都为你准备好了,你只要写入代码既可
    在这一过程中主要涉及到,文档数据如何生成对象(保存时只需将对象数据写入文档)2 document中存放数据的成员变量,比如CObjectList m_objList;或者CObjectArray
    中存入矩形CRectangle,矩形要支持 DECLARE_SERIAL  ,实现Serialize
     让对象自己读/写自己, 自己画自己,
    文档类中只需要m_objList.Serialize(ar),你提供的CRectangle显然不具备以上功能
    3 你的链表类CObjectList 或者CObjectArayr或者CArray或自定义的
    如果没有提供序列化元素的函数,你要写帮助器器函数
    4 清场工作,
    5 版本管理(主要是文档数据结构发生改变,增加或减少了文档成员。新旧版本数据不同,如何读入)
       可能一不会马上涉及到
    6 其它的都是小菜  
     
      

  7.   

    这是我改进的CRectangle,自己画自己倒是实现了,但如何将菜单中的选择传给DrawRectangle呢?画笔和画刷六项参数,不可能每次鼠标作图之前都在菜单上点六下吧,当然我可以在CMyDocument设置六个变量来跟踪菜单的选择,但是如何在CMyDocument每次调用我的DrawRectangle函数的时候,将它的六个变量传进来?难道DrawRectangle要重新构造?请示例。
    class CRectangle : public CObject
    {
    DECLARE_DYNAMIC(CRectangle)
    public:
    //构造函数
    CRectangle();
            //设置画刷
    void SetBrushStyle(UINT iBrushStyle);
    void SetBrushColor(COLORREF crColor);
    void SetBrushHatch(LONG lBrushHatch);
            //设置画笔
    void SetPenStyle(UINT iPenStyle);
    void SetPenColor(COLORREF crColor);
    void SetPenWidth(int iPenWidth);
            //设置矩形坐标
    void SetPointBegin(CPoint point);
    void SetPointEnd(CPoint point);
            //绘制矩形
    BOOL DrawRectangle(CDC* pDC);private:
    //矩形
    CRect  m_rect;
    //画刷
    UINT  m_brushStyle;
    COLORREF m_brushColor;
    LONG  m_brushHatch; 
    //画笔
    UINT  m_penStyle;
    COLORREF m_penColor;
    int  m_penWidth;
    //析构
    virtual  ~CRectangle();
    protected:
    DECLARE_MESSAGE_MAP()
    public:
    virtual void Serialize(CArchive& ar);
    };//绘制矩形
    BOOL CRectangle::DrawRectangle(CDC* pDC)
    {
    CPen pen;
    LOGBRUSH logbrush;
    CBrush brush;
    logbrush.lbStyle = m_brushStyle;
    logbrush.lbColor = m_brushColor;
    logbrush.lbHatch = m_brushHatch;

    if(!brush.CreateBrushIndirect(&logbrush))
    return FALSE;
    CBrush* pOldBrush = pDC->SelectObject(&brush); if(!pen.CreatePen(m_penStyle,m_penWidth,m_penColor))
    return FALSE;
    CPen* pOldPen = pDC->SelectObject(&pen); pDC->Rectangle(&m_rect);
    }
      

  8.   

    确实和链表没一点关系,只是走访链表的时候需要判断一下形状类型,然后调用相应类的绘制函数就可以了。既然自己画自己,在画之前,画刷和画笔变量应该和菜单栏的保持一致。如果我构造函数中不初始化它们,鼠标作图前,我又该在哪设置这些变量,难道是将CMyDocument当前跟踪的画笔和画刷成员变量传递给DrawRectangle()?有没有其他方式?