点击按钮在视图上画图

小新蜡笔 2012-12-27 04:22:54
我在OnDraw函数中去画了一个图形,但是这种缺陷是每次程序启动的时候都会有图像。我自定义了一个工具对话框来对图形进行修改参数。现在我想通过点击按钮的方法来通知View来重画。而不是每次程序启动就直接画了。问:如果不在OnDraw中调用绘图方法,那该在哪里调用?
是否需要对点击按钮来进行发送消息?
如果有高人,请指点。
...全文
259 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tly3068 2014-06-19
  • 打赏
  • 举报
回复
我没看明白,楼主要是研究出来了,求一份详细代码。万分感谢
小新蜡笔 2012-12-28
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
“但是现在我获取不到视图的指针” 在对话框中使用: MFC SDI :几个 取类 函数: // CMainFrame *pMain=(CMainFrame *)theApp.m_pMainWnd; CXXXView *pView=(CShowFontView *)pMain->GetActiveView( ); CXXXDoc *pDoc=(CShowFont……
嗯。这个方法可行,我试过了。很谢谢你
schlafenhamster 2012-12-28
  • 打赏
  • 举报
回复
“但是现在我获取不到视图的指针” 在对话框中使用: MFC SDI :几个 取类 函数: // CMainFrame *pMain=(CMainFrame *)theApp.m_pMainWnd; CXXXView *pView=(CShowFontView *)pMain->GetActiveView( ); CXXXDoc *pDoc=(CShowFontDoc *)pMain->GetActiveDocument( ); // CMainFrame *pWnd=(CMainFrame*)AfxGetApp()->m_pMainWnd;
小新蜡笔 2012-12-28
  • 打赏
  • 举报
回复
引用 7 楼 tiger9991 的回复:
那我们上面讲的都白讲了? 你视图里面的: OnDraw(CDC * pDC) { ..... if(bflag_button) //按钮控制这个全局变量,TRUE就画,FALSE就不画,初始化False { //画的内容 } }
没白讲,只不过我脑子里的CPU转速比较慢而已 刚起步,都待吸收。
傻X 2012-12-28
  • 打赏
  • 举报
回复
那我们上面讲的都白讲了? 你视图里面的: OnDraw(CDC * pDC) { ..... if(bflag_button) //按钮控制这个全局变量,TRUE就画,FALSE就不画,初始化False { //画的内容 } }
小新蜡笔 2012-12-28
  • 打赏
  • 举报
回复
引用 4 楼 tiger9991 的回复:
那你按钮在哪里? 最基本的方法就是视图初始化的时候SendMessage给MainFrame把。 MainFrame中自己建立一个CView或该View类型的指针接收下就可以了
就是我做了一个浮动窗,修改一些参数可以在视图上画图,现在是我打开窗口的时候就会画图,我想通过点击按钮的时候让它画,而不是初始化对话框的时候就去画了。
lgstudyvc 2012-12-28
  • 打赏
  • 举报
回复
点击里控制什么情况使用OnDraw
傻X 2012-12-28
  • 打赏
  • 举报
回复
那你按钮在哪里? 最基本的方法就是视图初始化的时候SendMessage给MainFrame把。 MainFrame中自己建立一个CView或该View类型的指针接收下就可以了
小新蜡笔 2012-12-28
  • 打赏
  • 举报
回复
引用 1 楼 tiger9991 的回复:
放在OnDraw里面是保证每次窗体因为其他元素而改变的时候,需要重新绘制。 你按钮里面可以改变某个全局变量,该全局变量控制OnDraw里面的绘制。 用Invalidate可以控制重新触发OnDraw
那么请问如何点击按钮告诉视图重画呢?Invalidate我知道,但是现在我获取不到视图的指针,没法告诉啊
Eleven 2012-12-27
  • 打赏
  • 举报
回复
你通过一个标记去控制不就行了。
傻X 2012-12-27
  • 打赏
  • 举报
回复
放在OnDraw里面是保证每次窗体因为其他元素而改变的时候,需要重新绘制。 你按钮里面可以改变某个全局变量,该全局变量控制OnDraw里面的绘制。 用Invalidate可以控制重新触发OnDraw
最近做了一个类似Windows画图板的小程序,拿来和大家分享一下。功能和界面全部模仿于Windows自带的画图板,界面如截图。功能主要有: 手绘线、简单图形、文字输入、图块拖放、重复撤销、画面缩放、打开保存图片文件,另外为了直接从数据库或者XML中存取图片,另外还提供了从Base64编码存取图片的接口,其他还实现了和画图板同样效果的工具箱及颜料盒。 1、 绘图: 绘制功能主要在OnLButtonDown、OnMouseMove、OnLButtonUp中实现,根据当前选择的工具和工具的样式进行绘制。程序中每种工具的绘制都是通过一个图元对象实现,比如钢笔、画刷因为本质上都是手绘线所以都通过CDrawPen来实现、直线和矩形等都通过CDrawShape来实现,所有的图元对象都放在文件DrawObject.h中,具体的实现请参见代码。 另外为了避免屏幕的闪烁,程序中做了两个处理:一、把视图自己的重绘背景代码屏蔽掉,即响应视图的WM_ERASEBKGND消息,直接返回TRUE,并在Ondraw中程序自己绘制背景就可以了;二,在Ondraw中绘制的时候,先绘制到内存DC中,然后再贴回视图的DC。这样就基本上就可以避免屏幕的闪烁了。 2、 撤销重做: 由于整个程序较为简单,就没有采用把动作记录下来的方式,只是采取了一个较简单的方法,在每当一个图元绘制动作结束时就把画布的内容存到bmp中以备撤销,这些历史画面存放在一个bmp数组中,并定义了一个Stack类来管理该数组(此实现方式参考了在线杂志21期《类似画笔的绘图控件-卫琳》,在此表示感谢!),然后在屏幕上绘制的时候就是把当前位图贴到屏幕上,并把还没存取位图的图元绘上就行了。 3、 缩放: 一般视图缩放的实现是通过DC的两个函数来实现:SetViewportExt和SetWindowExt,但是这两个函数只在MM_ISOTROPIC和MM_ANISOTROPIC这两种映射模式下有效果,而常用的带滚动条的视图类CScrollView却不支持这两种模式(参见CScrollView::SetScrollSizes)的实现。所以只好把MFC的CScrollView的代码拿过来改了一下以支持MM_ISOTROPIC映射模式,如下所示,具体参见程序文件“ADMMScrollView.h”: ::SetMapMode(hdc,MM_ISOTROPIC); int XLogMm = ::GetDeviceCaps(hdc, HORZSIZE); int YLogMm = ::GetDeviceCaps(hdc, VERTSIZE); int XLogPix = ::GetDeviceCaps(hdc, HORZRES); int YLogPix = ::GetDeviceCaps(hdc, VERTRES); ::SetWindowExtEx(hdc,XLogMm*100,YLogMm*100,NULL); ::SetViewportExtEx(hdc,(int)(XLogPix*fZoomScale), (int)(YLogPix*fZoomScale),NULL); 4、 工具箱: 首先为了实现工具箱的按钮分两列显示的效果,需要设置一下按钮的TBBS_WRAPPED,参见程序中的CToolPaletteBar类;然后,选择不同工具时展现出工具的样式,比如选择“直线”时列出可用的直线宽度样式,该功能通过在ToolBar上放一个CListCtrl实现,当前的工具样式通过图标的方式展现,效果和画图板的类似。 5、 颜料盒: 从CDialogBar类继承了一个类,然后在WM_PAINT响应函数里面绘制一个个小颜色矩形,并重写其OnLButtonDown、OnRButtonDown、OnLButtonDblClk来和用户交互,实现出来的效果还不错,看上去和画图板的颜料盒一样。 6、 鼠标光标样式: 首先在资源文件中增加需要的光标资源,然后在视图的OnSetCursor消息函数中调用SetCursor函数来设置光标样式就可以了,注意要判断HitTest参数是否为HTCLIENT,不然的话鼠标移到了滚动条上的时候光标还是画笔的样式就让人觉得怪怪的了。

15,979

社区成员

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

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