2019独角兽企业重金招聘Python工程师标准>>>

ClientToScreen( )是把窗口坐标转换为屏幕坐标

pWnd->GetWindowRect(&rc);是获取整个窗体的大小
pWnd->GetClientRect(&rc1);是获取窗体中客户区的大小
ScreenToClient( )是把屏幕坐标转换为窗口坐标
屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗口用户区左上角的
VC下,有些函数使用窗口坐标,有些使用屏幕坐标,使用时要分清。


一个窗体分为两部分:系统区和客户区
象标题和菜单之类的是系统区,由系统来控制,客户区就是你的地盘喽!!!
Width, Height 是指整体的,ClientWidth, ClientHeight是指客户区的,两者相减就是
系统区的啦!!!
ClientToScreen是把坐标从当前窗体转化成全屏幕的!!!
ScreenToClient是把屏幕坐标转化成相对当前窗体的坐标!!!!
在MFC对话框程序中,如果要获得对话框中某个控件相对于屏幕的rect,必须为这个控件定义一个控件变量,然后通过该控件变量调用ClientToScreen。
如果在Dialog类里面直接调ClientToScreen,那么获得的是该Dialog窗体左上角rect大小的一块 空间 相对于屏幕的rect。
[cpp] view plain copy print ?
  1. point
  2. 是相对CLYHchxuView(暂时理解为屏幕)的坐标
  3. 如果你要获的是相对CLYHchxuView左上角的坐标
  4. 就不需要转换
  5. 如果你你要获的是相对程序主窗口左上角的坐标
  6. 可以这样算
  7. void CLYHchxuView::OnLButtonDblClk(UINT nFlags, CPoint point)
  8. {
  9. // TODO: Add your message handler code here and/or call default
  10. CRect rc;
  11. GetParent()->GetWindowRect(&rc);
  12. ClientToScreen(&point);
  13. docx=point.x-rc.left;
  14. docy=point.y-rc.top;
  15. Invalidate();
  16. CView::OnLButtonDblClk(nFlags, point);
  17. }
point
是相对CLYHchxuView(暂时理解为屏幕)的坐标
如果你要获的是相对CLYHchxuView左上角的坐标
就不需要转换
如果你你要获的是相对程序主窗口左上角的坐标
可以这样算
void CLYHchxuView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default CRect rc;
GetParent()->GetWindowRect(&rc);
ClientToScreen(&point);
docx=point.x-rc.left;
docy=point.y-rc.top;
Invalidate();
CView::OnLButtonDblClk(nFlags, point);
}

现在来看看Invalidate(TRUE)都干了些什么。其实,它只是间接向消息队列添加了 WM_ERASEBKGND 和WM_PAINT两个消息。但是,如果使用Invalidate(FALSE)的话,则只有WM_PAINT消息产生,这时是不会有任何闪烁的

现在看来,闪烁似乎是由WM_ERASEBKGND消息产生的,事实上,的确与它有关。那WM_ERASEBKGND有干了什么呢?WM_ERASEBKGND消息由OnEraseBkgnd()消息处理函数响应,它的作用就是重绘客户区背景。我们可以通过向工程里添加WM_ERASEBKGND这个消息,然后在重写的消息处理函数中将返回语句修改为return TRUE来屏蔽这一功能,这样做的好处是这时不会重绘背景了,坏处是这时背景也不会被擦出来。

好像还没有说到真实原因,其实真正的原因就隐含在其中。现在来做一个实验,分别尝试一下快速的眨眼和慢速的眨眼,你会发现快速眨眼时我们会感觉眼前的黑色一闪而过,而慢速眨眼时,则会觉得整个过程是连续的,没有什么异样。其实闪烁也就是这么回事,即多张不连续图像的快速切换。这里有三个条件,多张和快速和不连续,而且需要同时具备才会发生闪烁。如果只是两张,只会感觉到突变,还谈不上闪烁;如果频率慢的话,也相当于两张图像的情况了;最后如果是连续图像的话,那就像是看电影,平稳的过渡也不会让人觉得不适。

知道了这些,接下来就可以做决策了。

解决方案:

使用Invalidate(FALSE),添加WM_ERASEBKGND消息处理函数或者局部刷新三者选其一,都是可以解决问题的。它们的都是通过除去图像不连续这一因素来达到目的的。

另外,要说的是GDI的BitBlt()函数是及其高效的,一次操作所需要的时间只有几到十几个微秒,所以我们可以放心的使用它,而不用担心任何效率问题。不过相对于BitBlt()来说StretchBlt()就要慢的多,大概是几十倍的差别。

还有就是一般的绘图工作都是先绘制在一个缓冲区上,然后再一次拷贝到屏幕上。

有时,当我们需要利用闪烁的效果的话,也是可以通过多张图像的快速切换来做到,在这里我们也将两张图像的重复切换理解为多张图像。

转载于:https://my.oschina.net/u/1024767/blog/351281

ClientToScreen ()与 ScreenToClient()相关推荐

  1. MFC ClientToScreen 和 ScreenToClient

       ClientToScreen( )是把窗口坐标转换为屏幕坐标  ScreenToClient( )是把屏幕坐标转换为窗口坐标  屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗口用户区左上角的 ...

  2. ClientToScreen 和ScreenToClient 及绘图

    http://blog.csdn.net/ljh0600301217/article/details/8736494 ClientToScreen( )是把窗口坐标转换为屏幕坐标 pWnd->G ...

  3. ClientToScreen( )和ScreenToClient( )区别

    ClientToScreen( )是把窗口坐标转换为屏幕坐标 ScreenToClient( )是把屏幕坐标转换为窗口坐标 屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗口用户区左上角的 VC下, ...

  4. (转载博文)VC++API速查

    窗口处理 2.1 窗口简介 2.2.1 创建普通窗口(CreateWindow.CreateWindowEx) 2.2.2 关闭窗口(CloseWindow) 2.2.3 销毁窗口(DestroyWi ...

  5. 【2012年终总结】之一 opencv + ds采集摄像头视频 MFC点点滴滴

    1.MFC单文档多文档程序 不让MFC来更新菜单 1 在CMainFrame::CMainFrame中添加 2 3 m_bAutoMenuEnable = FALSE; 标题栏图标的更改 1 //cu ...

  6. 第05章 图形基础

    图形设备接口(GDI:Graphics Device Interface)是Windows的子系统,它负责在视讯显示器和打印机上显示图形.正如您所认为的那样,GDI是Windows非常重要的部分.不只 ...

  7. MFC函数书本速查 API函数大全

    基础类 CObject AssertValid p3 Dump p3 IsSerializable p4 Serializable p4 GetRuntimeClass p4 IsKindOf p5 ...

  8. 循序渐进全球化 镜像识别

    循序渐进全球化 镜像识别 本页内容 概述和说明 示例 Win32 中的镜像 镜像 .NET Framework 网页中的镜像 概述和说明 对 于从右向左 (RTL) 的语言,不但文本对齐和文本阅读顺序 ...

  9. MFC利用定时器实现图片移动

    (1)在窗口中放入Picture Static控件,并设置控件图片属性为Bitmap,如图所示 (2)插入资源图片 选择Resource视图,插入需要的加载的图片资源. (3)设置需要显示的图片 HB ...

  10. QT源码拾贝6-11(qwindowswindow)

    目录 6  窗口激活相关的函数QWindowsForeignWindow::setParent 7  QDebug运算符<<重载 8  vscode的windows的变量提示很有意思 9  ...

最新文章

  1. 使用IntelliJ IDEA 15和Maven创建Java Web项目
  2. 如何用阿里云实行全链路数据追踪
  3. DeepID1 分析
  4. npm 报错: npm ERR! code ERESOLVE , npm ERR! code E404
  5. tensorflow2.1学习--tf.keras学习之tf.keras.models.Sequential
  6. count(*) 的实现方式
  7. R语言自然语言处理:关键词提取(TF-IDF)
  8. 3 EDA技术实用教程 【基础知识1】
  9. 计算机科学导论整理知识点,计算机科学导论教程重点
  10. html加载gif动画效果,html – 使用CSS动画加载图像VS使用GIF图像加载
  11. 手机IMSI号码编码规则表
  12. 首批列入民族网游工程的21种游戏公布
  13. 线性定常系统的离散化
  14. SQL Server中查询累计和与滑动平均值
  15. oss 私有云访问 获取临时图片地址
  16. Sqoop--全量/增量、导入/导出
  17. 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知
  18. Ceph分布式存储实战:从0搭建一个存储集群,并把块设备镜像映射到CentOS 7系统上的步骤
  19. pyQt怎样设置窗口标题、图标
  20. 池州学院数学与计算机足球队,池州学院数学与计算机科学系.ppt

热门文章

  1. js实现网页中简体与繁体互转
  2. 如何使用Steam在线播放游戏
  3. python合并多个excel工作簿_python多个excel文件合并成一个sheet
  4. loadrunner+fiddler代理录制
  5. Python爬虫 之 破解 cookie 代理 验证码 实战
  6. 腾讯往届笔试面试题整理大全
  7. 基于Dx11写一个自己的游戏引擎--1
  8. 电容补偿柜容量计算发放
  9. [Asp.Net WebApi]WebApi入门
  10. 苹果iOS捷径(快捷指令)自动填写表单