基础知识
MFC 绘图坐标系学习
1、坐标系及其定义
主要为三个坐标系:窗口坐标系、客户区坐标系、屏幕坐标系
窗口坐标系: 以对话框窗口左上角为坐标原点,包括窗口的标题栏、菜单栏、工具栏等。
客户区坐标系: 客户区坐标都必须有一个客户对象,是以客户对象左上角为坐标原点。
客户对象可以为一个对话框窗口的客户区,也可是某个控件的区域。
屏幕坐标系: 以电脑屏幕左上角为坐标原点,是一个绝对坐标。
2、不同坐标系坐标转换
坐标系可以相互转换。 如: CPoint point;
2-1 屏幕坐标系转化为客户区坐标系
this->ScreenToClient(&point);(将屏幕坐标系下的点point转换为this客户区坐标系下的点)
mPicViemStatic.ScreenToClient(&point)(将屏幕坐标系下的点point转换为mPicViemStatic客户区坐标系下的点)
2-2 客户区坐标转屏幕 坐标系
this->ClientToScreen(&point) (将this客户区坐标系下的点point转换为屏幕坐标系下的点)
mPicViemStatic.ClientToScreen(&point) (将mPicViemStatic客户区坐标系下的点point转换为屏幕坐标系下的点)
2-3 不同客户区坐标转换
需要通过屏幕坐标进行中间转换:
this->ClientToScreen(&point);(首先将this客户区坐标系下的点 point转换为屏幕坐标系下的迪昂),
mPicViemStatic.ScreenToClient(&point);(而后将屏幕坐标系下的点point转换为mPicViemStatic客户区坐标系下的点)
最终得到的point为mPicViemStatic客户区坐标系点
3、 常见获得屏幕坐标方式:
BOOL GetCursorPos(__out LPPOINT lpPoint); //获取当前鼠标屏幕坐标
BOOL GetWindowRect(LPRECT lpRect ) const throw(); //如果是在对话框类上用时,lpRect的左上点为窗口最上边,包含窗口的标题栏、菜单栏、工具栏
mPicViemStatic.GetWindowRect(LPRECT lpRect ); //获取控件mPicViemStatic矩形的屏幕坐标
4、 常见获取客户区坐标方法:
BOOL GetClientRect(__out LPRECT lpRect); //获取当前客户区矩形
在鼠标事件响应函数中CPoint point为客户区坐标,如:
OnMouseMove(UINT nFlags, CPoint point);
OnLButtonUp(UINT nFlags, CPoint point);
OnLButtonDown(UINT nFlags, CPoint point);
至于是那个客户区,看消息定义在哪里。如果是对话框类的消息,则为对话框窗口的客户区。
5、MFC绘图时GetDC()一定确认在那个客户区DC上画
如 CDC *pDC = mColorPicStatic.GetDC(); 表示绘图是按mColorPicStatic客户区坐标系绘制的。
CDC *pDC = GetDC();表示在this客户区坐标系绘图。
————————————————
版权声明:本文为CSDN博主「白白皎皎」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_20828983/article/details/52275127