一个关于MFC中用自己创建的类画图的问题

目标:在一个单文本MFC程序中,创建一个SHAPE基类,派生LINE,RECTANGLE,ELLIPSE类用于画图,在VIEW类的ONDRAW函数中用自己创建的类画图。问... 目标:在一个单文本MFC程序中,创建一个SHAPE基类,派生LINE,RECTANGLE,ELLIPSE类用于画图,在VIEW类的ONDRAW函数中用自己创建的类画图。

题:我创建好了4个类,想在类中获得设备上下文来画图(比如在line 类中创建一个CDC*
pDC来画图),但在自己类中pDC=GetDC()要参数,我该怎么填参数?(我试过将pDC设为公有,在view类中用pLine->
pDC=this->GetDC();编译不会出错,但运行时会出错)我该怎么在自己的类中获得程序的设备上下文?
PS:是否有其它的方法使我可以在自己的类中画图,并在VIEW类的ONDRAW()函数中用自己创建的类画图?
展开
 我来答
布列瑟农s狼
2013-11-28 · TA获得超过226个赞
知道小有建树答主
回答量:130
采纳率:0%
帮助的人:128万
展开全部
你的图形应该是存储在CView中的,比如CView有个成员CShape* m_shape; 然后再CView中调用shape的Draw函数,Draw函数有个CDC*的参数,m_shape->Draw(CDC* pDC),所以只要在CView中获取CDC在作为参数传给Draw函数就可以了,CView中直接GetDC就可以了
追问
好吧,这样的确成功了。(我脑残了。。。。)
不过老师给的shape基类的纯虚函数draw是没有参数的(virtual void draw() = 0;)还有办法吗?
追答
如果基类不能动的话暂时想不到其他办法,一开始也想到2楼的方法,添加一个成员CDC*,但是既然CShape的构造函数都不带CDC*参数,派生类也不好带了。我之前跟你说的方法是微软经典程序DrawCli的方法,网上可以下到源代码。你要画图,你的类肯定得跟设备环境有交互,你这种完全封闭的CShape很难做到。。
icelbja
2013-11-28 · TA获得超过138个赞
知道小有建树答主
回答量:180
采纳率:100%
帮助的人:151万
展开全部
你的类可以增加一个CDC* m_pDC成员变量,用构造函数把m_DC=pDC嘛,其实在你的里里也可以获得pDC的好像是pDC=CDC::GetDC()把。你所说的运行出错那肯定是访问了空指针,你可以打断点调试 看哪个指针没有获得值。
追问
“构造函数把m_DC=pDC"这句话是什么意思?没懂,还有好像没有CDC::GetDC().另我修改了没赋值的指针成功运行了,但运行到调用我类里的DRAW函数中pDC->MoveTo(x1,y1)时出错了。我找了下,发现获得的pDC指向0x00385e50但我看Viewd OnDraw中pDC指向0x0012f348,是怎么回事?
追答
pDC是指向CDC的一个指针,GetDC()的本质是new一个CDC对象,你每次new的对象地址肯定是不一样的嘛,所以你的pDC指针不一样是可以理解的。我的意思是说你可以在MFC类里得到pDC然后通过你的绘图类的构造函数把pDC赋值给你的绘图类的成员变量m_pDC,如果不用构造函数去赋值也可以添加一个setCDC()的函数去赋值,或者马虎点把m_pDC设置为公有成员就可以直接赋值。总之这个pDC保存在你的绘图类里。在里的类里用m_pDC->Move();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
归悦欣cf
2013-11-28 · TA获得超过1443个赞
知道大有可为答主
回答量:4250
采纳率:59%
帮助的人:1318万
展开全部
前面那位说得对。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式