MFC绘制图形

企鹅爱吃方便面 2016-12-21 08:05:53
如题,先说说我程序做到哪一步了:

1:程序的界面如图,都已经绘制完成;

2:三个引导页,继承自PropertiesObject,然后收到一个sheet中,引导页绘制完成;

3:绘制图形的展示页面绘制完成:
1:增加事件,点击“绘制逻辑图”按钮,弹出一个对话框;
2:添加了一个MFC类,命名为CPic,继承自CView类;
3:在新类CPic中,改写OnDraw()函数
OnDraw(CDC *pDC)
{pDC->MoveTo(10,100);
pDC->LineTo(0,0);}

4:给按钮增加事件,弹出对话框Pic
OnBnClickedButton1(){
CPic cp;//创建对话框类对象
cp.DoModal();//打开对话框
Invalidate(TRUE);//重绘,更新显示
}


现在说问题:
1:运行程序,主界面的按钮除了“检查可靠性”按钮不可用之外,其余均已增加鼠标单击事件,
最后我在第三步,绘制图形的展示页面中发现并没有出现我所预期的那条线(就是添加进在OnDraw函数中的绘制直线的代码);

这就是现在的问题,另外就是,如果我想在对话框里展示图形(我利用函数产生数据,然后将数据传入绘制图形的代码中,就比如说我想绘制一个矩形,代码写好了,要在点击了某个按钮之后,弹出对话框向我展示),这应该该怎么做?
求各位的指点。
...全文
803 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 17 楼 向立天的回复:
你这个gl是OpenGL么? 你在按钮消息里面处理绘图?
不是,只是一个普通c++类的函数调用
向立天 2016-12-23
  • 打赏
  • 举报
回复
你这个gl是OpenGL么? 你在按钮消息里面处理绘图?
  • 打赏
  • 举报
回复
引用 15 楼 xianglitian 的回复:
运行时出什么问题? 你可以调试一下啊
调试的时候,judge已经被赋值了TRUE,但是gl.road(route_of_city)执行到某个位置的时候,调试窗口的输出显示,无法访问已被释放的对象,但我没有释放指针啊?
向立天 2016-12-23
  • 打赏
  • 举报
回复
运行时出什么问题? 你可以调试一下啊
  • 打赏
  • 举报
回复
引用 13 楼 xianglitian 的回复:
文章中的图谱控件是一个自定义控件 文中也提到了关于自定义控件的使用细节可以参考另一篇文章 http://blog.csdn.net/xianglitian/article/details/6075653
void CDialogTestDlg::OnBnClickedCreate()
{
	// TODO: 在此添加控件通知处理程序代码
	INT_PTR nRes;             // 用于保存DoModal函数的返回值   

	CTipDialog tipDlg;           // 构造对话框类CTipDlg的实例   
	nRes = tipDlg.DoModal();  // 弹出对话框   
	if (IDCANCEL == nRes)     // 判断对话框退出后返回值是否为IDCANCEL,如果是则return,否则继续向下执行   
		return;
	//将相应的控件数据保存到其对应的变量中去
	UpdateData(TRUE);
	//初始化城市列表个数,创建通讯路线
	gl.SetGraphsize(count);

	//创建通讯线路
	bool judge;
	judge = gl.road(route_of_city);
	if (judge == false)
	{
		UpdateData(TRUE);		//刷新数据,使文本框显示无效信息
		INT_PTR nJud;             // 用于保存DoModal函数的返回值
		CTipCheck ctc;				//构造对话框类CTipCheck的实例
		nJud = ctc.DoModal();			//弹出对话框
	}
	else if (judge  == true)
	{
		//用于显示城市数量及路线数
		show_count = count;
		show_route = route_of_city;
		UpdateData(FALSE);
	}
}
能帮忙看一下这段代码有什么问题吗?运行的时候总是出问题。
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903 的回复:
OnDraw 中设置断点,看看执行到没有? 画线 先选入画笔 CPen pen(PS_SOLID, 1, RGB(0,200,0)); CPen *pOldPen = dc.SelectObject(&pen); dc.MoveTo(0, 0); dc.LineTo(200, 200); dc.SelectObject(pOldPen);
设置断点,并没有执行,不知道是什么原因.....
  • 打赏
  • 举报
回复
引用 8 楼 xianglitian 的回复:
[quote=引用 6 楼 ai977313677 的回复:] [quote=引用 5 楼 xianglitian 的回复:] 要么关联控件,要么create 你可以搜些相关资料来看看 比如http://blog.csdn.net/shuaiby/article/details/8537908
实例化的话,我在按钮事件里进行实例化
CPic *c = new CPic(); 
	c->DoModal();
	Invalidate(TRUE);
就像这样就行吧?[/quote] CPic到底是View还是Dialog[/quote] 不好意思不好意思,有些混乱,继承关系是这样的

class CPic : public CDialogEx//CPic,点击“绘制逻辑图”时,弹出该窗口
class CMaintain1Page : public CPropertyPage//三个引导页
class CPaint : public CView//CPaint,用于绘图,改写OnDraw()函数,画条直线,在CMaintain3Page::OnBnClickedButton1()按钮事件中调用绘图,其中CMaintain3Page是最后一个引导页

//CPaint中的OnDraw在按钮事件中调用
void CMaintain3Page::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	//实例化对象
	CPic *c = new CPic(); 
	c->DoModal();
	Invalidate(TRUE);
}
昨晚思维有些乱,不好意思。
向立天 2016-12-22
  • 打赏
  • 举报
回复
引用 6 楼 ai977313677 的回复:
[quote=引用 5 楼 xianglitian 的回复:] 要么关联控件,要么create 你可以搜些相关资料来看看 比如http://blog.csdn.net/shuaiby/article/details/8537908
实例化的话,我在按钮事件里进行实例化
CPic *c = new CPic(); 
	c->DoModal();
	Invalidate(TRUE);
就像这样就行吧?[/quote] CPic到底是View还是Dialog
zgl7903 2016-12-22
  • 打赏
  • 举报
回复
OnDraw 中设置断点,看看执行到没有? 画线 先选入画笔 CPen pen(PS_SOLID, 1, RGB(0,200,0)); CPen *pOldPen = dc.SelectObject(&pen); dc.MoveTo(0, 0); dc.LineTo(200, 200); dc.SelectObject(pOldPen);
向立天 2016-12-22
  • 打赏
  • 举报
回复
文章中的图谱控件是一个自定义控件 文中也提到了关于自定义控件的使用细节可以参考另一篇文章 http://blog.csdn.net/xianglitian/article/details/6075653
  • 打赏
  • 举报
回复
我尝试把你的http://blog.csdn.net/xianglitian/article/details/6100767实现代码贴到我的工程里,我添加了一个继承CWnd的类
class CGraphView : public CWnd
命名为CGraphView,然后代码全部贴进去了,然后我现在想去调用这个,还是说响应这个事件? 我是应该在按钮
void CMaintain3Page::OnBnClickedButton1()
这个里面添加消息处理函数去调用这个画图函数吗? 还是说有其他的方法调用?
向立天 2016-12-22
  • 打赏
  • 举报
回复
你这个确实够乱 首先CDialog里是没有OnDraw函数的 但是有OnPaint函数可以直接重载 你要是自己定义一个OnDraw在里面不主动调用是不会自动调用的 然后你的CPaint我理解是没有意义的 如果就是为了改写View里的OnDraw函数那就更没有必要了 因为View是针对文档视图结构的 极少用在对话框结构中 建议你看看这篇文章,基于其中的原理应该可以符合你的需求,希望对你又帮助 http://blog.csdn.net/xianglitian/article/details/6100767
  • 打赏
  • 举报
回复
引用 5 楼 xianglitian 的回复:
要么关联控件,要么create 你可以搜些相关资料来看看 比如http://blog.csdn.net/shuaiby/article/details/8537908
实例化的话,我在按钮事件里进行实例化
CPic *c = new CPic(); 
	c->DoModal();
	Invalidate(TRUE);
就像这样就行吧?
向立天 2016-12-21
  • 打赏
  • 举报
回复
要么关联控件,要么create 你可以搜些相关资料来看看 比如http://blog.csdn.net/shuaiby/article/details/8537908
  • 打赏
  • 举报
回复
引用 3 楼 xianglitian 的回复:
[quote=引用 2 楼 ai977313677 的回复:] [quote=引用 1 楼 向立天的回复:]你的CPic创建实例了么?
在按钮事件里的CPic cp;不是为这个创建实例吗?[/quote] 是 但是CPic是View,所以还要创建出来[/quote] 那这个怎么创建?不好意思,刚学MFC一天......
向立天 2016-12-21
  • 打赏
  • 举报
回复
引用 2 楼 ai977313677 的回复:
[quote=引用 1 楼 向立天的回复:]你的CPic创建实例了么?
在按钮事件里的CPic cp;不是为这个创建实例吗?[/quote] 是 但是CPic是View,所以还要创建出来
  • 打赏
  • 举报
回复
引用 1 楼 向立天的回复:
你的CPic创建实例了么?
在按钮事件里的CPic cp;不是为这个创建实例吗?
向立天 2016-12-21
  • 打赏
  • 举报
回复
你的CPic创建实例了么?

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧