invalidateRect

    当需要更新窗口的时候可以使用Invalidate()来重绘整个窗口,但是重绘整个窗口计算量是很大的,这会导致屏幕出现闪烁,为了防止这种情况,可以用InvalidateRect()来替代Invalidate(),毕竟计算一个矩形里面要绘制的内容计算量会要小很多。
函数原型:
BOOL InvalidateRect(
 HWND hWnd, //需要重绘的窗口的句柄
 LPCRECT lpRect, //要重绘的矩形区域
 BOOL bErase = TRUE //重绘矩形的方式。
);
    InvalidateRect()的第一个参数是需要重绘的窗口的句柄,但是似乎在CView类及它的派生类中可以不要填写,第二个参数是一个CRect矩形类,矩形的坐标必须是逻辑坐标。第三个参数是重绘矩形的方式,为FALSE是重绘传入的矩形,为TRUE的时候似乎是重绘整个窗口。

关于逻辑坐标(LP - Logical Point)和设备坐标(DP – Device Point)
    对于屏幕,逻辑坐标的原点在最左下角,让整个屏幕在坐标轴的第一象限。设备坐标是在输出设备上定点绘制图形对象是用的,它采用笛卡尔坐标系,原点在屏幕的最左上角,x轴的值自左向右增加,y轴自右向左增加,单位为像素(设备单位)。另外设备坐标是绝对的,逻辑坐标是相对的,可以根据窗口的位置变化来变化的,引用逻辑坐标,就是为了更加直观的来表示屏幕的坐标。还有一种物理坐标,实际上就是设备坐标。

关于逻辑坐标和设备坐标的转换
逻辑坐标转换成设备坐标的函数:
函数原型:
BOOL LptoDP(
 LPPOINT lpPoints, 指向POINT结构数组的指针,每一个POINT结构中的X坐标和Y坐标将被转换
 int nCount, //指定数组中点的数目,不写则为1
 HDC hdc //指向设备环境的句柄。我在写程序的时候,似乎没有写哦,不过也通过了,会不会又是因为写在了CView类里面的原因呢?
);
    如果函数调用成功,返回值为非零值。否则为零。
使用:
CPoint pt(0, 0);
pDC->LPtoDP(&pt);

逻辑坐标转换成设备坐标的函数:
函数原型:
BOOL DptoLP(
 HDC hdc, //指向设备环境的句柄。还是没有写过……-_-!!!...
 LPPOINT lpPoints, //指向POINT结构数组的指针,每个POINT结构中的X和Y坐标将被转换
 int nCount, //规定数组中点的数目,不写则为1
);
    如果函数调用成功,返回值为非零值。否则为零。
使用:
CPoint pt(0, 0);
pDC->DPtoLP(&pt);
    注意,里面接的参数不是矩形,而是CPoint类。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值