MFC的几个基本问题总结


坐标问题

Dc的函数都是逻辑坐标,最终显示的坐标都是设备坐标。

 

OnMouseMove(UINT nFlags, CPoint point) 这里面的坐标值是 设备坐标

(1)

CRect rect(0, 0, 200, 200);

dc.rectangle(rect);

上面的语句在屏幕的最左上角绘制一个正方形;(因为此时逻辑坐标与设备坐标没有偏移)

(2)

dc.SetViewportOrg(100, 100);   //设置设备坐标(视口)原点

CRect rect(0, 0, 200, 200);

dc.rectangle(rect);

最终我们在显示器上看到的会是一个向右下方偏移(100, 100)的一个边长为200的正方形

因为公式为 X-窗口坐标原点)*比例因子+视口坐标原点

因为这里没有比例因子转换,所以公式就是: x – 逻辑坐标原点 + 设备坐标原点。

0 – 0 + 100 = 100 为最终显示的设备坐标位置

 

(3)

dc.SetWindowOrg(100, 100); //设置窗口(逻辑坐标)原点位置

CRect rect(0, 0, 200, 200);

dc.rectangle(rect);

最终我们在显示器上看到的会是一个只有1/4个大小的矩形的一部分(事实上相当于向左上方偏移(100, 100)的一个边长为200的正方形

同理 0 – 100 + 0 = -100

 

 

单文档,当没有按下滚动条时,逻辑坐标和设备坐标是在同一点(0.0)当下拉滚动条的时候,逻辑坐标一直还是0,0但是设备坐标是相对于VIEW的左上角,这样就会变成(0,-150)的形式。 所以如果这时我们在view上按一下,点击事件是保存的逻辑坐标,架设我们保存的200,200 这样我们重绘的时候要把屏幕的逻辑坐标变为设备坐标,公式就是 :设备坐标y=200-0+(-150)=50 也就是说真正画图的位置是在设备坐标 200,50 了(其实这个200.50 就和逻辑坐标200.50是一样的,想想是不是??)。   注意:如果不重绘,就不会调用一个系统函数去计算设备坐标原点值,这样设备坐标还是等于逻辑坐标都为0,0

消息问题

Sdk 注册窗口类,注册窗口,设置消息响应函数,启动消息队列。

一个MFC程序就只有一个消息处理函数,也就是说一个MFC中所有的窗口(例如单文档中的cview,点击出来的对话框)都是用同一个消息处理函数WindowPro来处理的。(但是事实上,每个窗口都可以有一个自己的窗口处理函数)

MFC程序在开始的时候就只有一个主线程,主线程里会启动消息队列(只运行一次,也就是MFC也只有一个消息队列,一个线程也只能处理一个消息队列)

原文地址:https://www.cnblogs.com/SuperXJ/p/1575261.html