MFC类实现,求释疑! 本帖最后由 shb8845369 于 2013-01-30 08:48:23 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用cpen然后用dc::selectobject 问题1: 总是不变就在构造函数中,如果需要保存,就写在Serialize,保存到文件。问题2:Get/Set 好,结构清晰,谁用的东西谁管理。 CDocument/CView/CFrameWnd是三口组,因为想在画图之前通过菜单栏或者工具栏修改CRectangle类的画笔和画刷数据,涉及到菜单栏和数据的交互,Serialize函数只是保存通过菜单栏修改后的数据,而且每画一次都需要更新链表,感觉初始化放在Serialize并不合适。关注点在数据的交互更新,而不是数据更新后的保存过程。 那就没什么好纠结的啊。初始化可以定义一个默认的(不定义也可以,当然画图的时候需要做些判断),然后通过Get/Set改值就好了。画笔和画刷是每个CRectangle的属性,跟链表也没多大关系啊。如果你意在让链表中的所有元素都用同一个画笔和画刷。那就让画刷和画笔变成CDocument的属性。 其实你需要搞清楚的问题很多1,MFC文档视图框架中,程序运行之初执行了哪些函数;实际框架都为你准备好了,你只要写入代码既可2 document中存放数据的成员变量,比如CObjectList m_objList;或者CObjectArray中存入矩形CRectangle,矩形要支持 DECLARE_SERIAL ,实现Serialize 让对象自己读/写自己, 自己画自己,文档类中只需要m_objList.Serialize(ar),你提供的CRectangle显然不具备以上功能3 你的链表类CObjectList 或者CObjectArayr或者CArray或自定义的如果没有提供序列化元素的函数,你要写帮助器器函数4 清场工作,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 其它的都是小菜 这是我改进的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);} 确实和链表没一点关系,只是走访链表的时候需要判断一下形状类型,然后调用相应类的绘制函数就可以了。既然自己画自己,在画之前,画刷和画笔变量应该和菜单栏的保持一致。如果我构造函数中不初始化它们,鼠标作图前,我又该在哪设置这些变量,难道是将CMyDocument当前跟踪的画笔和画刷成员变量传递给DrawRectangle()?有没有其他方式? 如何解决vc2008中"无法解析的外部符号:___CxxFrameHandler3" 遇到一个诡异的程序,高手帮着看下。 执行存储过程错误 winpcap怎么监听虚拟网卡 用纯dll实现多语言界面的SDI程序,询问是否保存文件的对话框怎么只显示按钮没有显示文字啊? ADO 的Execute insert into 语句的问题 文件的格式读写 老菜鸟求助 摄像头做触摸屏高手研究下 怎样读写ini文件 MFC类实现,求释疑! VC编译提示这样怎么办?
然后用dc::selectobject
问题2:Get/Set 好,结构清晰,谁用的东西谁管理。
那就没什么好纠结的啊。初始化可以定义一个默认的(不定义也可以,当然画图的时候需要做些判断),然后通过Get/Set改值就好了。
画笔和画刷是每个CRectangle的属性,跟链表也没多大关系啊。
如果你意在让链表中的所有元素都用同一个画笔和画刷。那就让画刷和画笔变成CDocument的属性。
1,MFC文档视图框架中,程序运行之初执行了哪些函数;
实际框架都为你准备好了,你只要写入代码既可2 document中存放数据的成员变量,比如CObjectList m_objList;或者CObjectArray
中存入矩形CRectangle,矩形要支持 DECLARE_SERIAL ,实现Serialize
让对象自己读/写自己, 自己画自己,
文档类中只需要m_objList.Serialize(ar),你提供的CRectangle显然不具备以上功能
3 你的链表类CObjectList 或者CObjectArayr或者CArray或自定义的
如果没有提供序列化元素的函数,你要写帮助器器函数
4 清场工作,
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 其它的都是小菜
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);
}