void CZoomView::DrawLine (
CDC &dc,
const int &x1, // Logical units
const int &y1,
const int &x2,
const int &y2,
BOOL      xor)
{
CPen pen;
// Save the device context
dc.SaveDC();//把这一句和倒数第二句RestoreDC注释掉也可以同样实现功能,这两句起什么作用?
if (xor) {
dc.SetROP2(R2_NOTXORPEN);
pen.CreatePen(PS_DASH,  0, RGB(0, 0, 0)); // 0 width = 1 device unit
} else {
pen.CreatePen(PS_SOLID, 0, RGB(0, 0, 0)); // 0 width = 1 device unit
}
dc.SelectObject(&pen); // Draw the line
dc.MoveTo(x1, y1);
dc.LineTo(x2, y2);
// Clean up
dc.RestoreDC(-1);
} // DrawLine

解决方案 »

  1.   

    保存DC场景和恢复DC场景
    如果你这个画内容的过程比较复杂,需要调用多个函数才能画完整,那么你的CDC对象就会连续传递给多个函数。
    就你这段代码来说,如果不调用这两个函数,那么,其中的dc.SelectObject(&pen); 就会在这个函数内部修改dc的画笔。如果再用该DC到其它函数中绘制,那么这个画笔就未必是其它函数希望使用的。
    说白了,这对函数就是可以让你在独立的函数中保证CDC对象的属性不会被修改,这样多个绘图函数就不会造成相互影响了。
      

  2.   


    你说的画笔问题可以这样,
    CPen *old=dc.selectObject(&pen);
    用完了,再dc.selectObject(old);dc.RestoreDC()会不会把在dc上画的线擦掉呢?
      

  3.   

    怎么会擦掉呢?你都画完了才恢复场景的啊。它只是恢复DC的属性,而不是你画的内容阿。
    虽然pen你可以这样做,但你上面的代码中还调用了DC的SetROP2等函数,都会修改DC的画图属性,如果你愿意把所有的DC操作场景都进行向你写的pen那样逐个恢复,当然也可以了。
      

  4.   


    在dc上的做的动作能立即显示出来对吧?
    如dc.LineTo,只即在屏幕上显示出来了,不象内存dc那样,还要和dc.bitblt把内存dc的内容传递给dc才能显示出来,
    我这个理解对吧?