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. Python3中生成器介绍
  2. kafka与zookeeper关系
  3. 如何将sql查询出的结果,用符号隔开
  4. win32 debug api 原理
  5. 17. javacript高级程序设计-错误处理与调试
  6. objective-c 方法加号(+) 减号(-)
  7. file的open()和read()
  8. 2021-04-15 深入理解SLAM技术 【2】 SLAM的框架
  9. kerberos安装配置、配置kerberos server、client、日常操作与常见问题、卸载kerberos、hive整合kerberos
  10. VS2010-MFC(文档、视图和框架:分割窗口)
  11. 【HDU - 1698】 Just a Hook(线段树模板 区间覆盖更新(laz标记) + 区间和查询 )
  12. Adidas、金拱门、KFC、乐天玛特,零售巨头的选址秘诀都在数据里了
  13. PyCharm无法找到已安装的Python类库的解决方法
  14. C++ 编写WebService服务
  15. python构建带数字的古诗词数据集
  16. XRD格式转换 神器
  17. html词云图生成,图悦在线词云图制作工具
  18. nar神经网络_基于神经网络的预测模型
  19. 连接跟踪子系统之helper
  20. [ZT]调侃、反讥与诡辩

热门文章

  1. 三相PWM整流器dq解耦控制
  2. Overfeat论文笔记
  3. JAVA练习——蝴蝶效应
  4. 结构设计到项目管理:工程师是怎么练成的.
  5. 打通C到B,“能者多劳”的小冰
  6. 数据连接池的工作原理
  7. excel粘贴时出现故障_Excel常见问题及解决办法汇总
  8. redis文档api以及SpringBoot集成操作
  9. 一次简单的软件系统培训计划安排
  10. 现代电力系统分析王锡凡pdf_一对一论文定制 | 电子工程:电力系统潮流及最优潮流算法研究...