【VS开发】ClientToScreen 和ScreenToClient 用法
ClientToScreen( )是把窗口坐标转换为屏幕坐标
pWnd->GetClientRect(&rc1);是获取窗体中客户区的大小
屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗口用户区左上角的
VC下,有些函数使用窗口坐标,有些使用屏幕坐标,使用时要分清。
一个窗体分为两部分:系统区和客户区
象标题和菜单之类的是系统区,由系统来控制,客户区就是你的地盘喽!!!
Width, Height 是指整体的,ClientWidth, ClientHeight是指客户区的,两者相减就是
系统区的啦!!!
ClientToScreen是把坐标从当前窗体转化成全屏幕的!!!
ScreenToClient是把屏幕坐标转化成相对当前窗体的坐标!!!!
如果在Dialog类里面直接调ClientToScreen,那么获得的是该Dialog窗体左上角rect大小的一块空间相对于屏幕的rect。
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);
}
现在看来,闪烁似乎是由WM_ERASEBKGND消息产生的,事实上,的确与它有关。那WM_ERASEBKGND有干了什么呢?WM_ERASEBKGND消息由OnEraseBkgnd()消息处理函数响应,它的作用就是重绘客户区背景。我们可以通过向工程里添加WM_ERASEBKGND这个消息,然后在重写的消息处理函数中将返回语句修改为return
TRUE来屏蔽这一功能,这样做的好处是这时不会重绘背景了,坏处是这时背景也不会被擦出来。
好像还没有说到真实原因,其实真正的原因就隐含在其中。现在来做一个实验,分别尝试一下快速的眨眼和慢速的眨眼,你会发现快速眨眼时我们会感觉眼前的黑色一闪而过,而慢速眨眼时,则会觉得整个过程是连续的,没有什么异样。其实闪烁也就是这么回事,即多张不连续图像的快速切换。这里有三个条件,多张和快速和不连续,而且需要同时具备才会发生闪烁。如果只是两张,只会感觉到突变,还谈不上闪烁;如果频率慢的话,也相当于两张图像的情况了;最后如果是连续图像的话,那就像是看电影,平稳的过渡也不会让人觉得不适。
知道了这些,接下来就可以做决策了。
解决方案:
使用Invalidate(FALSE),添加WM_ERASEBKGND消息处理函数或者局部刷新三者选其一,都是可以解决问题的。它们的都是通过除去图像不连续这一因素来达到目的的。
另外,要说的是GDI的BitBlt()函数是及其高效的,一次操作所需要的时间只有几到十几个微秒,所以我们可以放心的使用它,而不用担心任何效率问题。不过相对于BitBlt()来说StretchBlt()就要慢的多,大概是几十倍的差别。
还有就是一般的绘图工作都是先绘制在一个缓冲区上,然后再一次拷贝到屏幕上。
有时,当我们需要利用闪烁的效果的话,也是可以通过多张图像的快速切换来做到,在这里我们也将两张图像的重复切换理解为多张图像。
【VS开发】ClientToScreen 和ScreenToClient 用法的更多相关文章
- ClientToScreen 和ScreenToClient 用法
ClientToScreen( )是把窗口坐标转换为屏幕坐标 ScreenToClient( )是把屏幕坐标转换为窗口坐标 屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗口用户区左上角的 VC下, ...
- 初学安卓开发随笔之 Intent 用法
首先,对于安卓开发,目前世界上流行的是使用的是Android studio 2.0 .(hh 学着来呗 书上说用这个,,) 今后就定一个计划 每天更新一个Android 随笔,增强一下自控力吧!!! ...
- 主机管理+堡垒机系统开发:strace命令用法详解(六)
一.简单介绍 strace是什么? 按照strace官网的描述, strace是一个可用于诊断.调试和教学的Linux用户空间跟踪器.我们用它来监控用户空间进程和内核的交互,比如系统调用.信号传递.进 ...
- 坐标的相对转换ClientToScreen与ScreenToClient
假如一个有一个TEdit的实例edt_Position,edt_Position所在容器有好几层,所在的窗体为frmMain.现要弹出一个FORM,FORM的容器为frmMain,弹出的位置在edt_ ...
- ASP.NET在实际开发中验证码的用法
在网上有看到很多关于验证码的代码,很多都只是生成一张验证码图片,然而在实际登陆验证模块,验证码要怎么添加进去或者说怎么运用.和实际项目开发中要怎么使用验证码,我自己总结了几点. 一.在实际开发登陆模块 ...
- ORACLE PL/SQL开发--bulk collect的用法 .
刚刚在inthirties老大的博客里看到这篇文章,写的不错,正好自己最近在学习PL/SQL,转过来学习学习. ============================================ ...
- js模块化开发——require.js的用法详细介绍(含jsonp)
RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签脚本加载步骤.可以用它回事.优化代码,但其主要的目的还是为了代码的模块化.它鼓励在使用脚本以moudle ...
- WordPress主题开发:WP_Query基本用法
为什么要学WP_Query? wordpress默认会根据网址调用数据,不能满足我们所有建站要求,而WP_Query可以用于查询任何你想要的内容,相当于自定义数据调用. 便于记忆,在讲用法之前我们回顾 ...
- odoo 开发 context 上下文的用法
context 这是一个上下文,运用很灵活 得到整个context self.context_get() self.env['res.users'].context_get() 得到cont ...
随机推荐
- 洛谷 P1147 连续自然数和 题解
P1147 连续自然数和 题目描述 对一个给定的自然数MM,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为MM. 例子:1998+1999+2000+2001+2002 = 100001 ...
- P1894 [USACO4.2]完美的牛栏The Perfect Stall
题目描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在 ...
- nginx+uwsgi+python3+pipenv+mysql+redis部署django程序
1.下载项目 git clone https://github.com/wangyitao/MyBlogs.git 2.进入Myblogs目录 cd MyBlogs 3.创建虚拟环境并且安装依赖 pi ...
- (16)打鸡儿教你Vue.js
博客: Hexo搭建个性博客 https://hexo.io/zh-cn/ 快速.简洁且高效的博客框架 超快速度 Node.js 所带来的超快生成速度,让上百个页面在几秒内瞬间完成渲染. 支持 Mar ...
- 《挑战30天C++入门极限》 对C++中引用的补充说明(实例)
对C++中引用的补充说明(实例) #include <iostream> #include <string> using namespace std; ...
- C Primer Plus--C存储类、链接和内存管理之动态分配内存及类型限定词
目录 存储类说明符 存储类和函数 动态分配内存 malloc函数 free函数 calloc函数 动态分配内存的缺点 C类型限定关键字 constant定义全局常量 volatile关键字 restr ...
- python 链表的反转
code #!/usr/bin/python # -*- coding: utf- -*- class ListNode: def __init__(self,x): self.val=x self. ...
- IDEA中新建子模块
在IDEA中新建子模块简单步骤: 找到父模块 ->new Module ,然后: next之后,输入ArtifactId: next之后,再输入子模块名,其中,要注意,在contentRoot和 ...
- cmake和json安装
一.cmake源码安装 官网下载源码:https://cmake.org/download/ 安装: ./bootstrap make make install cmake --version 二.j ...
- SELECT INTO (insert into) 和 INSERT INTO SELECT (insert into select) 两种表复制语句
1.INSERT INTO SELECT语句 语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from T ...