SelectObject一般是这样使用的:void CMy10View::OnDraw(CDC* pDC) 
{
    CPen Pen( PS_SOLID, 1, RGB( 255, 0, 0 ) );
 
 CPen* pOldPen;
 pOldPen = pDC->SelectObject( &Pen );
 ......
}     我在想视图区在重绘时不停的构建画笔,选进设备环境,删除画笔,这样是不是有点低效。我设想能不能在创建窗口成功后就把画笔选进设备环境,然后在销毁窗口之前删除画笔。但是我试了一下,似乎不行。难道非得在OnDraw函数里写吗?

解决方案 »

  1.   

    可以把其作为类的变量,构造函数中创建,在析构函数在销毁。建议看看CXPbutton这些更高级的类中,会出现类似的方式的。
      

  2.   


         兄弟,我试过了。还是必须在OnDraw里选进设备环境的。
      

  3.   


        你是说自定一个CMyDC类,继承自CDC类,构造函数中创建,在析构函数在销毁。这和在OnDraw函数里选进设备环境有什么区别呢?
      

  4.   

    那就建个内存DC 充当虚拟窗口,在OnDraw里直接bitblt显示即可
      

  5.   

    原则上每次绘图时都需要通过SelectObject将Pen设置到设备环境,除非你的设备环境完全由你自己维护,否则就有可能由其它过程改变你的设备环境,也就是说在你没有处理的时候其它过程在设备环境中设置了Pen,那你再在设备环境绘图时就不再是你的Pen了,要么像楼上所说,创建一个完全由自己维护的缓冲DC,那样就不需要每次绘图都调用SelectObject了,而只需要再绘图后或者OnDraw中将你的缓冲DC贴到目标DC上就行了
      

  6.   

    注册类时用CS_OWNDC风格就可以让每个窗口都有自己的DC,而不是大家共用
    CS_OWNDC Allocates a unique device context for each window in the class.