CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  图形处理/算法

如何将所绘制图形保留在窗口上?

楼主jkxshao(shaojin)2003-08-04 17:55:22 在 VC/MFC / 图形处理/算法 提问

我在绘制一个图形后,改变窗口的大小或移动窗口,则图形就不见了,这是什么原因,应该怎样才能避免呢? 问题点数:0、回复次数:5Top

1 楼wangjinwang(王者之疯)回复于 2003-08-04 18:15:07 得分 0

把绘图的代码放在OnDraw()中  
  这样当变化发生时,系统自动调用OnDraw重新绘图  
  Top

2 楼autfx(边城浪子)回复于 2003-08-04 23:10:22 得分 0

我也有这个问题,如果我程序是一个动画演示程序怎么半呢?Top

3 楼lygfqy(风清扬)回复于 2003-08-04 23:14:24 得分 0

这是因为窗口收到WM_PAINT   消息,开始重绘窗口,要是想保持,就在WM_PAINT消息中绘制图形啊  
  这样每次刷新得时候,图象就被重新绘制在窗口中了Top

4 楼yjh8047(寒江飞鸿)回复于 2003-08-05 18:25:29 得分 0

//   以下是我编的一个简单的动画演示程序,假定在视图类CDrawView(继承CView)  
  //   的实例上绘制一个矩形,当你的鼠标在视图上移动,该矩形就会向右移动,  
  //   移动过程中不会影响背景位图,当你按下鼠标左键时,矩形就复原到初始位置,  
  //   而且OnDraw函数保证了图形的重绘,不会因改变窗口而图形消失  
  //   声明如下(DrawView.h):  
   
  class   CDrawView   :   public   CView  
  {  
  //   Construction  
  public:  
  CDrawView();  
  DECLARE_DYNCREATE(CDrawView)  
   
  //   Attributes  
  public:  
  CDC   m_dcBack; //   存放背景的DC,用于刷新背景,保持背景不变  
  CDC   m_dcMemory; //   内存DC,画图时先画在该内存DC上  
  CBitmap   m_Bitmap1; //   将被选入背景DC的位图  
  CBitmap   m_Bitmap2; //   将被选入内存DC的位图  
  int   m_nBmpWidth; //   位图宽度,根据你加入的背景位图的实际宽度给定  
  int   m_nBmpHeight; //   位图高度,根据你加入的背景位图的实际宽度给定  
  int   m_nX; //   矩形的水平位置,可在CDrawView()中给定初始值  
  int   m_nY; //   矩形的竖直位置,可在CDrawView()中给定初始值  
  int   m_nRectWidth; //   矩形宽度,可在CDrawView()中给定初始值  
   
  //   Operations  
  public:  
  void   DrawRect();  
  virtual   void   OnDraw(CDC*   pDC); //   重载重绘函数  
  afx_msg   int   OnCreate(LPCREATESTRUCT   lpCreateStruct); //   重载OnCreate函数  
  afx_msg   void   OnMouseMove(UINT   nFlags,   CPoint   point);  
  afx_msg   void   OnLButtonDown(UINT   nFlags,   CPoint   point);  
  ...  
  DECLARE_MESSAGE_MAP()  
  }  
   
  //定义如下:(DrawView.cpp)  
   
  CDrawView::CDrawView()  
  {  
  m_nBmpWidth   =   621;  
  m_nBmpHeight   =   403;  
  m_nX   =   10;  
  m_nY   =   190;  
  m_nRectWidth   =   20;  
  }  
   
  int   CDrawView::OnCreate(LPCREATESTRUCT   lpCreateStruct)   //   载入时初始化DC和位图  
  {  
  if   (CView::OnCreate(lpCreateStruct)   ==   -1)  
  return   -1;  
   
  CPaintDC   dc(this);  
  m_Bitmap1.LoadBitmap(IDB_BITMAP1);     //   假定你加入资源的背景位图的ID是IDB_BITMAP1  
  m_Bitmap2.LoadBitmap(IDB_BITMAP1);  
  m_dcBack.CreateCompatibleDC(&dc);  
  m_dcMemory.CreateCompatibleDC(&dc);  
  m_dcBack.SelectObject(&m_Bitmap1);  
  m_dcMemory.SelectObject(&m_Bitmap2); //   将m_Bitmap选入m_dcMemory后,  
  //   在m_dcMemory上画图,就是画在了m_Bitmap2上  
  m_dcMemory.SelectStockObject(NULL_BRUSH); //   画矩形为空心  
  DrawRect();  
   
  return   0;  
  }  
   
  void   CDrawView::OnDraw(CDC*   pDC)  
  {  
  CDrawDoc*   pDoc   =   GetDocument();  
  ASSERT_VALID(pDoc);  
   
  pDC->BitBlt(0,0,m_nBmpWidth,m_nBmpHeight,&m_dcMemory,0,0,SRCCOPY);    
  //将内存DC中的位图画在屏幕上  
  }  
   
  void   CDrawView::DrawRect()  
  {  
  CPen   pen(PS_SOLID,   1,   RGB(255,0,0)); //   该参数你可随意定  
  CPen   *pOldPen   =   m_dcMemory.SelectObject(&pen);  
  m_dcMemory.Rectangle(m_nX,m_nY,m_nX+m_nRectWidth,m_nY+m_nRectWidth);  
  //   画矩形  
  m_dcMemory.SelectObject(pOldPen);  
  Invalidate(FALSE); //   更新视图,执行OnDraw()  
  }  
   
  void   CDrawView::OnMouseMove(UINT   nFlags,   CPoint   point)    
  {  
  m_dcMemory.BitBlt(m_nX,m_nY,m_nRectWidth,m_nRectWidth,  
  &m_dcBack,m_nX,m_nY,SRCCOPY); //   擦去当前矩形  
  m_nX   +=   2; //   矩形右移  
  DrawRect(); //   再画矩形并更新屏幕  
   
  CView::OnMouseMove(nFlags,   point);  
  }  
   
  void   CDrawView::OnLButtonDown(UINT   nFlags,   CPoint   point)  
  {  
  m_dcMemory.BitBlt(m_nX,m_nY,m_nRectWidth,m_nRectWidth,  
  &m_dcBack,m_nX,m_nY,SRCCOPY); //   擦去当前矩形  
  m_nX   =   10; //   矩形复位  
  DrawRect(); //   再画矩形并更新屏幕  
   
  CView::OnLButtonDown(nFlags,   point);  
  }Top

5 楼newer3(恐龙世纪)回复于 2003-08-05 20:29:40 得分 0

你的DRAWRECT()无法保证会到原始位置,当然,你设定了他,  
  似乎保寸一个RECT变量,/CDC   成员变量,就可以了吧?Top

相关问题

  • 如何在窗口中绘制图形?
  • 绘制矢量图形
  • 使用JScript如何绘制图形???
  • 一个MFC绘制图形的问题
  • 怎么样使画出来的图形保留在窗口里不用重绘
  • 如何能够在MFC的程序中 , 改变窗口大小时 , 使窗口内绘制的图形没有闪烁感?
  • 窗口绘制的问题
  • 窗口绘制问题
  • 关于 2进制 文件的读写 和 图形的绘制
  • STATIC控件中绘制图形的问题

关键词

  • 图形
  • 矩形
  • 内存
  • 移动
  • dc
  • 绘制
  • cdrawview
  • 背景
  • 宽度
  • ondraw

得分解答快速导航

  • 帖主:jkxshao

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo