http://blog.csdn.net/ljh0600301217/article/details/8736494

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 plaincopy
  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. }

现在来看看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()就要慢的多,大概是几十倍的差别。

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

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

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 plaincopy
  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. }

现在来看看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()就要慢的多,大概是几十倍的差别。

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

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

ClientToScreen 和ScreenToClient 及绘图相关推荐

  1. MFC ClientToScreen 和 ScreenToClient

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

  2. ClientToScreen( )和ScreenToClient( )区别

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

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

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

  4. 第05章 图形基础

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 华北赛区,我们来啦!
  2. php 内容自动生成word文档,php生成word文档的例子
  3. python基础教程3-Python基础教程(三)
  4. linux下kvm设备配置,Linux下为KVM 配置桥接设备
  5. 【Python教程】typing模块的作用-提高代码健壮性
  6. 从Java应用程序中消除Null指针异常
  7. python具有伪代码的本质吗_Python的优点之一是具有伪代码的本质。( )_学小易找答案...
  8. 知乎大V推荐!面试官6个灵魂拷问,原理+实战+视频+源码
  9. 午睡还要被骂?新东方旗下公司被曝禁止午休引热议 CEO回应...
  10. 秋凉了,大家别加班了,早回吧:)
  11. python excel案例导入jira_Python操作Jira库常用方法解析
  12. html运行显示无法发布,我无法发表文章当我打开发表文章,总在网页的左下角出现网页发生错误 爱问知识人...
  13. [原]Unity3D深入浅出 - 新版粒子系统 (Shuriken)
  14. 常用31个Java机器学习、深度学习、自然语言处理学习库工具
  15. Python 统计分析--单因素方差分析
  16. 【2023秋招】网易雷火游戏研发工程师笔试
  17. GA-LSTM的国内外研究现状
  18. 机器学习笔记之降维(一)维数灾难
  19. 蓝牙BLE设备连接与通信
  20. S3C4412学习笔记

热门文章

  1. java怎么播放不了声音_JAVA3D播放不出声音的解决办法
  2. Dailymotion 是如何构建混合 Kubernetes 平台的?
  3. opencv python 相机启动慢问题 VideoCapture 感觉c++同理
  4. 2020.09.15丨细菌真菌基因组测序原理
  5. Windows 修改默认下载、安装路径
  6. ubuntu虚拟机使用本机摄像头教程
  7. 电脑非正常关机后无法启动VMware虚拟机的解决方法
  8. 技嘉主板raid组建方法_【技嘉Z170评测】M.2硬盘也能组RAID 技嘉Z170X-UD5评测_技嘉 Z170X-UD5_主板评测-中关村在线...
  9. 环信大学:12306十年填坑路对客户中心智能化变革的启示
  10. VSTO(C#)对Word开发积累