ClientToScreen 和ScreenToClient 用法

GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。 GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。   用GetClientRect返回的RECT结构... 阅读详情

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
  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.   
  11. CRect rc;  
  12. GetParent()->GetWindowRect(&rc);  
  13. ClientToScreen(&point);    
  14. docx=point.x-rc.left;  
  15. docy=point.y-rc.top;  
  16. Invalidate();   
  17. CView::OnLButtonDblClk(nFlags, point);   
  18. }  

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

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

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

屏幕坐标与客户坐标的转换 WIN32  API函数: 1、ClientToScreen 函数:   函数功能:该函数将指定点的用户坐标转换成屏幕坐标。   函数原型:BOOL ClientToScreen(HWND hWnd,LPPOINT lpPoint);   参数:   hWnd :用户区域用于转换的窗口句柄。 注:第二个参数点的坐标是相对于第一个参数(窗口句柄) 阅读详情

相关推荐

【VS开发】ClientToScreen 和ScreenToClient 用法

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

ZhangPY的专栏 1965

ClientToScreen 和ScreenToClient用法

ClientToScreen( )是把窗口坐标转换为屏幕坐标 ScreenToClient( )是把屏幕坐标转换为窗口坐标 屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗口用户区左上角的 VC下,有些函数使用窗口坐标,有些使用屏幕坐标,使用时要分清。 一个窗体分为两部分:系统区和客户区 象标题和菜单之类的是系统区,由系统来控制,客户区就是你的地盘喽!!! Width, Heig

ghevinn欢迎您光临 1万+

PointPainting 复现

三维目标检测

weixin_58207716的博客 4533

GetClientRect、ScreenToClient、GetWindowRect、ClientToScreen、MoveWindow用法总结

函数说明 GetWindowRect 此函数是获取窗体或者控件在屏幕坐标系下的坐标。 若此函数用于窗体初始化函数中,原点位于窗体的左上角; 若此函数在窗体初始化完成之后使用,原点位于屏幕的左上角。 ScreenToClient 此函数是将屏幕坐标转化为客户区坐标。 GetClientRect 此函数是获取窗体或者控件客户区的大小,一般来说,针对窗体还是控件,其获取的Left、Top参数均为0; ClientToScreen 此函数是将客户区坐标转化为屏幕坐标 MoveWindow 针对窗体,使用屏幕坐标;

weixin_43264512的博客 4648

IFRS 9与CECL对比解析:跨国企业财务必须掌握的两种信用损失模型

本文深度解析IFRS 9与CECL两种信用损失模型的差异,帮助跨国企业应对财务合规挑战。从基础架构、数据治理到监管策略,详细对比三阶段模型与单一阶段模型的核心区别,并提供实施双轨制的实务建议,助力企业优化资本管理和税务筹划。

3c4x5z6v7b的博客 668

Android定位权限全解析:从基础配置到后台持续定位的完整解决方案

本文全面解析Android定位权限体系,从基础配置到后台持续定位的完整解决方案。涵盖LocationManager和FusedLocationProviderClient等主流API的对比选型,详细讲解动态权限申请、精确定位与模糊定位的智能切换,以及Android 10+的后台定位适配策略。帮助开发者构建兼顾精准度与电量友好的定位方案,适用于导航、运动轨迹记录等多种场景。

weixin_29310605的博客 605

ClientToScreen 和ScreenToClient 用法 分类: ...

ClientToScreen( )是把窗口坐标转换为屏幕坐标 ScreenToClient( )是把屏幕坐标转换为窗口坐标 屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗口用户区左上角的 VC下,有些函数使用窗口坐标,有些使用屏幕坐标,使用时要分清。 一个窗体分为两部分:系统区和客户区 象标题和菜单之类的是系统区,由系统来控制,客户区就是...

weixin_30505751的博客 252

CANoe/CAPL ,远程邮件通知

CANoe/CAPL ,远程邮件通知

蚂蚁小兵 3036

一.Win32窗口坐标

窗口坐标 指定的窗口大小为600*500 除去左右下的边框 标题栏+客户区大小为592 * 469 1.客户端坐标 RECT rc; GetClientRect(hwnd, &rc); 2.屏幕坐标 RECT rc1; GetWindowRect(hwnd, &rc1); 3.坐标之间的转换 ClientToScreen RECT rc; POINT pi; GetClientRect(hwnd, &rc); pi.x = rc.left; pi.y = rc.top; Clie

Heart的博客 2295

社交媒体文章内容与评论抓取:Python 爬虫实战教程

通过本文的介绍,我们学习了如何使用 Python 编写爬虫,抓取社交媒体平台的文章内容和评论。我们详细介绍了如何使用requestsSelenium和Tweepy等工具,抓取微博和 Twitter 上的公开数据。同时,我们还讨论了如何处理反爬虫机制,避免账号或 IP 被封禁。抓取社交媒体数据是一个充满挑战和乐趣的过程,掌握这些技术后,你可以在大数据分析、情感分析和舆情监测等方面得到更深层次的应用。

2201_76125261的博客 1710

R语言Rstudio突然无法启动且报错:ERROR system error 42 [str: 一, len: 3, from: UTF-8, to: ISO8859-1]...如何解决

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2846

VC的常用函数汇总

SetWindowPos 函数功能:该函数改变一个子窗口,弹出式窗口式顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口。   函数原型:BOOL SetWindowPos(HWN hWnd,HWND hWndlnsertAfter,int X,int Y,int cx,int cy,UNIT.

专注 机器学习+人工智能 1770

Spring 核心技术解析【纯干货版】- I:Spring 基础模块 Spring-Core 模块精讲

Spring-Core 模块,是 Spring 核心容器模块之一。虽然 “Core” 本身就有 “核心的,重要的部分” 的含义,但是它并非是实现(常被我们说为 Spring 核心机制)IOC / AOP 的模块。Spring 中的 IOC 机制,主要来自于 BeanFactory 容器和 ApplicationContext 容器,这二者分别由同为核心容器模块的 Spring-Bean 模块 和 Spring-Context 模块所提供。

栗筝i的博客 2524

ClientToScreen 和ScreenToClient

ClientToScreen( )是把窗口坐标转换为屏幕坐标ScreenToClient( )是把屏幕坐标转换为窗口坐标屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗口用户区左上角的VC下,有些函数使用窗口坐标,有些使用屏幕坐标,使用时要分清。一个窗体分为两部分:系统区和客户区象标题和菜单之类的是系统区,由系统来控制,客户区就是你的地盘喽!!!Width, Height 是指整体的,Clien...

weixin_33981932的博客 479

迟滞比较器原理及计算

为什么要用迟滞比较器 在讲迟滞比较器之前,我们先看一个案例。 在产品设计中常常需要用到电机,而电机在从运转到停止过程中需要泄放能量,这种能量大部分以电压的形式反馈回电源母线(Vbus)导致Vbus母线电压升高,特别是功率大又转速快的电机需要急刹时,产生的反馈电压更高,严重时可能导致母线上其他器件的损坏。 为了防止将电机反馈的能量泄放掉,我们需要设计一个电路来检测母线电压,当母线电压高于某一安全阈值时,打开MOSFET Q1将母线上的能量通过电阻R5以热的形式消耗掉。 假如用一般的比较器,设计如下: Vbu

sinat_15677011的博客 2万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VC++中的GetWindowRect,GetClientRect,ScreenToClient , ClientToScreen();

在VC++中,关于窗口位置的调整,移动,拉伸时总少不了获取控件所在的位置坐标区域, 所以 GetWindowRect,GetClientRect和ScreenToClient必不可少:    GetWindowRect()     得到的是在屏幕坐标系下的RECT(即以屏幕左上角为原点)。        GetClientRect()      得到的是在客户区坐标系下的RECT(即以所在

wangkechuang的专栏 6691

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

VC ScreenToClient与ClientToScreen

The ClientToScreen function replaces the client-area coordinates in the POINT structure with the screen coordinates. The screen coordinates are relative to the upper-left corner of the screen. Note

evil_119的专栏 1158

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

MFC ClientToScreen 和 ScreenToClient

ClientToScreen( )是把窗口坐标转换为屏幕坐标  ScreenToClient( )是把屏幕坐标转换为窗口坐标  屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗口用户区左上角的  VC下,有些函数使用窗口坐标,有些使用屏幕坐标,使用时要分清。      一个窗体分为两部分:系统区和客户区  象标题和菜单之类的是系统区,由系统来控制,客户区就是你的地盘喽!!!

闪落世间的专栏 4067

ClientToScreen 和 ScreenToClient

ClientToScreen( )是把窗口坐标转换为屏幕坐标ScreenToClient( )是把屏幕坐标转换为窗口坐标屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗口用户区左上角的VC下,有些函数使用窗口坐标,有些使用屏幕坐标,使用时要分清。一个窗体分为两部分:系统区和客户区象标题和菜单之类的是系统区,由系统来控制,客户区就是你的地

lovton的专栏 2179
上一篇: CListCtrl
下一篇: 关于FIFO之半满信号
heary29
博客等级 码龄12年 37粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值