一个小问题

简介:
 昨天写一个简单的画图程序,遇到一个奇怪的问题,目的是想点鼠标左键,画个以此点为中心画个椭圆,最初的代码如下:

void CE02View::OnLButtonDown(UINT nFlags, CPoint point)
{
      CPaintDC dc(this);
      OnPrepareDC(&dc);
      if(this->m_nColor==GRAY_BRUSH)
      {
           this->m_nColor = WHITE_BRUSH;
      }
      else
      {
           this->m_nColor=GRAY_BRUSH;
      }
      this->m_rectEllipse.left=point.x/2;
      this->m_rectEllipse.right = point.x+point.x/2;
      this->m_rectEllipse.top = point.y+point.y/2;
      this->m_rectEllipse.bottom = point.y/2;
      this->OnDraw(&dc);
      CView::OnLButtonDown(nFlags, point);
}

void CE02View::OnDraw(CDC* pDC)
{   
      CE02Doc* pDoc = GetDocument();
      ASSERT_VALID(pDoc);
      pDC->SelectStockObject(this->m_nColor);
      pDC->Ellipse(this->m_rectEllipse);
}
并且也考虑了第一次运行时会发出WM_PAINT事件,而在OnPaint方法里会去调用OnDraw(),所以我把OnPaint重写了,让其不调用OnDraw,这样第一次运行就不会去画了。

void CE02View::OnPaint()
{
      CPaintDC dc(this); // device context for painting
}

可尽管这样,点击鼠标左键还是无法画出东西来,问了下师兄,他也不熟悉VC,弄了一会儿也无功而返,今天想了下可能是DC有问题,换了个CClientDC,唉,好了,真是怪了,用CPaintDC我是想模仿这OnPaint()的代码来写,按道理说应该可以的,可为什么在OnLButtonDown里就不行呢?最后可以运行的代码如下:

void CE02View::OnLButtonDown(UINT nFlags, CPoint point)
{
      CClientDC dc(this);
    OnPrepareDC(&dc);
      if(this->m_nColor==GRAY_BRUSH)
      {
           this->m_nColor = WHITE_BRUSH;
      }
      else
      {
           this->m_nColor=GRAY_BRUSH;
      }
      this->m_rectEllipse.left=point.x/2;
      this->m_rectEllipse.right = point.x+point.x/2;
      this->m_rectEllipse.top = point.y+point.y/2;
      this->m_rectEllipse.bottom = point.y/2;
      this->OnDraw(&dc);
      CView::OnLButtonDown(nFlags, point);
}


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2007/06/09/777508.html,如需转载请自行联系原作者
目录
相关文章
|
缓存 网络协议 安全
|
Linux Docker Python
Alpine Linux详解
Alpine以其小巧、简单在docker容器中得到了广泛的应用。但是Alpine Linux使用了musl,可能和其他Linux发行版使用的glibc实现会有些不同。这里主要介绍了它的基础用法,但是足以满足日常运维需要。
14933 1
|
安全 关系型数据库 MySQL
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
为什么延迟复制适用于备库数据的紧急恢复?底层原理是什么?
110 0
|
存储 监控
表格存储最佳实践:一种用于存储时间序列数据的表结构设计
在时间序列存储的场景,例如监控数据或者日志数据,通常比较难解决的是写入的问题,传统的数据库难以承载如此大数据量、高并发的写入压力。 表格存储能够提供非常优秀的写入能力,在阿里内部得到到了正好的实践和证明。但是若要发挥其强度的写入能力,需要有一个良好的表结构设计。 本篇文章给出了一个存储时间序
9851 0
|
分布式计算
SparkStreaming中foreachRDD、foreachPartition和foreach 及序列化问题
最近项目遇到报错序列化相关问题,于是把这三个拿出来分析一下,先来看下foreachRDD、foreachPartition和foreach的不同之处。不同主要在于它们的作用范围不同,foreachRDD作用于DStream中每一个时间间隔的RDD,foreachPartition作用于每一个时间间隔的RDD中的每一个partition,foreach作用于每一个时间间隔的RDD中的每一个元素。
3022 0
|
人工智能 自动驾驶 5G
云栖科技评论第48期:前沿科技对世界的改造 我们这代人只完成了1%
我们总是感叹,世界已经被科技改造得面目全非,但真实情况是,我们的前进速度依旧缓慢,只是完成了可能性的1%,甚至可能连1%也达不到。   受制于“沟通壁垒”,许多前沿科技被局限在科技世界,无法对产业世界乃至商业世界产生应有的影响,反之,对科技世界疏于了解导致了产业升级和商业模式变革往往流于形式;在法律世界和自然世界,我们经常会落入“科技威胁论”和“科技伦理学”的陷阱,这进一步限制了科技发挥改善人们的生活和世界的潜力。
2014 0
|
2天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇